是否有一致的哈希算法支持密钥的零重映射?

时间:2015-11-05 02:58:09

标签: algorithm hash cluster-computing consistent-hashing

我理解经典的一致性缓存算法,在添加/删除节点时,必须将某些键重新映射到不同的节点。如果我放松了一些要求,是否有一种根本不支持重新映射的算法?

在我的应用程序中,我想逐步为节点分配密钥:

  1. 将一个密钥分配给一个节点后,它将永远保留在那里。

  2. 添加节点但未删除。添加后节点永远不会关闭 - 假设工作中有复制/备份机制。

  3. 密钥不需要在节点之间统一分配。尽力而为:当添加新节点时,会为其分配比旧节点更多的新密钥。

    这种情况是否有算法?

1 个答案:

答案 0 :(得分:1)

我可以想象两种类似的解决方法可以提供你所要求的,但两者都有可能无法接受的条件:

  1. 如果缓存客户端知道首次请求密钥的顺序,即缓存密钥是否包含单调增加的id或某种类型的版本号,那么您可以跟踪群集大小增加的序列号,并计算根据当时存在的节点数进行哈希。
  2. 如果您不介意进行两阶段查找,则可以保留一个密钥→numnodes查找表,记录密钥缓存时的节点数,然后使用它来计算哈希代码。或者只需保留一个键→cachenode查找表。
  3. (如果两阶段查找正常,则#2的变体,但查找表的大小是一个问题:保持哈希(键)→cachenode查找表,并使该哈希尽可能小到需要它是保持查找表小。如果两个键碰巧有相同的哈希值,它们最终会在同一个节点上 - 但如果平衡不严格则不需要考虑。)

    这些技术都不依赖于一致的哈希 - 只是天真的哈希码 - 但两者都是非常有限的。

    在一般情况下,如果没有将密钥与密钥首次缓存时缓存状态信息联系起来的东西,那么不,我不认为你要求的是可能的。