|
14 | 14 |
|
15 | 15 | 一致 Hash 算法是将所有的哈希值构成了一个环,其范围在 `0 ~ 2^32-1`。如下图: |
16 | 16 |
|
17 | | - |
| 17 | + |
18 | 18 |
|
19 | 19 | 之后将各个节点散列到这个环上,可以用节点的 IP、hostname 这样的唯一性字段作为 Key 进行 `hash(key)`,散列之后如下: |
20 | 20 |
|
21 | | - |
| 21 | + |
22 | 22 |
|
23 | 23 | 之后需要将数据定位到对应的节点上,使用同样的 `hash 函数` 将 Key 也映射到这个环上。 |
24 | 24 |
|
25 | | - |
| 25 | + |
26 | 26 |
|
27 | 27 | 这样按照顺时针方向就可以把 k1 定位到 `N1节点`,k2 定位到 `N3节点`,k3 定位到 `N2节点`。 |
28 | 28 |
|
29 | 29 | ### 容错性 |
30 | 30 | 这时假设 N1 宕机了: |
31 | 31 |
|
32 | | - |
| 32 | + |
33 | 33 |
|
34 | 34 | 依然根据顺时针方向,k2 和 k3 保持不变,只有 k1 被重新映射到了 N3。这样就很好的保证了容错性,当一个节点宕机时只会影响到少少部分的数据。 |
35 | 35 |
|
36 | 36 | ### 拓展性 |
37 | 37 |
|
38 | 38 | 当新增一个节点时: |
39 | 39 |
|
40 | | - |
| 40 | + |
41 | 41 |
|
42 | 42 | 在 N2 和 N3 之间新增了一个节点 N4 ,这时会发现受印象的数据只有 k3,其余数据也是保持不变,所以这样也很好的保证了拓展性。 |
43 | 43 |
|
|
46 | 46 |
|
47 | 47 | 当节点较少时会出现数据分布不均匀的情况: |
48 | 48 |
|
49 | | - |
| 49 | + |
50 | 50 |
|
51 | 51 | 这样会导致大部分数据都在 N1 节点,只有少量的数据在 N2 节点。 |
52 | 52 |
|
53 | 53 | 为了解决这个问题,一致哈希算法引入了虚拟节点。将每一个节点都进行多次 hash,生成多个节点放置在环上称为虚拟节点: |
54 | 54 |
|
55 | | - |
| 55 | + |
56 | 56 |
|
57 | 57 | 计算时可以在 IP 后加上编号来生成哈希值。 |
58 | 58 |
|
|
0 commit comments