您的位置:首页 > 其它

Mycat的分库功能的路由查找(计算)的实现

2021-03-05 21:14 190 查看

在开源的mysql中间件中,MyCat貌似比较火,实际使用,可能依然存在不少的缺陷(Mycat官方网站上也有注明,可能需要买支持),要想真正用于生产,还必须得把它全部吃透,并结合应用,规避(强悍者可以修正)其缺陷,做好充分的测试。

前段时间稍微研究了一下它的路由计算的实现,因为忙其他的事情,一转眼,很长一段时间已经过去了,自己都差不多忘了当初跟踪到的路由计算的核心代码。 今天再翻出来梳理一下,记点小笔记,以免过段时间又忘了。

Mycat 中的路由计算是通过函数ruleCalculate来实现的。函数代码如下:



  该函数有两个入参:

1。 一个是表的配置信息,其中包含了表的路由规则。

2。另外一个就是where条件里面抽取的信息,用来计算路由规则。

进入函数体之后,

第一步:创建一个空的hash 集合,用于存放路由。

第二步:通过表的配置信息,找到用于分区的列。

第三步:获取路由规则。

第四步:通过路由规则获取具体的路由算法类。

第五步:正式计算路由。 分两种情况,一个是等值计算, 调用algorithm.calculate()函数进行计算路由。

还有一个是范围计算。则调用algorithm.calculateRange()函数进行计算路由。


algorithm 是一个抽象类,具体调用的计算方法由其具体化的类决定。 如果表的路由规则是partitionbylong, 则会调用下面的函数。



最后真正返回路由结果的,是由PartionUtil.partition(key) 函数来返回的,返回的node的编号,通过编号,我们可以知道node的物理位置,然后成功路由。


所有的路由算法的实现都是具体化这个抽象类algorithm来实现的,因此,可以随意添加自己实现的类,来实现自己的新的路由规则。


在Mycat 中,计算路由是第一个步,如果涉及到join的,涉及到两个表的路由, 两个表之间如何关联,结果如何合并? 合并的结果是否是一个正常的结果? 这些,在实际测试过程中,发现两个表的join的功能还有待完善。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐