hash -> PartitionByLong

这是先求模得到逻辑分片号,再根据逻辑分片号直接映射到物理分片的一种散列算法。

hash -> PartitionByLong_第1张图片
PartitionByLong工作示意图
  1. 用户需要在rule.xml中定义partitionLength[]和partitionCount[]两个数组
  2. 在DBLE的启动阶段,点乘这两个数组得到模数,也是逻辑分片的数量
  3. 并且根据两个数组的叉乘,得到各个逻辑分片到物理分片的映射表(物理分片数量由partitionCount[]数组的元素值之和)
  4. 在DBLE的运行过程中,用户访问使用这个算法的表时,WHERE子句中的分片索引值会被提取出来进行求模,得到逻辑分片号
  5. 再根据逻辑分片号,查映射表,直接得到物理分片号
  • 开发注意点

    • 【分片索引】1,必须是整型数字或整型数字的字符串(可以为负数)
    • 【分片索引】2,最大物理分片配置方法是,让partitionCount[]数组和等于2880,例如“12880”或“1,11440,1440
    • 【分片索引】3,最小物理分片配置方法是,让partitionCount[]数组和等于1,例如“28801
    • 【分片索引】4,partitionLength和partitionCount被当做两个逗号分隔的一维数组,它们之间的点乘必须在[1, 2880]范围内
    • 【分片索引】5,partitionLength和partitionCount的配置对顺序敏感,“512,2561,2”和“256,5122,1”是不同的分片结果
    • 【数据分布】1,与分片索引值相关而与INSERT先后无相关性,所以在直接使用时无法保证数据分布均匀,但如果分片索引本身连续递增(交易流水号等),则可以期待数据分布较为平均(但副作用会导致范围语句,例如SELECT ... WHERE shard_key BETWEEN 1 AND 100,变成跨分片查询)
  • 运维注意点

    • 【扩容】1,预先过量分片,并且不改变partitionCount和partitionLength点乘结果,可以避免数据再平衡,只需进行涉及数据的迁移
    • 【扩容】2,若需要改变partitionCount和partitionLength点乘结果,需要数据再平衡
    • 【缩容】1,预先过量分片,并且不改变partitionCount和partitionLength点乘结果,可以避免数据再平衡,只需进行涉及数据的迁移
    • 【缩容】2,若需要改变partitionCount和partitionLength点乘结果,需要数据再平衡
  • 配置注意点

    • 【配置项】1,在rule.xml中,可配置项为
    • 【配置项】2,在rule.xml中配置标签,内容形式为“<物理分片持有的虚拟分片数>[,<物理分片持有的虚拟分片数>,...<物理分片持有的虚拟分片数>]”,<物理分片持有的虚拟分片数>必须是整型,<物理分片持有的虚拟分片数>从左到右与同顺序的<物理分片数>对应,partitionLength和partitionCount的点乘结果必须在[1, 2880]范围内
    • 【配置项】3,在rule.xml中配置标签,内容形式为“<物理分片数>[,<物理分片数>,...<物理分片数>]”,其中<物理分片数>必须是整型,<物理分片数>按从左到右的顺序与同顺序的<物理分片持有的虚拟分片数>对应,物理分片的编号从左到右连续递进,partitionLength和partitionCount的点乘结果必须在[1, 2880]范围内
    • 【配置项】4,partitionLength和partitionCount的语义是:持有partitionLength[i]个虚拟分片的物理分片有partitionCount[i]个,例如,“512,2561,2”的语义是“持有512个逻辑分片的物理分片有1个,紧随其后,持有256个逻辑分片的物理分片有2个”
    • 【配置项】5,partitionLength和partitionCount都对书写顺序敏感,例如,“512,2561,2”的分片结果是“第一个物理分片持有头512个逻辑分片,第二个物理分片持有紧接着的256个逻辑分片,第三个物理分片持有最后256个逻辑分片”,相对的,“256,5122,1”的分片结果则是“第一个物理分片持有头256个逻辑分片,第二个物理分片持有紧接着的256个逻辑分片,第三个物理分片持有最后512个逻辑分片”
    • 【配置项】6,partitionLength[]的元素全部为1时,这时候partitionCount数组和等于partitionLength和partitionCount的点乘,物理分片和逻辑分片就会一一对应,该分片算法等效于直接取余

你可能感兴趣的:(hash -> PartitionByLong)