Mycat 的一些坑

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

posted @ 2023-03-23 18:39  大枇杷  阅读(386)  评论(0编辑  收藏  举报