Mycat的分库功能的路由查找(计算)的实现
Posted 数据库随笔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的分库功能的路由查找(计算)的实现的主要内容,如果未能解决你的问题,请参考以下文章
使用mycat配置分库失败查看日志报错“NoRouteToHostException: 没有到主机的路由“