分片中如何进行故障和恢复操作(一致性哈希)

问题描述 投票:0回答:1

在一致性哈希中,假设我们使用用户名作为哈希 hashFunction(用户名) = 节点A

现在据我了解,如果出现任何故障或节点被删除,请求将被定向到环中的下一个节点。假设nodeA发生故障,并且它的写请求被定向到nodeB。所以现在数据已经写入到shardB上了。一旦 shardA 重新启动并运行,将如何处理这个问题。我们的哈希函数将返回 hashFunction(username) = nodeA,但数据在 nodeA/shardA 上不可用,因为它是写在 shardB 上的

sharding database-partitioning system-design consistent-hashing
1个回答
0
投票

当更改(添加或删除)集群中的节点时,一致的散列可以最大限度地减少需要重新映射的键的数量。就其本身而言,一致性哈希并不处理节点处于低位的情况,这就是“下一个节点”概念的由来。

我举个例子吧!

假设我们的哈希函数是 key mod 4 - 因此对于每个整数键,mod 操作可能返回 [0,1,2,3] 之一。

假设我们的集群只有两个节点:A 和 B - 映射为:A ->[0,1] 和 B->[2,3]。现在我们添加另一个节点 C,我们可以将键重新映射到该节点,例如 C->[3];所以整个簇是:A->[0,1],B->[2]和C->[3]。通过一致散列,仅需要移动受影响的键 [3],所有其他键都保留在现有节点中。

现在有一个由三个节点组成的集群,我们假设节点 B 发生故障 - B 仍然负责密钥 [2]。因此,如果我们想写入(或读取)一个值 - 我们不能 - 节点处于离线状态。在这种情况下,我们想使用“下一个”节点作为占位符。

总结一下:

  • 一致的哈希可以最大限度地减少在集群中添加或删除节点时要重新映射的键的数量
  • 书写/阅读“下一个”模式有助于提高可用性
  • 这两个概念可以独立使用
© www.soinside.com 2019 - 2024. All rights reserved.