mycat - 知识总结

主从原理

mycat - 知识总结_第1张图片
若开启半同步复制,超过10秒(默认)没有收到ACK确认消息,会改变为异步复制。MySQL默认是异步复制。

典型的分片规则

  1. 按照用户ID求模,将数据分散到不同的数据库,具有相同数据用户的数 据都被分散到一个库中。
  2. 按照日期,将不同月甚至日的数据分散到不同的库中。
  3. 按照某个特定的字段求摸,或者根据特定范围段分散到不同的库中。

数据切分带来的核心问题

  1. 引入分布式事务的问题;
  2. 跨节点 Join 的问题;
  3. 跨节点合并排序分页问题

演示

非分片
mycat - 知识总结_第2张图片
分表
mycat - 知识总结_第3张图片
分库
mycat - 知识总结_第4张图片

分片规则

1. 分片枚举

通过在配置文件中配置可能的枚举id,自己配置分片,本规则适用于特定的场景,比如有些业务需要按照省份或区县来做保存,不同的省份存到不同的数据节点。

2. 固定分片hash算法

本条规则类似于十进制的求模运算,区别在于是二进制的操作,是取id的二进制低10位,即id二进制&1111111111。 此算法的优点在于如果按照10进制取模运算,在连续插入1-10时候1-10会被分到1-10个分片,增大了插入的事务 控制难度,而此算法根据二进制则可能会分到连续的分片,减少插入事务事务控制难度

3. 范围约定

此分片适用于,提前规划好分片字段某个范围属于哪个分片

4. 按日期(天)分片

此规则为按天分片

5. 一致性hash

数据均匀分布,不出现数据倾斜的情况。
mycat - 知识总结_第5张图片

ER分片表

在mycat ER分片表,需要满足几个特点
1、表和表之间存在主从关系
2、存在外键关联

比如:订单表和订单明细表
t_order,t_order_detail
这种就需要把存在关联关系的id存储到
同一个分片节点里面

相应的配置:

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200629170154375.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FuZHlfSGVhbHRo,size_16,color_FFFFFF,t_70) select b.* from t_order a join t_order_detail b on a.orderId=b.orderId;

数据扩容

1、新建用于扩容的newSchema.xml和newRule.xml文件
这两个文件是扩容以后的分片节点配置

2、修改dataMigrate.sh文件
该文件类型是dos的,需要修改为unix类型
查看.sh文件类型::set ff
修改.sh文件类型::set ff=unix 回车

3、修改dataMigrate.sh中的配置
基本上修改一个即可:
#mysql bin路径
RUN_CMD="$RUN_CMD -mysqlBin=/usr/bin"
这个是mysqldump文件的路径,
找该文件:find / -name mysqldump

4、修改migrateTables.properties配置文件,指定需要迁移的逻辑库和表

注意事项
1、jdk不能用openJdk,需要自己安装,配置环境变量
2、之前的老的schema.xml和rule.xml老配置不能动
3、新增迁移后的节点新配置newSchema.xml和newRule.xml
4、mycat bug migrateTables.properties中逻辑库的名称不能既有大些又有小写,如:enjoyDB,必须全小写或全大写。
5、迁移类:DataMigrator

mycat 分布式事务

XA 协议
在mysql实例中开启一个XA事务,指定一个全局唯一标识

XA START ‘any_unique_id’;
Insert
XA事务的操作结束
XA END ‘any_unique_id’;
告知mysql准备提交这个xa事务
XA PREPARE ‘any_unique_id’;
告知mysql提交这个 xa事务
XA COMMIT ‘any_unique_id’;
告知mysql回滚这个 xa事务;
XA ROLLBACK ‘any_unique_id’;
查看本机mysql目前有哪些xa事务处于prepare状态;
XA RECOVER;
mycat - 知识总结_第6张图片
mycat - 知识总结_第7张图片

XA 协议的特点

  1. 同一个会话(同一个用户)跟普通是互斥的
  2. 有隔离性
    mycat - 知识总结_第8张图片
  3. xa prepare xid 有返回值
    xa prepare xid

xa start xid1
Connection1.execulte(xa start xid1
)
Connection1.insert()
Connection1.end;

Connection2.。。。。

Result1 = Connection1.prepare()
Result2 = Conneciont2.prepare();

TM
If(ALLOK) {
connection1.commit;
connection2.commit;
} else {
Connection1.rollback;
Connection2.rollback;
}

xxDatasource implment dataSouce {
Pri dataSOuce datasource;

getconnection() { 
	Xa start xx; 
	Return datasource.getConnect();
}

}

Mybatis jpa
connection.createPrepareStatement.

你可能感兴趣的:(mycat)