Rendezvous 哈希可以高效添加节点吗?

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

有关 Rendezvous 哈希的维基百科文章 (https://en.wikipedia.org/wiki/Rendezvous_hashing) 没有解释将节点添加到哈希表时会发生什么。按照我的理解,如果您将一个节点添加到通过 Rendezvous 哈希实现的哈希表中,则其他节点中可能有一些对象实际上应该映射到这个新节点,因为这些对象的哈希值高于节点的哈希值这些对象当前位于其中。为了解决此问题,您需要扫描整个哈希表,重新计算哈希值,并根据需要移动对象。从性能角度来看,这是极其昂贵的。

我认为集合点哈希有意义的唯一方法是哈希表是否充当缓存并由数据库支持。然后,如果节点没有对象,则可以从数据库中获取该对象。此外,如果一个节点有一个对象,但该对象的键不再映射到该节点,则该节点的缓存算法将驱逐它(通过 LRU/LFU)。

我的理解正确吗?有办法解决这个问题吗?

scalability distributed consistent-hashing rendezvous-hash
2个回答
2
投票

好问题!维基百科文章实际上触及了该主题“如果一个对象已经在系统中......它将被重新获取并缓存”。

基本上,该算法的建议领域是可以缓存值的情况,但稍后重新缓存它是可以的。虽然它确实需要额外的处理,但实现本身非常简单。这种方法的一个现实示例是 memcached - 它使用这种确切的方法,并且不关心您是否添加/删除节点 - 现有键不会发生重新哈希。

另一个有趣的注释是关于 Rendezvous 和一致性哈希的关系 - 一致性哈希旨在仅移动一些键,即映射到新分区的键。在 Rendezvous 哈希情况下,将移动相同数量的键;更好的是,平均每个现有节点都会放弃相同百分比的密钥 - 但这是以必须重新处理所有密钥为代价的。


0
投票

为了解决这个问题,您需要扫描整个哈希表,重新计算哈希值,并根据需要移动对象。从性能角度来看,这是极其昂贵的。

不一定。您可以通过一种懒惰的方式来完成此操作:通过除了集合点之外还维护一个传统的哈希表,您就知道是否已将密钥插入到系统中。

在这种情况下,如果一个对象被确定在新节点上但并不存在,那么它一定在其他节点之一中,并且您可以按照哈希分数降序查找它。一旦找到,该对象就可以移动到新节点。

© www.soinside.com 2019 - 2024. All rights reserved.