下面对于环割法(一致性 hash)及跳跃法(jumpstringhash)的原理、特性及优缺点进行简单的介绍。git
环割法的原理以下:github
特色 | 缺点 |
---|---|
随机性强 | 初始化耗时长,内存消耗较高,须要进行大量数据排序,分片消耗高 |
跳跃法的原理以下:算法
根据公式:性能
将数据落在每个节点的几率进行平均分配。测试
对于输入的字符串进行计算 hash 值,经过判断每次产生的伪随机值是否小于当前断定的节点 1/x,最终取捕获节点编号最大的做为数据的落点。spa
在实际使用中使用倒数的方法从最大节点值进行反向判断,一旦当产生的伪随机值大于 x 则断定此节点 x 做为数据的落点。3d
特色 |
---|
内存消耗小,均衡性高,计算量相对较小 |
下面将经过测试对环割法和跳跃法的性能及均衡性进行对比,说明 DBLE 为什么使用跳跃法代替了环割法。blog
数据源:现场数据 350595 条排序
测试通过:继承
测试结果:
分片数量\方差 | 环割法1000片 | 环割法10000片 | 跳跃法 |
---|---|---|---|
4 | 4484780 | 812418 | 315703 |
8 | 601593 | 545599 | 315587 |
16 | 453694 | 131816 | 67018 |
32 | 213856 | 74360 | 86125 |
64 | 69313 | 46618 | 37939 |
128 | 24329 | 26415 | 25429 |
summary
- 在一样分片数据量的状况下,两种方法的方差都会随着分片数量的增长而减小。
- 在分片数量足够多的状况下,两种方法并无太大的区别。
- 在节点数量相对较少的状况下,跳跃法的均衡性最好。
- 使用环割法时,增长环切的数量可以提升分片的均衡性,可是均衡性提升的幅度会随着分片数量的增长而减小。
分片数量\耗时 | 环割法1000片 | 环割法10000片 | 跳跃法 |
---|---|---|---|
4 | 0.419 | 0.532 | 0.069 |
8 | 0.41 | 0.425 | 0.067 |
16 | 0.512 | 0.545 | 0.06 |
32 | 0.55 | 0.525 | 0.07 |
64 | 0.683 | 0.59 | 0.087 |
128 | 0.559 | 0.659 | 0.094 |
summary
- 环割法相比于跳跃法有较大的性能差距,大约相差一个数量级。
- 跳跃法的时间消耗会随着分片数量的增长而小幅度的上升。
- 环割法的时间消耗随着环割数量的增长而小幅度的增长。
分片数量\最大平均数偏离 | 环割法1000片 | 环割法10000片 | 跳跃法 |
---|---|---|---|
4 | 3027 | 1513 | 802 |
8 | 1530 | 1488 | 822 |
16 | 1121 | 622 | 556 |
32 | 1044 | 358 | 672 |
64 | 673 | 560 | 424 |
128 | 503 | 348 | 682 |
summary
- 两种方法的最大误差都会随着分片数量的上升而降低,最后当分片数量足够多的时候,两种方法并无明显的区别。
- 在分片数量少的时候,跳跃法的均衡性最好,环割法相对最差。
- 使用环割法时,增长环切的数量可以提升分片的均衡性,可是均衡性提升的幅度会随着分片数量的增长而减小。
综上测试对比:
从一致性 hash 的多种测试结果来看,都没有很好的性能表现。所以,DBLE 在 hash 算法选取方面,使用 jumpstringhash 代替了一致性 hash。
若是您是从 Mycat 迁移过来的,使用了一致性 hash,能够经过自定义拆分算法来实现。
自定义拆分算法相关连接: