Mycat的分库功能的路由查找(计算)的实现
在开源的mysql中间件中,MyCat貌似比较火,实际使用,可能依然存在不少的缺陷(Mycat官方网站上也有注明,可能需要买支持),要想真正用于生产,还必须得把它全部吃透,并结合应用,规避(强悍者可以修正)其缺陷,做好充分的测试。
前段时间稍微研究了一下它的路由计算的实现,因为忙其他的事情,一转眼,很长一段时间已经过去了,自己都差不多忘了当初跟踪到的路由计算的核心代码。 今天再翻出来梳理一下,记点小笔记,以免过段时间又忘了。
Mycat 中的路由计算是通过函数ruleCalculate来实现的。函数代码如下:
该函数有两个入参:
1。 一个是表的配置信息,其中包含了表的路由规则。
2。另外一个就是where条件里面抽取的信息,用来计算路由规则。
进入函数体之后,
第一步:创建一个空的hash 集合,用于存放路由。
第二步:通过表的配置信息,找到用于分区的列。
第三步:获取路由规则。
第四步:通过路由规则获取具体的路由算法类。
第五步:正式计算路由。 分两种情况,一个是等值计算, 调用algorithm.calculate()函数进行计算路由。
还有一个是范围计算。则调用algorithm.calculateRange()函数进行计算路由。
algorithm 是一个抽象类,具体调用的计算方法由其具体化的类决定。 如果表的路由规则是partitionbylong, 则会调用下面的函数。
最后真正返回路由结果的,是由PartionUtil.partition(key) 函数来返回的,返回的node的编号,通过编号,我们可以知道node的物理位置,然后成功路由。
所有的路由算法的实现都是具体化这个抽象类algorithm来实现的,因此,可以随意添加自己实现的类,来实现自己的新的路由规则。
在Mycat 中,计算路由是第一个步,如果涉及到join的,涉及到两个表的路由, 两个表之间如何关联,结果如何合并? 合并的结果是否是一个正常的结果? 这些,在实际测试过程中,发现两个表的join的功能还有待完善。
- 数据库性能优化的五种方案(mycat,基于阿里coba开源的数据库中间件,很容易实现分库分表、主从切换功能。另一个当当网开源的一个库 sharding-jdbc)
- 设计一个学生成绩管理系统,实现对学生成绩的动态管理,实现对学生成绩的输入,显示,删除,查找,插入,最佳,保存,计算,排序等主要功能
- C++的纯虚函数和抽象类示例:创建一个动态数组,可以实现增加、删除、查找、计算长度、打印等功能
- 基于树莓派,实现无线路由功能
- 定义二分法查找数组中的数,实现arrays.binarySearch()int类型的功能。
- 【Android】Parse 开发笔记(3)—— 实现查找附近的功能(LBS)
- Oracle 中实现查找树形结构节点功能
- 使用Vue-Router 2实现路由功能
- 电信 光纤猫 贝尔E8-C-EPON 破解超级管理员密码 实现PPPoE自动拨号和无线路由功能
- C语言单链表的建立,查找,添加,删除,修改功能实现
- 使用Vue-Router 2实现路由功能
- java实现数据结构-线性表-顺序表,实现插入,查找,删除,合并功能
- JS实现页面查找功能,类似与Ctrl+F
- 汇编实现的简单的通讯录系统,有插入,修改,删除,打印,查找功能
- Cisco交换基础路由配置:交换机怎么设置实现三层交换功能
- uni-app使用腾讯地图位置服务的微信小程序JavaScript SDK实现地图定位、地点查找、路线规划等功能
- MyCat教程五:实现分库分表
- Asp.net 2.0 自定义控件开发[实现自动计算功能(AutoComputeControl)][示例代码下载续][重点推荐控件]
- javascript计算时间差,获取多少分钟多少秒 exmobi实现双击功能
- c语言实现加减乘除计算功能