在一致性哈希中,假设我们使用用户名作为哈希 hashFunction(用户名) = 节点A
现在据我了解,如果出现任何故障或节点被删除,请求将被定向到环中的下一个节点。假设nodeA发生故障,并且它的写请求被定向到nodeB。所以现在数据已经写入到shardB上了。一旦 shardA 重新启动并运行,将如何处理这个问题。我们的哈希函数将返回 hashFunction(username) = nodeA,但数据在 nodeA/shardA 上不可用,因为它是写在 shardB 上的
当更改(添加或删除)集群中的节点时,一致的散列可以最大限度地减少需要重新映射的键的数量。就其本身而言,一致性哈希并不处理节点处于低位的情况,这就是“下一个节点”概念的由来。
我举个例子吧!
假设我们的哈希函数是 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]。因此,如果我们想写入(或读取)一个值 - 我们不能 - 节点处于离线状态。在这种情况下,我们想使用“下一个”节点作为占位符。
总结一下: