【Mycat 1.6 之路由与分发流程】
一、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 两个语句分别求路由,然后取并集。
已有 0 人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐