【Mycat 1.6 之路由与分发流程】

标签: mycat 路由 | 发表时间:2016-11-19 20:47 | 作者:
出处:http://www.iteye.com

一、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推荐



相关 [mycat 路由] 推荐:

【Mycat 1.6 之路由与分发流程】

- - ITeye博客
一、Mycat 的路由与分发流程. 从原理上来看,可以把 mycat 看成一个 sql 转发器. mycat 接收到前端发来的 sql,然后转发到后台的 mysql 服务器上去执行. 但是后面有很多台 mysql 节点(如 dn1,dn2,dn3),该转发到哪些节点呢. 路由能保证 sql 转发到正确的节点.

MyCat集群部署(HAProxy + MyCat)

- - 行业应用 - ITeye博客
参考实战视频: http://www.roncoo.com/course/view/85d6008fe77c4199b0cdd2885eaeee53. 《高可用架构篇--第13节--MySQL源码编译安装(CentOS-6.6+MySQL-5.6)》. 《高可用架构篇--第14节--MySQL主从复制的配置(CentOS-6.6+MySQL-5.6)》.

Mycat 入门

- - 数据库 - ITeye博客
MyCAT是mysql中间件,前身是阿里大名鼎鼎的Cobar,Cobar在开源了一段时间后,不了了之. 于是MyCAT扛起了这面大旗,在大数据时代,其重要性愈发彰显. 这篇文章主要是MyCAT的入门部署. 因Mycat是用java开发的,所以需要在实验环境下安装java,官方建议jdk1.7及以上版本.

Mycat之——Mycat集群部署(基于HAProxy + Mycat)

- - CSDN博客推荐文章
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/75331934. 操作系统:CentOS-6.5-x86_64. JDK版本:jdk1.7.0_80. HAProxy版本:haproxy-1.5.19.tar.gz. Mycat版本:Mycat-server-1.5.1-RELEASE-20170717215510-linux.tar.gz (自行下载源码编译).

mycat 数据库中间件

- - Oracle - 数据库 - ITeye博客
出处:http://blog.csdn.net/nxw_tsp/article/details/56277430. 实习的时候,在一个项目当中,项目经理要求把原先的MySQL数据连接基于mycat来进行改造. 当时就在想MyCat是什么东西. MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里.

MySQL分布式中间件:MyCAT

- - 标点符
随着传统的数据库技术日趋成熟、计算机网络技术的飞速发展和应用范围的扩充,数据库应用已经普遍建立于计算机网络之上. 这时集中式数据库系统表现出它的不足:. 集中式处理,势必造成性能瓶颈;. 应用程序集中在一台计算机上运行,一旦该计算机发生故障,则整个系统受到影响,可靠性不高;. 集中式处理引起系统的规模和配置都不够灵活,系统的可扩充性差.

Mycat 设置全局序列号

- - 数据库 - ITeye博客
在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一. 为此,MyCat 提供了全局sequence,并且提供了包含本地配置和数据库配置等多种实现方式. 原理:此方式MyCAT将sequence配置到文件中,当使用到sequence中的配置后,MyCAT会更下classpath中的sequence_conf.properties文件中sequence当前的值.

数据库垂直拆分,水平拆分利器,cobar升级版mycat

- - CSDN博客推荐文章
基于阿里的开源cobar ,可以用于生产系统中,目前在做如下的一些改进:. 非阻塞IO的实现,相对于目前的cobar,并发性能大大提升,而且不会陷入假死状态. 优化线程池的分配,目前cobar的线程池分配效率不高. 修复cobar一些BUG. 参考impala中的impala front部分的Java代码,实现高效的Map-Reduce,能够处理上亿的大数据量.

浅谈路由表

- hama - 生活点滴
还是按照我自己的风格,用比较通俗的语言来介绍一下路由表知识. 只要通信就涉及到数据的交换,比如传统的信件,都是通过邮局来进行邮递运输的,那么同样,ip设备之间的通信,也一样需要数据交换,也需要通过“邮递员”来进行投递. 这个时候就需要一种规则,这个规则就是路由表. 下面我们来看看本机的路由表,在windows开始菜单->运行->cmd,然后在弹出的命令行中输入route print即可看到本机的路由表.

Linux中添加路由

- - Linux - 操作系统 - ITeye博客
在文件/etc/init.d/network中可以看到如下部分内容. 可见只要在/etc/sysconfig/static-routes中添加路由信息即可(若该文件不存在新建即可),添加信息如下. 然后重启网络服务,即执行如下命令:. 最后查看添加结果,命令是:. 先配置ip地址及子网掩码,勿配置网关,如下.