mycat 介绍及原理
mycat是基于java语言的数据库中间件,它遵守Mysql原生协议,是一个Mysql中间代理。
mycat工作原理:拦截用户发送的SQL语句,对SQL语句做一些特定的分析:分片分析,路由分析,读写分离分析,缓存分析等。然后将sql发往后端真实的数据库。
分库分表带来的一些问题
引入分布式事务;跨节点join问题;跨节点合并排序分页问题;多数据源问题
mycat 解决分库分表的方式
一、表关联Join问题
1. 子表的记录与所关联的父表记录存放在同一个数据分片上,即子表依赖于父表,通过表分组(Table Group) 保证数据Join不会跨库操作。
2. mycat全局表:全局表的插入、更新操作会实时在所有节点上执行,保持各个分片的数据一致性,全局表可以跟任何一个表进行 JOIN 操作,不产生跨库操作。
3. Share join : 目前支持2个表的join,原理是解析SQL语句,拆分成单表的SQL语句执行,然后把各个节点的数据汇集。这种就是产生跨库操作了。
二、查询:MyCat的路由结果是通过分片字段和分片方法来确定的。
1. 若查询条件中有分片字段,则直接路由给某个具体的分片
2. 若查询条件中么有分片字段,此时MyCat无法计算路由,会将查询发送到所有节点执行,然后返回结果并聚合。
三、分页排序:
纯limit:MyCat将查询分发给各个DB节点去执行。但Mycat响应结果取决于哪个DB节点最先返回结果给MyCat。
limit和排序:MyCat将查询分发给各个DB节点去执行。收到各个DB节点返回的结果后,对所有的结果进行最小堆运算。然后返回结果。
limit带偏移量和排序:
1. 对于有 limit m,n 的SQL语句,Mycat会对其进行改写,改写成 limit 0, m+n 来保证查询结果的逻辑正确性。 2. 然后将改写的SQL发给各个DB节点去执行。 3. 收到所有DB节点返回的结果后,对所有的结果进行最小堆运算。然后返回给前端用户 4. 缺点:及其耗费资源。对于K个DB节点,MyCat需要处理的数据量为(m+n)*t个。mycat不适合分页排序操作。
四、mycat事务实现
应用开启事务后,MyCat标识该连接为非自动提交
Mycat将后续的SQl通过非自动提交的连接去执行。
如果各个节点都执行成功,则MyCat给该连接标识为Prepare Ready状态。如果有一个节点执行失败,则标识为RollBack状态。
MyCat等待引用后续发送的commit或rollBack命令。对于commit命令:若当前连接为Prepare Ready状态,则讲commit命令发送给各个DB节点上。
如果一个DB在commit时故障,其他DB节点执行commit成功,mycat会一直等待故障DB节点返回结果一直到TIMEOUT。导致事务一致性被破坏。故Mycat事务是弱一致性的。
Mycat 的其他问题
1. 子查询出偶尔查询不到完整数据
select id,productName
from orderItem
where orderId in (
select id from order where userName = '张三'
)
2. 部分SQL语法不支持
insert into......select.....
update a, b set a.remark='备注' where a.id=b.id;
delete a from a join b on a.id=b.id;
3. 不支持存储过程创建和调用
https://segmentfault.com/a/1190000022694182
https://www.51cto.com/article/708988.html
标签:SQL,DB,MyCat,Mycat,分片,一些,mycat,节点 From: https://www.cnblogs.com/loquat6/p/17248510.html