正如我们从Cassandra的文档[Link to doc]中所知,partitioner应该使数据均匀分布在多个节点上,以避免读取热点。Cassandra为此提供了各种分区算法-Murmur3Partitioner、RandomPartitioner、ByteOrderedPartitioner。
Murmur3Partitioner是Cassandra设置的默认分区算法。它对分区键进行散列,并将其转换为范围从-2^63到+2^63-1的散列值。我的问题是,我们有不同的数据集,它们有不同的分区键。例如,一个可以用uuid类型的数据设置分区键,另一个可以将名字和姓氏设置为分区键,其他可以将时间戳设置为其分区键,还可以在分区键中设置城市名称。
现在假设一个以城市为分区键的数据集,比如
节点1存储休斯顿数据
节点2存储芝加哥数据
节点3故事凤凰城数据等…
我们的数据在一瞬间获得了芝加哥市的更多数据条目,然后节点2将拥有我们数据库的最大记录,在这种情况下会有热点。在这种情况下,Cassandra将如何在这些节点上均匀分布数据?
简而言之,它不是。它是一个带有partitioner的确定性哈希函数,因此相同的值将在环上的每次时间和位置产生相同的哈希值。如果您设计了一个数据模型,其中80%的数据具有相同的分区键,那么80%的数据将位于3个节点上(假设RF 3(。
使用具有高基数的分区键可以防止这种情况,因为它们会散列到环中许多不同的值和位置。在非常小的数据集之外的任何场景中,使用分区键值(如city(都不是一个好的分区键值,因为city是一个相对较低的基数值。
开发人员有责任设计一个数据模型,该模型在较大的数据集上为分区键使用合适的高基数值,以避免热点。