我将在一堆节点上实现一致的哈希。每个节点的容量有限(假设为 1GB)。我从一个节点开始,当它满了时,我将添加另一个节点,并使用一致的哈希来重新分配数据,并通过添加新节点来向前推进。然而,节点仍然有可能已满。我知道一些 nosql 数据库(例如 cassandra)使用一致哈希来执行类似于我正在做的事情。如何使用一致性哈希来避免节点溢出?
最佳答案
Cassandra 没有按照您描述的方式使用一致哈希。
每个表都有一个分区键(您可以将其视为主键或 RDBMS 术语中的第一部分),该键使用 murmur3 算法进行哈希处理。整个哈希空间形成一个从最低哈希值到最高哈希值的连续环。之后,这个环被分成 block (vnodes,默认为256),并且这些 block 公平地分布在多个节点之间。每个节点不仅托管自己的环部分,还根据复制因子维护其他虚拟节点的复制副本。
这种做事方式有助于解决很多问题:
- 在集群所有节点之间均衡数据负载,任何特定节点都不能过载(数据大小、读写均匀分布,无热点)
- 如果您向集群添加新节点,它将处理其自己的环部分,并自动从其他节点拉取所需的 vnode。无需手动重新分片。
- 如果节点发生故障,由于复制,您不会丢失任何数据,因为它已经存储在其他节点上。在这种情况下,您可以停用故障节点,以便所有其他节点将在它们之间重新分配故障环部分。无需为发生故障的数据库节点提供复杂的切换场景。
当然,您始终可以在应用程序层中的任何 RDBMS 之上实现类似的数据库行为,但这总是比使用已经存在的经过实战检验的解决方案困难得多,而且不易出错。
关于cassandra - 如何确保一致性哈希有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30610535/