单维路由
(单维路由根据单个路由字段值判断SQL应当分发到哪个分库执行)
将[0-1023]分为不同的区段,每个区段代表一个分库,其中区段的个数以及每个区段的长度由用户自定义;
用SQL中的拆分字段值对1024取模,结果落入哪个区段,SQL便被路由到那个分库执行(如果拆分字段不是数值类型,则首先做一次hash)
基本示例
假设现在需要将一张表平均拆分到4个分库,路由字段为字符串类型。
首先将[0-1023]平均分为4个区段,[0-255],[256-511],[512-767],[768-1023], 然后对字符串(或子串,由用户自定义)做hash, hash结果对1024取模,最终得出的结果落入那个区段,便路由到哪个分库。

在Cobar配置中,我们把区段的个数成为partitionCount, 每个区段的长度为partitionLength,满足∑(partitionCount* partitionLength) = 1024。
function定义如下:

ps.从笔记上贴过来乱码,不知道是不是特殊字符的问题~请原谅哈
假如路由字段是数值类型,按照如下配置

扩容
这种路由方法可以很容易实现扩容,假设现在需要将4个分库扩容为8个分库,只需要将[0-1023]平分为8个区段即可,如下:


不均匀分布
如果需要不均匀分库,则将[0-1023]分成不均匀的区段即可:


多维路由自定义路由算法
用户可以自定义路由算法,具体可以参照com.alibaba.cobar.route.function.PartitionByLong或者com.alibaba.cobar.route.function.PartitionByString编写代码
网友评论