首页 > 其他分享 >Mycat 的一些坑

Mycat 的一些坑

时间:2023-03-23 18:44:40浏览次数:32  
标签:SQL DB MyCat Mycat 分片 一些 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

标签:SQL,DB,MyCat,Mycat,分片,一些,mycat,节点
From: https://www.cnblogs.com/loquat6/p/17248510.html

相关文章

  • Stream流方法的一些简单练习题
    Stream流练习题1、数据过滤定义一个集合,并添加一些整数1,2,3,4,5,6,7,8,9,10过滤奇数,只留下偶数并将结果保存起来。/***@author戒爱学Java*@date2023/3/239:......
  • 对系统理论的一些认识
    系统的定义:一个有一组相互联系的要素构成的,能够实现某个目标的整体。创立时间:20世纪40年代左右,由贝塔朗菲提出“一般系统论‘’奠定了理论基础三大要素:要素、联系、功能......
  • Avalonia 11.0-preview6中的一些更新
    1.DirectProperty->StyledProperty有相当多的DirectProperty变成了StyledProperty,对于已经有的应用没用什么实质影响,但是此后有些本来不可以在Style中设置的属性也可以在......
  • jenkins jvm内存调整以及一些说明
    jenkins调整jvm内存有几个配置地方,比如通过/etc/sysconfig/jenkins以及通过直接修改systemd的服务定义(以centos来说)systemd配置/usr/lib/systemd/system/jenkins.s......
  • 2、Spring中的一些现象
    1、注入模型默认的注入模型:AbstractBeanDefinition.AUTOWIRE_NO=0通过构造方法注入1.1、setter方法名称注入模型AbstractBeanDefinition.AUTOWIRE_BY_NAME=11.1.1、现......
  • pushGateWay 遇到的一些问题
    遇到的两个问题1、发现通过pgw推送的metric在不继续推送监控数据时,prometheus仍然在更新数据2、通过pgw推送metric都被覆盖了 问题一的解决方式1)查看文档:https://pro......
  • 频域、S域、z域的一些公式
    常用的频域性质S域性质z域性质......
  • 你能谈谈数据库实现缓存最终一致性的一些方法吗?
    为什么需要缓存存储如mysql通常支持完整的ACID特性,因为可靠性,持久性等因素,性能普遍不高,高并发的查询会给mysql带来压力,造成数据库系统的不稳定。同时也容易产生延迟。根据......
  • JBPM5 配置得到两个Session和一些配置参考信息
    [color=red][b]配置得到StatefulKnowledgeSession[/b][/color]packagecom.v0610.basic.jbpm.example;importorg.drools.runtime.StatefulKnowledge......
  • 近期调研和使用 zeromq 与 cppzmq 的一些问题
    关于message消息分片消息分片的发送消息分片允许将多个消息封装成一条消息。在发送自定义协议数据时,我们经常需要在消息前“填充”一个包头。如下代码,在发送的时候加上......