我已经阅读了几篇解释一致性哈希背后的理论的文章。但是它们中的大多数都没有提供有关如何处理添加/删除节点的详细信息。我知道如果它用于像memcached这样的缓存层,我们可能不需要做任何事情,但如果它用于分布式存储,将一些数据移动到正确的节点是非常关键的。当我们需要添加/删除一个节点时到底发生了什么?
其他几个问题是:
- 处理不同大小的服务器的最佳方法是什么
- 如何一次添加和删除多台机器
- 如何应对复制和容错
希望有人能给我指出一篇解释这些的文章。
我已经阅读了几篇解释一致性哈希背后的理论的文章。但是它们中的大多数都没有提供有关如何处理添加/删除节点的详细信息。我知道如果它用于像memcached这样的缓存层,我们可能不需要做任何事情,但如果它用于分布式存储,将一些数据移动到正确的节点是非常关键的。当我们需要添加/删除一个节点时到底发生了什么?
其他几个问题是:
希望有人能给我指出一篇解释这些的文章。
对于您最初的问题,您只需要其他方式将对象从一个节点切换到另一个节点。这可能更多地是您添加和删除节点的一个因素,而不是一致性哈希的工作方式。
解决此问题的一种假设方法是在重新平衡时考虑存在一个中间状态,其中有两个一致的哈希值,一个用于旧拓扑,一个用于新拓扑。取它们之间的差异,每个服务器应该能够知道它需要做什么来符合新的拓扑。例如,每个服务器使用旧的一致哈希从旧服务器请求它没有的对象。一旦我们达到某种“完成”状态,我们就可以删除旧副本(如有必要)。
一致的散列允许您通过调整副本的数量来为服务器赋予权重。这可能是一致性散列优于 HRW 的最大优势。
这可能与仅添加一台机器相同。
HRW 有一个有用的想法,即一致性哈希不像通常解释的那样具有获取后续节点的功能。也就是说,它不仅可以为您提供对象的“节点”,还可以为您提供“对象的节点的有序列表”。如果您决定要为每个对象创建 3 个副本,您可以从列表中选择前三个,而不是只选择第一个。
您可以在一致的散列中获得相同的效果,尽管它不太直观:只需继续围绕“圆圈”,直到您有 N 个唯一节点。
但是它们中的大多数都没有提供有关如何处理添加/删除节点的详细信息。
你读过Dynamo:亚马逊的高可用键值存储吗?这在第 4 节中有详细介绍。
处理不同大小的服务器的最佳方法是什么
没有什么能阻止您在类似 Dynamo 或类似 Cassandra 的系统中的不同服务器上放置不同数量的数据。它会增加大量的复杂性,尤其是在故障恢复的情况下,但不会以任何方式破坏协议的基本原理。