当分片索引不是纯整型的字符串时,只接受整型的内置hash算法是无法使用的。为此,stringhash按照用户定义的起点和终点去截取分片索引字段中的部分字符,根据当中每个字符的二进制unicode值换算出一个长整型数值,然后就直接调用内置hash算法求解分片路由:先求模得到逻辑分片号,再根据逻辑分片号直接映射到物理分片。建议在阅读本分片算法前,先阅读hash算法章节。
PartitionByString工作示意图- 用户需要在rule.xml中定义partitionLength[]和partitionCount[]两个数组和hashSlice二元组。
- 在DBLE的启动阶段,点乘两个数组得到模数,也是逻辑分片的数量
- 并且根据两个数组的叉乘,得到各个逻辑分片到物理分片的映射表(物理分片数量由partitionCount[]数组的元素值之和)
- 此外根据hashSlice二元组,约定把分片索引值中的第4字符到第5字符(字符串以0开始编号,编号3到编号4等于第4字符到第5字符)字符串用于“字符串->整型”转换
- 在DBLE的运行过程中,用户访问使用这个算法的表时,WHERE子句中的分片索引值会被提取出来,取当中的第4个字符到第5字符,送入下一步
- 设置一个初始值为0的累计值,逐个取字符,把累计值乘以31,再把这个字符的unicode值当成长整型加入到累计值中,如此类推直至处理完截取出来的所有字符,此时的累计值就能够代表用户的分片索引值,完成了“字符串->整型”的转换
- 对上一步的累计值进行求模,得到逻辑分片号
- 再根据逻辑分片号,查映射表,直接得到物理分片号
-
开发注意点
- 【分片索引】1,必须是字符串
- 【分片索引】2,最大物理分片配置方法是,让partitionCount[]数组和等于2880,例如“<property name="partitionLength">1</property><property name="partitionCount">2880</property>”或“<property name="partitionLength">1,1</property><property name="partitionCount">1440,1440</property>”
- 【分片索引】3,最小物理分片配置方法是,让partitionCount[]数组和等于1,例如“<property name="partitionLength">2880</property><property name="partitionCount">1</property>”
- 【分片索引】4,partitionLength和partitionCount被当做两个逗号分隔的一维数组,它们之间的点乘必须在[1, 2880]范围内
- 【分片索引】5,partitionLength和partitionCount的配置对顺序敏感,“<property name="partitionLength">512,256</property><property name="partitionCount">1,2</property>”和“<property name="partitionLength">256,512</property><property name="partitionCount">2,1</property>”是不同的分片结果
- 【分片索引】6,分片索引字段长度小于用户指定的截取长度时,截取长度会安全减少到符合分片索引字段长度
- 【数据分布】1,分片索引字段截取越长则越有利于数据均匀分布
- 【数据分布】2,分片索引字段的内容重复率越低则越有利于数据均匀分布
-
运维注意点
- 【扩容】1,预先过量分片,并且不改变partitionCount和partitionLength点乘结果,也不改变截取设置hashSlice时,可以避免数据再平衡,只需进行涉及数据的迁移
- 【扩容】2,若需要改变partitionCount和partitionLength点乘结果,或,改变截取设置hashSlice时,需要数据再平衡
- 【缩容】1,预先过量分片,并且不改变partitionCount和partitionLength点乘结果,也不改变截取设置hashSlice时,可以避免数据再平衡,只需进行涉及数据的迁移
- 【缩容】2,若需要改变partitionCount和partitionLength点乘结果,或,改变截取设置hashSlice时,需要数据再平衡
-
配置注意点
- 【配置项】1,在rule.xml中,可配置项为<property name="partitionLength">、<property name="partitionCount">和<property name="hashSlice">
- 【配置项】2,在rule.xml中配置<property name="partitionLength">标签,内容形式为“<物理分片持有的虚拟分片数>[,<物理分片持有的虚拟分片数>,...<物理分片持有的虚拟分片数>]”,<物理分片持有的虚拟分片数>必须是整型,<物理分片持有的虚拟分片数>从左到右与同顺序的<物理分片数>对应,partitionLength和partitionCount的点乘结果必须在[1, 2880]范围内
- 【配置项】3,在rule.xml中配置<property name="partitionCount">标签,内容形式为“<物理分片数>[,<物理分片数>,...<物理分片数>]”,其中<物理分片数>必须是整型,<物理分片数>按从左到右的顺序与同顺序的<物理分片持有的虚拟分片数>对应,物理分片的编号从左到右连续递进,partitionLength和partitionCount的点乘结果必须在[1, 2880]范围内
- 【配置项】4,partitionLength和partitionCount的语义是:持有partitionLength[i]个虚拟分片的物理分片有partitionCount[i]个,例如,“<property name="partitionLength">512,256</property><property name="partitionCount">1,2</property>”的语义是“持有512个逻辑分片的物理分片有1个,紧随其后,持有256个逻辑分片的物理分片有2个”
- 【配置项】5,partitionLength和partitionCount都对书写顺序敏感,例如,“<property name="partitionLength">512,256</property><property name="partitionCount">1,2</property>”的分片结果是“第一个物理分片持有头512个逻辑分片,第二个物理分片持有紧接着的256个逻辑分片,第三个物理分片持有最后256个逻辑分片”,相对的,“<property name="partitionLength">256,512</property><property name="partitionCount">2,1</property>”的分片结果则是“第一个物理分片持有头256个逻辑分片,第二个物理分片持有紧接着的256个逻辑分片,第三个物理分片持有最后512个逻辑分片”
- 【配置项】6,partitionLength[]的元素全部为1时,这时候partitionCount数组和等于partitionLength和partitionCount的点乘,物理分片和逻辑分片就会一一对应,该分片算法等效于直接取余
- 【配置项】7,在rule.xml中配置<property name="hashSlice">标签,从分片索引字段的第几个字符开始截取到第几个字符:若希望从首字符开始截取k个字符(k为正整数),配置的内容形式可以为“0:k”、“k”或“:k”;若希望从末字符开始截取k个字符(k为正整数),则配置的内容形式可以为“-k:0”、“-k”或“-k:”;若希望从头第m个字符起算截取n个字符(m和n都是正整数),则先计算出i=m-1和j=i+n-1,配置的内容形式为“i:j”;若希望从尾第m个字符起算截取从尾算起的n个字符(m和n都是正整数),则先计算出i=-m+n-1,配置的内容形式可以为“-m:i”;若希望不截取,则配置的内容形式可以为“0:0”、“0:”、“:0”或 “:”
网友评论