我将在一堆节点上实现一致的散列。每个节点的容量都是有限的(比如说 1GB)。我从一个节点开始,当它变满时,我将添加另一个节点并使用一致的散列来重新分配数据并通过添加新节点继续前进。但是,仍然有可能节点已满。我知道一些 nosql 数据库,例如 cassandra 使用一致的散列来做类似于我正在做的事情。如何使用一致的哈希避免节点溢出?
问问题
2905 次
2 回答
2
Cassandra 没有以您描述的方式使用一致的散列。
每个表都有一个分区键(您可以将其视为主键或在 RDBMS 术语中的第一部分),该键使用 murmur3 算法进行散列。整个哈希空间形成了一个从最低可能哈希到最高哈希的连续环。之后,这个环被分成块(vnodes,默认为 256),这些块被公平地分布在多个节点之间。每个节点不仅托管它自己的环的一部分,而且还根据复制因子维护其他 vnode 的复制副本。
这种做事方式有助于解决很多问题:
- 均衡所有集群节点之间的数据负载,没有特定节点可以过载(数据大小,读写均匀分布,无热点)
- 如果您将一个新节点添加到集群中,它将处理它自己的环部分并自动从其他节点中提取所需的 vnode。无需手动重新分片。
- 如果节点失败,由于复制,您不会错过任何数据,因为它已经存储在其他节点上。在这种情况下,您可以停用失败的节点,以便所有其他节点在它们之间重新分配失败的环部分。无需为失败的数据库节点设置复杂的切换场景。
当然,您始终可以在应用程序层的任何 RDBMS 之上实现类似的 DB 行为,但它总是比使用已经存在的经过实战测试的解决方案更难且不易出错。
于 2015-06-03T06:24:30.280 回答
1
我猜你知道当一个节点被添加或删除时,键是如何从一个节点移动到另一个节点的。谈到均匀分布如何发生的问题?
您可以在这里拥有自己的逻辑来实现它。如果任何节点变热(处理更多密钥),您将继续监视哈希中的所有节点,在该节点之前插入另一个节点,以便在新旧节点之间分配负载。类似的方式,如果任何节点未充分利用,您可以删除它们,以便负载将转移到下一个节点。
希望这有帮助..!!
于 2018-01-10T18:01:36.833 回答