一、Mycat 的路由与分发流程
从原理上来看,可以把 mycat 看成一个 sql 转发器。mycat 接收到前端发来的 sql,然后转发到后台的 mysql 服务器上去执行。但是后面有很多台 mysql 节点(如 dn1,dn2,dn3),该转发到哪些节点呢?这就是路由解析该做的事情了。路由能保证 sql 转发到正确的节点。转发的范围是刚刚好,不多发也不少发。多发会出现两种问题:浪费性能和找不到表。比如一个 select * from orders where pro=‘wuhan’这个语句,只有 dn1 节点,能查到数据,如果将语句同时转发到 dn1、dn2、dn3 三个节点,这样的范围就多发了,性能上是一种浪费。如果新增了一个节点 dn4,但是 orders 的 datanode 范围只是 dn1,dn2,dn3,如果同时转发到 dn1、dn2、dn3、dn4 四个节点,则发到 dn4 执行时会返回 table orders not exists。少发则会出现结果集不全的问题,如 select * from orders 如果只转发到 dn1,只会返回 dn1 上的结果集,dn2、dn3 上的结果集得不到。
二、解析器之fdb parser VS druidparser
路由解析使用了策略模式,每种解析器实现一种路由策略。还可以继续扩展,如 Druid 解析再细分 Mysql、
postgresql、oracle 等实现策略。
解析器指的是 sql 解析器,mycat1.3 之前使用的解析器为 fdb parser(FoundationDB SQL Parser),从 1.3
开始引入 druid 解析器,从 1.4 开始去掉了 fdbparser,只保留 druidparser 方式。
druid 路由解析的两种方式
Druid 解析有两种方式:vistor 方式和 statement 方式。
三、路由计算的核心要素
1、sql 中包含的表名
2、sql 中包含的条件(Conditons),每个 Condition 是一个<表名、字段名、字段值>的 3 元组。
3、表对应的 schema。
4、表是否分片,如果分片,分片字段是什么?分片算法是什么?第 4 点的信息都可以根据第 3 条计算获得。
有以上一些数据就能计算出路由,所以路由计算需要解决以下问题:
从 sql 语句中提取出表名、条件(字段、字段所属表、字段值)。有了表名、条件,再根据表的分片规则就
可以计算出准确的路由了。
四、路由计算流程
1)单表路由计算流程
2)多表路由计算流程
3)全局表的路由计算
全局表 insert、update 语句:路由到所有节点。
全局表 select 语句:路由到任意一个节点。
4)or 语句问题解决方案思想—等价替换
解决 or 语句的路由的基本思想是等价替换。
1、使用 union 语句拆分 or 语句的等价替换
这个等价替换应该是大家都知道的
Select * from travelrecord where id = 1 or id = 5000001 等价于以下语句:
Select * from travelrecord where id = 1 unioin Select * from travelrecord where id = 5000001
2、Union 语句的结果集并集 等价于路由的并集
这个等价没有明确的理论基础,但是我们可以反证法证明:
如果路由集合不同,那么结果集必然不同,所以结果集相同,路由集合必然相同。
Select * from travelrecord where id = 1 or id = 5000001 的路由集合
等价于 Select * from travelrecord where id = 1 的路由集合与 Select * from travelrecord where id =
5000001 的路由集合的并集。
最终演变成对 Select * from travelrecord where id = 1 和 Select * from travelrecord where id =
5000001 两个语句分别求路由,然后取并集。
相关推荐
linux下安装mycat1.6.7.5需要的安装文件,包含jdk1.8与mycat1.6.7.5的安装文件,安装mycat1.6.7.5前需要先安装jdk1.8
NULL 博文链接:https://gaojingsong.iteye.com/blog/2371403
mycat1.6源码资源,mycat1.6源码资源,mycat1.6源码资源,
mycat1.6windows+linux.zip, 我就很不理解,为什么好多人上传的资料,下载都需要积分。0积分能咋地?官网能访问但是下载不了,后再巧合下在另外一个网站上下载的,我在这里给大家分享下。不需要积分也不需要花钱,...
17年mycat 1.6权威指南 pdf版 477页及mycat 1.5 word版 279页
mycat1.6.7.1版本,linux版本,可以下载解压后直接使用。Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz
MySql 中间件 Mycat 1.6.7.5 windows.tar 程序 windows 环境程序,MySql 读写分离,分库分表中间件。 1.6.7.5 - RELEASE 版本
mycat1.6的源代码,本来想修改点东西,但是技术有限,未能修改成功,放在这里做个备份
linux的Mycat安装包1.6.7.4版本
基于源码修改JDBC8驱动连接Mycat1.6报错 Unknown system variable 'query_cache_size' ,配置好mycat相应配置直接bin目录启动即可
Mycat 是数据库中间件。Mycat是开源社区在阿里cobar基础上进行二次开发,解决了cobar存在的问题,并且加入了许多新 的功能在其中。青出于蓝而胜于蓝。
当mycat的jar包的版本过低时,替换这个可解决问题.
本文档为 rehat 企业版上安装具体过程,希望能够帮助需要使用的人,谢谢
linux64位mycat1.6二进制包
Mycat1.6.7.3版本
mycat 1.6 win和linux版,用于新手学习
基于MyCat1.6.7.6正式版的源码修改的,支持subTables的按月分表正则配置 subTables=“ tableName_$202101-?” subTableWay="BYMONTH" rule="sharding-by-month" 表示从202101月份开始进行分表处理,?表示当前日期的...
Mycat 1.6 稳定版-linux环境 gz包.7z,mysql管理工具,支持读写分离,水平切分
MySql 中间件 Mycat 1.6.7.5 mac.tar 程序 mac 环境程序,MySql 读写分离,分库分表中间件。 1.6.7.5 - RELEASE 版本