mycat官网
3,Mycat中的概念
数据库中间件;介于应用与数据库之间,进行数据处理与交互的中间服务。数据库路由,结果封装处理。
逻辑库;数据库中间件可被看作一个或多个数据库集群构成的逻辑库。
逻辑表;逻辑库中的表,分片表、非分片表、ER表(表分组)、全局表(表冗余)。
分片节点;分片表所在数据库。
节点主机;数据库主机。
分片规则;表切分规则。
全局序列号;全局唯一性标识。
多租户;多租户技术,多重租赁技术。多用户环境下共用相同的系统或程序组件,并保证用户间数据隔离。方案:独立数据库、共享数据库隔离数据架构(schema)、共享数据库数据架构(tenantId)。
4,快速入门
下载地址:http://dl.mycat.io/
解压后,运行./bin/startup_nowrap.bat;连接:mysql -uroot -p123456 -P8066 -h127.0.0.1
安装与配置
源码:https://github.com/MyCATApache/Mycat-Server.git
配置文件
- ./conf/server.xml;用户及系统变量
- ./conf/schema.xml;节点主机、分片节点、逻辑库、逻辑表
- ./conf/rule.xml;分片规则、规则函数
源码运行,配置vm参数:-DMYCAT_HOME=projectPath/src/main
6 Mycat防火墙配置
<firewall>
<whitehost>
配置允许访问的主机
<host user="mycat" host="127.0.0.1"></host>
</whitehost>
<blacklist check="true">
配置拦截属性,校验sql操作
<property name="selelctAllow">false</property>
</blacklist>
</firewall>
7 Mycat配置
schema.xml
管理逻辑库、逻辑表、分片节点、节点主机配置。
配置详解:https://blog.csdn.net/webnum/article/details/88821218
schema标签
定义逻辑库;属性:
- name;逻辑库名
- dataNode;绑定分片,未配置的逻辑表查询绑定分片。绑定后可跨域查询。
- checkSQLschema;删除逻辑库名
- sqlMaxLimit;默认最大记录数;逻辑库为非拆分库时无效。
table标签
定义逻辑表;属性:
- name;逻辑表名
- dataNode;逻辑表所属的dataNode。
- rule;rule.xml中分片规则名
- ruleRequired;true时必须绑定分片规则
- primaryKey;主键
- type;逻辑表类型。全局表(type=“global”)、普通表
- autoIncrement;主键自增,默认false
- subTables;分表规则。单库多表?
- needAddLimit;记录数限制,默认true。
childTable标签
定义ER分片表;属性:
- joinKey;子表关联属性名,确定父表所在dataNode
- parentKey;父表关联属性名
- name、primaryKey、needAddLimit;同上
dataNode标签
定义分片节点、数据分片;属性:
- name;分片节点名
- dataHost;dbms实例名
- database;具体数据库,schema
dataHost标签
定义DBMS实例组、读写分离、心跳配置;属性:
- name;dbms实例名
- maxCon、minCon;最大连接数、最小连接数
- balance、writeType;读操作负载均衡、写操作负载均衡
- dbType;数据库类型
- dbDriver;驱动类型,native(mysql)、JDBC。
- switchType;自动切换
- tempReadHostAvailable;
heartbeat标签
定义心跳语句;属性:
- connectionInitSql;初始化sql
- writeHost/readHost标签,定义读写实例;属性:
- host;实例名
- url、user、password;连接信息
- weight;读节点权重
- usingDecrypt;密码加密,默认0否。
server.xml
配置系统、用户信息。
user标签
定义用户;标签属性:name;用户名
常用property属性:password、schemas、readOnly
system标签
定义系统属性;property子标签。
rule.xml
tableRule标签
定义表规则;
- name属性;规则名
- columns子标签;路由列列名,如不匹配则广播
- algorithm子标签;路由算法
function标签
定义路由算法;
- name属性;算法名
- class属性;算法类
- property子标签;算法类参数
8 Mycat的分片join
mycat跨分片join实现方式:全局表、ER分片、catletT(人工智能)
全局表
字典类表格,定义为全局表。table属性:type=“global”
ER Join
Table Group,子表的存储位置依赖于主表,并在物理上紧邻存放。
table+childTable;joinKey、parentKey指定关联属性
Share Join
解析sql,拆分为单表执行;然后把各个节点的数据汇集起来。
直接进行join连接,按ER join执行。
格式:/!mycat:catlet=demo.catlets.ShareJoin/SQL
catlet(人工智能)
自定义处理逻辑。
9 全局序列号
全局唯一标记。system-sequenceHandlerType配置方式:
0本地文件、1数据库、2本地时间戳、3分布式zkID、4递增zk
server.xml
<system><property name="sequnceHandlerType">1</property></system>
总体两种方式:递增、时间戳。
本地文件方式
classpath:sequence_conf.properties,配置:
- GLOBAL_SEQ.HISIDS;历史分段
- GLOBAL_SEQ.MINID;最小值
- GLOBAL_SEQ.MAXID;最大值
- GLOBAL_SEQ.CURID;当前值
使用:insert into user (id,name) values (next value for MYCATSEQ_GLOBAL,‘lkk’)
数据库方式
读取数据库表,获取序列号;表字段:name、current_value、increment
本地时间戳方式
ID=64位二进制;42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)
每毫秒最多4096并发。
配置sequence_time_conf.properties:
- WORKID;0-31
- DATAACENTERID;0-31
分布式ZK ID生成器
规则类似本地时间戳
Zk递增方式
规则类似本地文件
10 Mycat分片规则
数据切分原则
数据冗余、table group
全局表
所有分片都持有表实例。
join时优先选择系统分片的全局表;数据更新时更新所有分片;select时随机选择分片。
ER分片表
表依赖,Table Group;子表与关联的父表放在同一分片,避免跨库。
多对多关联
表A–中间表–表B;按关系偏向表分片。
采用非主键分片时,mycat会缓存id–node。
Mycat常用分片规则
val转换:hash、取模
val–node映射:直接映射、范围映射
分片枚举
sharding-by-intfile
枚举值直接映射到节点;适用于分片字段值固定的情况,如地域。
固定分片hash算法
rule1
划分1024个槽位,分配给各分片,sum(partitionCount[i]partitionLength[i])=1024;取id二进制低10位,映射到对应分片。
算法类似redis集群寻址。
范围约定
auto-sharding-long
提前规划好分片字段范围–node映射。类似分片枚举。
取模
mod-long
批量插入时,增大事务一致性难度。
按日期分片
sharding-by-date
取模范围约束
sharding-by-pattern
取模运算和范围约束的结合;主要为后续数据迁移做准备。
一致性hash
sharding-by-murmur
解决分布式扩容问题。类似取模范围约束,对232取模;232个槽位,分配到节点数虚拟倍数个节点上。增删节点时,只有部分区间受影响。
https://blog.csdn.net/NewxCJY/article/details/82667097
…
权限控制
user标签,readOnly、schemas
进阶
1 读写分离
MySQL主从复制方案
主从、主从从、双主/多主(环)
原理
1,主库事务提交前记录日志
2,从库拉取主库日志,并按日志更新本地数据。
复制方式:基于sql语句SBR、基于行RBR、混合模式MBR
Mycat支持的读写分离
mycat不负责数据同步;
、;写节点、读节点,写节点宕机后对应读节点不可用。第一个writeHost为主节点,其余均为从节点。
事务内部的一切操作,都走写节点。故读操作不要加事务。
2 高可用与集群化
MySQL高可用方案
主从复制+读写分离;heartbeat+双主复制;集群;MariaDBM Galera
Mycat高可用方案
mycat将第一个writeHost当做主节点,所有DML发往此节点。
写节点宕机后,升级下一个writeHost为主节点。
建议使用mysql主从复制+心跳检测+读写分离方式,由mycat负责主从切换。
mycat+HAProxy,保证mycat高可用
3 事务支持
单库可保证事务完整性;跨库弱XA(异常时全部回滚,commit时不保证全部成功)。
XA事务原理
分布式事务处理(DTP)模型:
- AP;应用程序
- TM;事务管理器
- RM;资源管理器,一般为数据库
- CRM;通信资源管理器,消息中间件
XA,两段式提交;处理–提交。TM必须记录事务信息(XID、RM情况),在完全提交或回滚后才能丢弃。
XA事务问题和MySQL的局限
timeout问题,两段提交增加事务时间。慢。
使用最终一致性、幂等逻辑,避免使用XA事务。
XA提交前冲突,可能导致主从不一致。
4 Mycat SQL拦截机制
执行前拦截sql;默认拦截器实现了mysql转义字符替换。
自定义:
实现 SQLInterceptor,编译后放到catlet文件夹。
修改server.xml;sqlInterceptor、sqlInterceptorType、sqlInterceptorFIle等参数。
5 Mycat注解
mycat执行流程:拦截、解析路由。注解指定dataNode、dataHost、schema。
格式:
- /!mycat:注解表达式/SQL;前缀可为/!、/#、/**
- /balance/;强制从写节点查询数据。主节点?
使用:
- 为sql语句指定分片
/*mycat:sql=select 1 from test/CREATE PROCEDUREtest_proc
() BEGIN END ;
/*mycat:sql=select 1 from test/insert into user2 select * from user1 - 指定节点(读节点、写节点)
/balance/select * from user;强制从写节点查询
/#mycat:db_type=master/ select * from travelrecord;主节点查询
/#mycat:db_type=slave/ select * from travelrecord;从节点查询 - shareJoin,指定本分片join
/*!mycat:catlet=demo.catlets.ShareJoin / select a.,b.id, b.name as tit from customer a,company b on a.company_id=b.id; - 多租户支持,指定分片。
/*!mycat : schema = test_01 */ sql ;
6 Mycat支持的catlet实现
格式:/*mycat:catlet=classFullName/SQL
1,shareJoin,指定本分片join
/!mycat:catlet=demo.catlets.ShareJoin / select a.,b.id, b.name as tit from customer a,company b on a.company_id=b.id;
2,批量插入与ID自增长结合的支持
/!mycat:catlet=demo.catlets.BatchInsertSequence / insert into sam_test(name_)
values(‘ t1’ ),(‘ t2’ );
3,获取批量sequence值得支持
/!mycat:catlet=demo.catlets.BatchGetSequence */SELECT mycat_get_seq(‘ MYCAT_TEST’ ,100);
7 JDBC多数据库支持
dataHost,dbDriver改为jdbc,dbType改为对应数据库名,如:oracle、mongodb等。
导入驱动文件到bin文件夹。
8 管理命令与监控
默认连接:mysql -uroot -p123456 -P9066
show @@help;查看所有命令
9 压缩协议支持
需mycat、客户端、mysql(默认开启压缩)均开启压缩。
mycat在server.xml–system–useCompression,设为1。
客户端,mysql命令行加-C,jdbc加参数useCompression=true
10 Mycat-WEB
可视化监控,基于jrds实现。
- 下载安装zookeeper;修改./conf/zoo_sample.cfg为zoo.cfg;运行./bin/zkServer.cmd
- 下载解压mycat-web,https://github.com/MyCATApache/Mycat-download/tree/master/mycat-web-1.0;运行./start.bat
- 访问mycat-web,localhost:8082/mycat。添加mycat及其vm监控实例;jmx端口在./conf/wrapper.conf。jmx连接信息localhost:1984。
jmx需自行开启:-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1984 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
配置示例:https://blog.csdn.net/zhxdick/article/details/50728859