Cassandra 中的分区程序如何为特定数据集确定哈希函数以确保数据在多个集群中均匀分布?
How the hash function by partitioner in Cassandra is decided for a particular data set to ensure even distribution of data across multiple cluster?
正如我们从 Cassandra 的文档[Link to doc] 中了解到的那样,分区程序应该使数据均匀分布在多个节点上以避免读取热点。 Cassandra 为此提供了多种分区算法 - Murmur3Partitioner、RandomPartitioner、ByteOrderedPartitioner。
Murmur3Partitioner 是 Cassandra 设置的默认分区算法。
它对分区键进行哈希处理,并将其转换为范围从 -2^63 到 +2^63-1 的哈希值。
我的查询是,我们有不同的数据集,它们具有不同的分区键。
例如,一个可以设置分区键为uuid类型的数据,另一个可以设置名字和姓氏作为分区键,其他可以设置时间戳作为分区键,一个也可以在分区键中设置城市名称。
现在假设一个以城市作为分区键的数据集,比方说
节点 1 存储休斯顿数据
节点 2 存储芝加哥数据
节点3故事凤凰数据等...
并且我们的数据在某一时刻获得了更多芝加哥城市的数据条目,那么节点 2 将拥有我们数据库的最大记录,并且在这种情况下会出现热点。在这种情况下,Cassandra 将如何设法在这些节点之间均匀分布数据?
简而言之 - 它没有。它是一个带有分区器的确定性散列函数,因此相同的值每次和在环上的位置都会产生相同的散列值。如果您设计一个数据模型,其中 80% 的数据具有相同的分区键,那么 80% 的数据将位于 3 个节点上(假设 RF 3)。
使用具有高基数的分区键可以防止这种情况发生,因为它们会散列到环中的许多不同值和位置。使用基数相对较低的分区键值(如 city)在超出非常小的数据集的任何情况下都不是好的分区键。
开发人员有责任设计一个数据模型,该模型对较大数据集的分区键使用合适的高基数值以避免热点。
正如我们从 Cassandra 的文档[Link to doc] 中了解到的那样,分区程序应该使数据均匀分布在多个节点上以避免读取热点。 Cassandra 为此提供了多种分区算法 - Murmur3Partitioner、RandomPartitioner、ByteOrderedPartitioner。
Murmur3Partitioner 是 Cassandra 设置的默认分区算法。 它对分区键进行哈希处理,并将其转换为范围从 -2^63 到 +2^63-1 的哈希值。 我的查询是,我们有不同的数据集,它们具有不同的分区键。 例如,一个可以设置分区键为uuid类型的数据,另一个可以设置名字和姓氏作为分区键,其他可以设置时间戳作为分区键,一个也可以在分区键中设置城市名称。
现在假设一个以城市作为分区键的数据集,比方说
节点 1 存储休斯顿数据
节点 2 存储芝加哥数据
节点3故事凤凰数据等...
并且我们的数据在某一时刻获得了更多芝加哥城市的数据条目,那么节点 2 将拥有我们数据库的最大记录,并且在这种情况下会出现热点。在这种情况下,Cassandra 将如何设法在这些节点之间均匀分布数据?
简而言之 - 它没有。它是一个带有分区器的确定性散列函数,因此相同的值每次和在环上的位置都会产生相同的散列值。如果您设计一个数据模型,其中 80% 的数据具有相同的分区键,那么 80% 的数据将位于 3 个节点上(假设 RF 3)。
使用具有高基数的分区键可以防止这种情况发生,因为它们会散列到环中的许多不同值和位置。使用基数相对较低的分区键值(如 city)在超出非常小的数据集的任何情况下都不是好的分区键。
开发人员有责任设计一个数据模型,该模型对较大数据集的分区键使用合适的高基数值以避免热点。