简介
MyCat是一个实现了MySQL协议的Server,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而后端可以用MySQL原生协议或JDBC协议与多个MySQL服务器通信
其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器或其他数据库里
核心功能
对于DBA
Mycat就是MySQL_Server,但是MySQL本身不存储数据,数据是在后端MySQL上存储的
数据的可靠性以及事务都是MySQL保证的
对于软件工程师
MyCat是一个近似等于MySQL的数据库服务器
可以用连接MySQL的方式去连接MyCat(默认端口8066)
大多数情况下,可以用熟悉的ORM框架使用Mycat,但建议对于分片表,尽量使用基础的SQL语句,因为这样能达到最佳性能
对于架构师
MyCat是一个强大的数据库中间件,不仅仅可以用作读写分离、分库分表、容灾备份,而且可以用于多租户应用开发、云平台基础设施、让架构具备很强的适应性和灵活性
借助于即将发布的Mycat智能优化模块,系统的数据访问瓶颈和热点一目了然,根据这些统计分析数据,可以自动或手工调整后端存储,将不同的表映射到不同存储引擎上,而整个应用代码无需修改
核心概念
逻辑库
对数据进行分片处理后,从原有的一个库,被切分为多个分片数据库,所有的分片数据库集群构成了整个数据库存储
MyCat在操作时,使用逻辑库来代表这个完整的数据库集群,便于对整个集群操作
逻辑表
分布式数据库中,对应用来说,读写数据的表就是逻辑表
分片表
指那些原有的很大数据的表,需要切分到多个数据库的表
每个分片都有一部分数据,所有分片构成了完整的数据
非分片表
一个数据库中并非所有的表都很大,某些表是不用进行切分的
非分片就是相对分片表来说的,即那些不需要进行数据切分的表
ER表
Mycat提出了基于E-R关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上,即子表依赖于父表,通过表分组保证数据join不会跨库操作
表分组是解决跨分片数据join的一种很好的思路,也是数据切分规划的一条重要规则
全局表
一个真实业务系统中,往往存在大量的类似字典表,这些表很少变动
特性
变动不频繁
数据量总体变化不大
数据规模不大,很少超过数十万条
对于这类表,在分片的情况下,业务表与这些字典表之间关联成为棘手问题
Mycat通过数据冗余来解决这类表的join
所有的分片都有一个数据的拷贝
数据冗余是解决跨分片数据join的一种很好的思路,也是数据切分规划的另一条重要规则
分片节点
数据切分后,一个大表被分到不同的分片数据库上,每个表分片所在的数据库就是分片节点dataNode
节点主机
数据切分后,每个分片节点不一定独占一台机器,同一机器上可以有多个分片数据库,这样一个或多个分片节点所在的机器就是节点主机
为了规避单节点主机并发数限制,尽量将读写压力高的分片节点均衡的放在不同的节点主机
分片规则
一个大表被分为若干个分片表,就需要一定的规则rule,这样按照某种业务规则把数据分到某个分片的规则就是分片规则
数据切分选择合适的分片规则非常重要,将极大的避免后续数据处理的难度
Server.xml配置
user标签
主要用于定义登录mycat的用户和权限
全局序列号
Mycat提供了全局sequence,且提供了包含本地配置和数据库配置等多种实现方式
system.sequnceHandlerType
0:表示使用本地文件方式
此方式将sequence配置到文件中,当使用到sequence中的配置后,Mycat会更新sequence_conf.properties文件中sequence当前的值
1:表示使用数据库方式生成
在数据库中建立一张表,存放sequence名称(name),当前值(current_value),步长(increment)等信息
2:表示使用本地时间戳方式
ID为64位二进制,42(毫秒)+5(机器ID)+5(业务编码)+12(重复累积)
换算成十进制为18位的long类型,每毫秒可以并发12位二进制的累加
在Mycat下配置sequence_time_conf.properties
每个Mycat配置的WORKID、DATAACENTERID不同,组成唯一标识,总共支持1014种组合
3:表示基于ZK和本地配置的分布式ID生成器
Zk的连接信息统一在myid.properties的zkURL属性中配置
InstanceID可以通过ZK自动获取,也可以通过配置文件配置
在sequence_distributed_conf.properties,只要配置INSTANCEID=ZK就表示从ZK上获取InstanceID
ID最大为63位二进制
current time millis:微妙时间戳38位
clusterId:机房或ZKid,5位,通过配置文件配置
instanceId:实例ID,5位,可以通过ZK或配置文件获取
threadId:线程ID,9位
increment:自增,6位
4:表示使用Zk递增方式生成
Zk的连接信息统一在myid.properties的zkURL属性中配置
还需要配置sequence_conf.properties
schema.xml配置
schema.xml作为Mycat中重要的配置文件之一,管理着Mycat的逻辑库、表、分片节点等信息
schema标签
用于定义Mycat实例中的逻辑库,Mycat可以有多个逻辑库,每个逻辑库都有自己的相关配置
使用schema标签来划分这些不同的逻辑库
table标签
定义了Mycat中的逻辑表,所有需要拆分的表都需要在这个标签中定义
属性
needAddLimit
是否为查询SQL自动加limit限制
dataNode标签
定义了Mycat中的分片节点,即通常所说的数据分片
属性
name
定义数据节点的名字,需要是唯一的
在table标签上应用此名字,来建立表与分片对应的关系
dataHost
用于定义该分片属于哪个分片主机
值引用dataHost标签的name属性
database
用于定义该分片节点属于哪个具体的库
dataHost标签
在Mycat逻辑库中作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句
属性
balance
读操作负载均衡类型
0:不开启读写分离,所有读操作都发生在当前writeHost上
1:所有读操作随机发送到当前writeHost对应的readHost和备用writeHost上
2:所有读操作随机发送到所有的writeHost、readHost上
3.:所有读操作都只发送到writeHost的readHost上
writeType
写操作负载均衡类型
0:所有写操作都发送到可用的writeHost上
1:所有写操作都随机发送到readHost
2:所有写操作都随机在writeHost、readHost上分发
switchType
主从切换类型
-1:不自动切换
1:默认,自动切换
2:基于MySQL主从同步状态决定是否切换,心跳语句必须为show slave status
3:基于MySQL galary cluster的切换机制(适合集群),心跳语句必须为show status like ‘wsrep%’
heartbeat标签
指明用于和后端数据库进行心跳检查的语句
如:MySQL可以使用select user(),Orable可以使用Select 1 from dual
writeHost和readHost标签
都指定后端数据的相关配置给Mycat,用于实例化后端连接池
writeHost指定写实例,readHost指定读实例
一个dataHost内可以定义多个writeHost/readHost
如果writeHost指定的后端数据库宕机,则这个writeHost绑定的所有readHost将都不可用
writeHost宕机,系统会自动检测到,并切换至备用的wirteHost
实战
安装
下载,解压
进入mycat/bin,启动mycat
window系统下,需要使用 mycat install先安装服务
访问mycat
mysql -uroot -proot -h127.0.0.1 -P8066
启动时报 -Xmx4G 错误,需要在wrapper.conf修改对应配置,符合当前系统的情况
使用MySQL8以上,由于默认加密方式不支持,需要通过附加--default_auto=mysql_native_password参数登录
分库分表
配置rule.xml
常用分片规则分类
哈希类
Hash固定分片、日期范围Hash分片、截取数字Hash求模范围分片、截取数字Hash分片、一致性Hash分片
其他类
枚举分片、范围约定分片、应用指定分片、冷热数据分片
读写分离
在schema.xml中配置Mycat读写分离
使用前需要搭建MySQL主从架构,并实现主从复制,MyCat不负责数据同步问题
强制路由
一个查询SQL语句以/*!mycat:db_type=master|slave*/注解来确定其是走读节点还是写节点
1.6以后Mycat除了支持db_type注解外,还支持
:catlet
通过catlet支持跨分片复杂SQL实现以及存储过程支持等
主从延时切换
1.4开始支持MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠
配置
heartbeat:show slave status
switchType:2
slaveThreshold:100
此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制
Mycat心跳机制通过检测slave_stauts的“Second_Behind_Master”、"Slave_IO_Running"、"Slave_SQL_Running"
1. 来确定当前主从同步的状态
2. Seconds_Behind_Master主从复制时延
Seconds_Behind_Master>slaveThreshold,读写分离筛选器会过滤掉此Slave,防止读到很久之前的旧数据
而主节点宕机后,切换逻辑会检查Slave上的Seconds_Behind_Master是否为0,为0则表示主从同步,可以安全切换,否则不会切换
1.4.1开始支持MySQL集群模式,让读更加安全可靠
配置
heartbeat:show status like 'wsrep%'
switchType:3
此时意味着开启MySQL集群复制状态绑定的读写分离与切换机制
MyCat心跳机制通过检测集群复制时延,如果时延过大或节点出现问题不会负载该节点
事务
简介
Mycat目前没有出来跨分片的事务强一致性支持,单库内部可以保证事务的完整性,如果跨库事务在执行时任何分片出错,可以保证所有分片回滚
一旦应用发起commit指令,无法保证所有分片都成功,所以称为弱XA
XA事务
Mycat从1.6.5开始支持标准XA分布式事务,考虑到MySQL5.7之前XA有bug,所以推荐最佳搭配XA功能使用MySQL5.7版本
MyCat实现XA标准分布式事务,作为XA事务协调者角色
即使事务过程中Mycat宕机,由于Mycat会记录事务日志,所以Mycat恢复后会进行事务的善后处理工作
考虑到分布式事务性能开销比较大,所以只推荐在全局表的事务以及其他一些对一致性要求比较高的场景
操作说明
XA事务需要设置手动提交
set autocommit=0;
执行相应的SQL语句
提交或回滚事务
commit;
rollback;
RR事务隔离级别
Mycat有一个特性,就是开事务之后,如果不运行update/delete/select for update等更新类语句SQL的话,不会将当前连接与当前Session绑定
这么做的好处是可以保证连接可以最大限度的复用,提升性能
但是,这会导致两次select中如果有其它的提交SQL,会出现两次同样的select不一致的现象,即不能RR
Mycat做了一个开关,当server.xml的system配置了strictTxIsolcation=true时,会关掉这个特性,以保证RR