分布式 | DBLE 分片算法之 hash 分片( 二 )


取模 hash , 举个最简单的例子就能明白:分片数设置为 2 , 要把数据均匀分布在这 2 个分片上 , 直接对分片 key 取模 2 , 这样模值为 0 的数据落在分片 1 , 模值为 2 的数据落在分片 2 。 只要输入的数据奇偶均匀 , 分片数据就保证均衡 。
取模 hash 在 dble 里还做了一些变种支持 , 比如可以指定每个分片的连续值的数量 , 比如自然数 0-99 放分片 1 , 自然数 100-599 放分片 2 , 具体配置方式参考官方文档 。 这样做主要目的是改善 hash 在范围查询时的效率问题 。
Hash 取模分片非常简单 , 均衡性比较好 , 能分散数据热点 , 并且能快速人为识别数据所在分片 。 缺点也很明显 。
1. 在业务上范围查询效率比较低
2. 扩容不便
因为取模 hash 强依赖于分片数 , 当新增或删减分片节点——即扩缩容时 , 大量的数据在重新映射后都需要挪动 。 比如上面的 2 分片数据 , 如果增加到 3 分片 , 原来分片 1 上的数据只有 1/3 的数据可以保留不动 , 另外 2/3 的数据都需要挪到新的分片上 , 分片 2 也是如此 。
如果真的使用了 hash 取模分片 , 为了后期在扩容时移动尽可能少的数据 , dble 的建议是:取模的基数不能大于 2880 , 原因是:2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 30, 32, 36, 40, 45, 48, 60, 64, 72, 80, 90, 96, 120, 144, 160, 180, 192, 240, 288, 320, 360, 480, 576, 720, 960, 1440 是 2880 的约数 。
以上是对分布式与 hash 的一些浅显认识 , 文章内容部分来自对书或互联网知识的个人理解 , 不当之处欢迎指正 。
Ref:
1. 《图解算法》
2. 《分布式系统常用技术及案例分析》
3.
4.