普通的hash是这样的,假设有3个节点,数据分别是1 2 3 4 5 6 7 8 9 10,那么用取模方法的话分布如下。
0:3 6 9
1:1 4 7 10
2:2 5 8
这种情况下如果增加一个节点的话则会变成。
0:4 8
1:1 5 9
2:2 6 10
3:3 7
移动的数据要很多,所以这里就要用上一致性hash。
对节点做hash计算,对值也做hash运算,最后把节点弄成环。把区间数值归右端点。给个其他博客的例子:
十条数据,算出各自的哈希值
0:192
1:196
2:200
3:204
4:208
5:212
6:216
7:220
8:224
9:228
有三个节点,算出各自的哈希值
node a: 203
node g: 209
node z: 228
结果:
node a: 0,1,2
node g: 3,4
node z: 5,6,7,8,9
然后就是有一个问题,删除一个节点后,会把该节点存储的值全部交付给下一个节点,那么下一个节点的压力就会很大,所以引用了虚拟节点。通过把节点后面增加id等方式再做hash运算,这样就可以使环上分布更加均匀,每个节点分布的区域不再是连续的一块而是离散的。