【问题标题】:Consistent Hashing: what about rehashing?一致散列:重新散列呢?
【发布时间】:2011-07-03 03:53:27
【问题描述】:

您可能知道,在处理 DHT 时,一致的哈希是一个好主意。主要思想是在添加或删除新节点时不会受到太大影响。

来自原始论文:

添加或删除机器时 从缓存集合中,预期 必须移动的对象的比例 到一个新的缓存是最低要求 以保持整个负载平衡 缓存。

解决方案很好,但是存在密钥分配不良的现象。为了解决这个问题,原始节点的副本是随机分布的。该解决方案效果很好。如果你想确定的话,看看这个chart

好的,看起来效果不错。但是,我一直在想一些没有人提及的事情。

添加(或删除)一个节点时会发生什么?好吧,每个键,“之前”放置的节点都需要重新散列。这看起来不错,因为这些键不会是“所有”键。但是,如果我们决定放置一些副本,比如 20 个,那么 20 个节点就会感到重新散列的痛苦。

更少的副本意味着更差的分布,但更多的副本意味着需要重新散列时更加痛苦。

您知道哪种解决方案适合这种情况?我错过了什么吗?

【问题讨论】:

  • 为什么会出现这个问题?重新散列的密钥的总比例保持不变:大约是已经散列的总数的 1/N。它发生在 1 个节点还是 20 个节点上都无关紧要,因为散列是确定性的(并且可以即时计算)。
  • 重新散列正是一致性散列应该解决的问题。哈希桶的数量是固定的。当节点数量发生变化时,只有桶到节点的映射发生变化。

标签: distributed hash distributed-caching dht consistent-hashing


【解决方案1】:

是的,我认为你看错了。我将使用术语“节点”表示机器,使用“对象”表示要缓存的东西。

平均而言,几乎每个节点都会受到新添加的影响。这还不错;它将重新散列的负载分散到所有可用节点。

重要的是大多数对象不受重新散列的影响。平均而言,只需要重新分配 1/nodes 对象;平均而言,每个节点只需要处理转移1/nodes^2个节点,这确实减少了这种影响。

【讨论】:

    【解决方案2】:

    看起来您正试图通过增加副本数量来解决分布问题,而“更好的”散列函数可以解决问题。良好的散列函数确实提供了良好的分布(参见 MD5、SHA 等...)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      • 2014-07-27
      • 2016-09-04
      • 1970-01-01
      • 2017-10-13
      相关资源
      最近更新 更多