聊聊一致性哈希算法 | 青训营

54 阅读3分钟

一致性哈希算法(Consistent Hashing Algorithm)是一种用于分布式系统中数据分片和负载均衡的算法。它的目标是在动态环境下,当节点的数量发生变化时,尽可能地减少数据重新分布的情况,从而提高系统的扩展性和稳定性。

在分布式系统中,常常需要将数据分散存储在多个节点上,以便实现高可用性和性能。一致性哈希算法通过使用一个哈希函数将数据映射到一个环形的哈希空间中。每个节点也被映射到这个环上的一个位置。当需要存储或查找数据时,通过计算数据的哈希值找到它在环上的位置,然后顺时针寻找最近的节点,将数据存储在这个节点上。

一致性哈希的一个重要特性是在节点数量变化时,只会影响到环上相邻的节点,而不会影响到大部分已存在的数据映射关系。这意味着当新增或删除节点时,只有少量数据需要被重新映射,大部分数据仍然保持在原有的节点上,从而减少了数据迁移的开销。

这个算法在负载均衡和缓存系统中得到了广泛应用,它使得系统能够更加高效地分布数据和请求负载,同时在节点发生变化时也能保持较好的稳定性。

解决的问题

当我们的分布式集群要扩容或缩容的时候,不会导致全量数据的重新洗牌,只会影响到小部分的数据,同时由于虚拟节点的引入,更进一步提升了一致性哈希算法的性能,在扩缩容的时候,其他节点能很好的分担数据迁移的压力,不会造成雪崩的出现。

我们来看一个简单的一致性哈希算法的例子,假设有三个节点 A、B 和 C,它们在环形哈希空间中的位置如下:

yamlCopy code
Node A: 0-10
Node B: 11-20
Node C: 21-30

现在有一些数据需要存储在这个分布式系统中。假设我们有一组数据项 {D1, D2, D3, D4, D5},并且需要将它们映射到节点上。我们使用一个哈希函数将数据映射到环上的位置,然后再顺时针找到最近的节点。

  1. 数据 D1 的哈希值为 8,它映射到了节点 A(位置 8 在区间 0-10 内)。
  2. 数据 D2 的哈希值为 15,它映射到了节点 B(位置 15 在区间 11-20 内)。
  3. 数据 D3 的哈希值为 25,它映射到了节点 C(位置 25 在区间 21-30 内)。
  4. 数据 D4 的哈希值为 5,由于它的哈希值小于节点 A 的位置,所以它映射到了节点 C(通过环的“循环性”)。
  5. 数据 D5 的哈希值为 18,它映射到了节点 A(位置 18 在区间 11-20 之后环绕到 0-10)。

现在,假设我们要新增一个节点 D,并将节点 D 插入到环上的位置 14。这时候环的分布变为:

yamlCopy code
Node A: 0-10
Node D: 11-20
Node B: 21-30
Node C: 31-40

注意,新增节点 D 导致了节点 B 和节点 C 之间的部分数据需要重新映射,但是节点 A 和节点 D 之间的数据仍然保持不变。这就是一致性哈希算法的优势,只有一小部分数据需要迁移。

通过这个例子,你可以看到一致性哈希算法如何在节点变化时保持了大部分数据的映射不变,从而降低了数据迁移的成本。