您当前的位置: 首页 >  算法

29MyCat - 分片规则(固定分片hash算法)

杨林伟 发布时间:2019-07-25 17:31:47 ,浏览量:3

本条规则类似于十进制的求模运算,区别在于是二进制的操作,是取id的二进制低10位,即id二进制&1111111111。

此算法的优点在于如果按照10进制取模运算,在连续插入1-10时候1-10会被分到1-10个分片,增大了插入的事务控制难度,而此算法根据二进制则可能会分到连续的分片,减少插入事务事务控制难度。


	 
		 user_id
		 func1
	 

 
	 2,1
	 256,512
 
配置说明:

上面columns 标识将要分片的表字段,algorithm 分片函数。

partitionCount 分片个数列表,partitionLength 分片范围列表。

分区长度:默认为最大2^n=1024 ,即最大支持1024分区。

约束: count,length两个数组的长度必须是一致的。 1024 = sum((count[i]*length[i])). count和length两个向量的点积恒等于1024。

用法例子

本例的分区策略:希望将数据水平分成3份,前两份各占25%,第三份占50%。(故本例非均匀分区)

// ||
// ||||
// | partition0 | partition1 | partition2 |
// | 共2份,故count[0]=2 | 共1份,故count[1]=1 |
int[] count = new int[] { 2, 1 };
int[] length = new int[] { 256, 512 };
PartitionUtil pu = new PartitionUtil(count, length);
 // 下面代码演示分别以offerId字段或memberId字段根据上述分区策略拆分的分配结果
 int DEFAULT_STR_HEAD_LEN = 8; // cobar默认会配置为此值
 long offerId = 12345;
 String memberId = "qiushuo";

 // 若根据offerId分配,partNo1将等于0,即按照上述分区策略,offerId为12345时将会被分配到partition0中
 int partNo1 = pu.partition(offerId);

 // 若根据memberId分配,partNo2将等于2,即按照上述分区策略,memberId为qiushuo时将会被分到partition2中
 int partNo2 = pu.partition(memberId, 0, DEFAULT_STR_HEAD_LEN);

如果需要平均分配设置:平均分为4分片,partitionCount*partitionLength=1024


	 4
	 256
 

范围约定 此分片适用于,提前规划好分片字段某个范围属于哪个分片。

start

关注
打赏
1688896170
查看更多评论

杨林伟

暂无认证

  • 3浏览

    0关注

    3183博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0513s