1

正如我们从 Cassandra 的文档 [ Link to doc ] 中知道的那样,分区器应该使数据均匀分布在多个节点上,以避免读取热点。Cassandra 为此提供了各种分区算法 - Murmur3Partitioner、RandomPartitioner、ByteOrderedPartitioner。

Murmur3Partitioner 是 Cassandra 设置的默认分区算法。它对分区键进行哈希处理并转换为范围从 -2^63 到 +2^63-1 的哈希值。我的查询是,我们有不同的数据集,它们有不同的分区键。例如,可以使用 uuid 类型的数据设置分区键,其他可以设置名字和姓氏作为分区键,其他可以设置时间戳作为分区键,还可以在分区键中设置城市名称。

现在假设一个以城市为分区键的数据集,假设

节点 1 存储休斯顿数据

节点 2 存储芝加哥数据

Node 3 故事 Phoenix 数据等等……

并且我们的数据在某一时刻获得更多与芝加哥市的数据条目,然后节点 2 将拥有我们数据库的最大记录,并且在这种情况下会有热点。在这种情况下,Cassandra 将如何设法在这些节点之间均匀分布数据?

4

1 回答 1

4

简而言之 - 它没有。它是带有分区器的确定性哈希函数,因此相同的值将导致每次和环上的位置相同的哈希值。如果您设计一个数据模型,其中 80% 的数据具有相同的分区键,那么 80% 的数据将位于 3 个节点上(假设 RF 3)。

使用具有高基数的分区键可以防止这种情况发生,因为它们会散列到环中的许多不同值和位置。使用诸如城市之类的分区键值,它是一个相对较低的基数值,在非常小的数据集之外的任何场景中都不是一个好的分区键。

开发人员有责任设计一个数据模型,该模型对较大数据集的分区键使用合适的高基数值以避免热点。

于 2022-01-17T13:57:19.350 回答