我是Cassandra的新手,我一度被困在这里。
假设我有一个rf=1的5节点集群(为了简单起见)
Token Ranges
==============
N1 : 1-100
N2 : 101-200
N3 : 201-300
N4 : 301-400
N5 : 401-500
我有一个包含10个分区键的键空间:
ID (PartitionKey) | Name
------------------------
1 Joe
2 Sarah
3 Eric
4 Lisa
5 Kate
6 Agnus
7 Lily
8 Angela
9 Rodger
10 Chris
10个分区键==>表示==>10个哈希值
partitionkey ==> token generated
=================================
1 289 (goes on N3)
2 56 (goes on N1)
3 78 (goes on N1)
4 499 (goes on N5)
5 376 (goes on N4)
6 276 (goes on N3)
7 2 (goes on N1)
8 34 (goes on N1)
9 190 (goes on N2)
10 68 (goes on N1)
如果是这样,那么:
N1 has the partition keys : 2,3,7,8,10
N2 has the partition keys : 9
N3 has the partition keys : 1,6
N4 has the partition keys : 5
N5 has the partition keys : 4
所以我们看到n1与其他节点相比是加载的(根据我的理解)。
请帮助我理解在cassandra、w.r.t分区器和一致散列中数据是如何均匀分布的。
3条答案
按热度按时间hivapdat1#
在cassandra中,数据是基于分区和散列算法分布的。我们还需要为数据分发和复制配置许多其他参数,如复制因子、复制策略、飞贼等。下面是标准的推荐文档。https://docs.datastax.com/en/cassandra-oss/2.2/cassandra/architecture/archdatadistributeabout.html
fcipmucu2#
为了使数据在所有节点之间均匀分布,选择分区密钥是非常重要的。分区键应该是具有非常高基数的东西。
例如,在一个10节点的集群中,选择一个特定国家的状态作为分区键可能不是很理想,因为创建热点的可能性非常高,特别是当记录本身的数量可能不在各个州之间时。然而,选择像邮政编码这样的东西可能更好,甚至比选择像客户姓名或订单号这样的东西更好。如果复合分区键对您的用例有帮助的话,您可以尝试使用它。
balp4ylt3#
你在这里发布的内容有些道理,主要是因为通过散列的数据分发对于较小的数字来说是困难的。但我们再加一个假设。。。假设我们使用vnodes
num_tokens: 4
*设置在cassandra.yaml
.因此,在这个新的假设下,令牌范围分布可能更像这样:
根据此分布,您的密钥现在的放置方式如下:
现在我们发现,距离分配算法中有一个随机分量,而实际的分布情况可能会更好。
与所有数据集一样,随着数据量的增加,数字也会变得更好。我敢肯定,使用1000个分区键和10个分区键,您会看到更好的分布。
另外,随着数据集大小的增加,数据分发将受益于使用设置添加的新节点
allocate_tokens_per_keyspace
. 这将允许令牌分配算法根据密钥空间的复制因子对令牌范围分配做出明智的决定(不那么随机)。num_tokens: 4
被许多CassandraMaven认为是最佳的生产环境。在新算法中,256个令牌的默认值相当高。