Cassandra 集群上的数据分区和复制

Data Partitioning and Replication on Cassandra cluster

我有一个 RF=3 的 3 节点 Cassandra 集群。现在,当我执行 nodetool status 时,集群中每个节点的 owns 为 100%。

但是当我在集群中有 5 个节点时,RF = 3。 拥有是60%(大约如下图所示)。

现在,根据我的理解,分区程序将计算对应于第一个副本节点的哈希,并且数据也将根据其他节点上的 RF 进行复制。 现在我们有一个 5 节点集群,RF 为 3。

不应该 3 个节点平均拥有所有数据(100%),因为分区程序将根据分区策略指向一个节点,然后将相同的数据复制到等于 RF-1 的其余节点?这就像数据在所有节点(5)之间均匀分布,即使 RF 为 3。

编辑 1:

根据我的理解,每个节点 60%(大约)owns 的原因是因为 RF 是 3。这意味着每行将有 3 个副本。这意味着将有 300% 的数据。现在集群中有 5 个节点,分区程序将使用默认的随机哈希算法,该算法将数据均匀分布在集群中的所有节点上。

但现在的问题是我们检查了我们集群的所有节点,即使 RF 为 3,所有节点都包含所有数据。

编辑2:

@Aaron 我按照评论中的说明做了。我创建了一个包含 3 个节点的新集群。

我创建了一个 Keyspace "test" 并将 class 设置为 simplestrategy 并将 RF 设置为 2。

然后我创建了一个 table "emp" 具有分区键 (id,name)。

现在我在第一个节点中插入了一行。

根据您的解释,它应该只在 2 个节点中,因为 RF=2。

但是当我登录所有 3 个节点时,我可以看到在所有节点中复制的行。

我认为由于键空间在所有节点中被复制,因此数据也在被复制。

添加节点时复制到其他节点的数据不会自动清除 - 您需要在将新节点添加到集群后在 "old" 节点上调用 nodetool cleanup。这将删除移动到其他节点的范围。

所有权百分比(完全)不受实际数据的影响。您可以将一个新节点添加到单个节点集群 (RF=1),它会立即说每个节点占 50%。

所有权百分比纯粹是关于节点负责的令牌范围的百分比。添加节点时,将重新计算令牌范围,但数据实际上不会移动,直到发生流式传输事件。同样,直到 cleanup.

数据才真正从其原始节点中删除

例如,如果您有一个 RF 为 3 的 3 节点集群,则每个节点都将处于 100%。添加一个节点(RF=3),所有权百分比下降到大约 75%。添加第 5 个节点(再次保持 RF=3),每个节点的所有权正确地下降到大约 3/5,或 60%。同样,RF 为 3 时,每个节点都负责一组主要、次要和第三令牌范围。

the default random hashing algorithm which will distribute the data evenly across all the nodes in the cluster.

实际上,使用 Murmur3 分区器的分布式哈希将平均分配令牌范围,而不是 数据。这是一个重要的区别。如果您将所有数据写入单个分区,我保证您不会获得均匀的数据分布。