【问题标题】:Data Partitioning and Replication on Cassandra clusterCassandra 集群上的数据分区和复制
【发布时间】:2019-01-18 11:08:22
【问题描述】:

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

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

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

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

编辑1

据我了解,每个节点 60%(大约)拥有的原因是因为 RF 为 3。这意味着每行将有 3 个副本。这意味着将有 300% 的数据。现在集群中有 5 个节点,partitioner 将使用默认的随机散列算法,将数据均匀地分布在集群中的所有节点上。

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

编辑2

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

我创建了一个 Keyspace“测试”并将类设置为最简单的策略,并将 RF 设置为 2。

然后我创建了一个具有分区键 (id,name) 的表“emp”。

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

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

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

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

【问题讨论】:

    标签: database cassandra nosql cassandra-3.0


    【解决方案1】:

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

    所有权百分比纯粹是关于节点负责的令牌范围的百分比。添加节点时,会重新计算令牌范围,但在流事件发生之前数据实际上不会移动。同样,直到cleanup,数据才会真正从其原始节点中删除。

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

    默认的随机散列算法,它将数据均匀地分布在集群中的所有节点上。

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

    【讨论】:

    • Aron 我明白你关于有效所有权(拥有)的观点,它与均匀分布在所有节点上的令牌范围有关。但是我不明白我在一个节点中插入的所有行是如何只在所有 5 个节点上复制的,即使我的 RF 是 3。根据我的理解,它应该只在 3 个节点上。这就是RF告诉我们的。但是为什么我能够看到所有 5 个节点的所有数据?
    • 另外,您能否告诉您“如果您将所有数据写入单个分区,我保证您不会得到均匀分布的数据”是什么意思。分区到底是什么?
    • @YugSingh 你怎么知道 100% 的数据在每个节点上?您是否通过跟踪查询和验证?如果确实如此,那可能是因为您指定了多个逻辑机架。
    • 如果你将所有数据写入同一个分区键,你的数据将全部集中在 3 个节点上,而 2 则完全为空。
    • Aaron 我明白我哪里出错了。我进行了跟踪,发现所涉及的节点数确实等于复制因子。
    【解决方案2】:

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

    【讨论】:

    • Alex 我调用了nodetool cleanup 命令,但nodetool status 仍然显示与问题中提到的相同的%。但是所有者并不令人困惑,而是即使密钥空间 RF 为 3,集群的所有 5 个节点都拥有所有数据这一事实。不应该只有 3 个节点保存数据,其余 2 个节点不应该。你能解释一下吗?
    • 您是如何检查该节点是否有数据的?通过向它发送请求?
    • 我在所有节点中执行了“cqlsh”,无论复制因子如何,我都可以看到在所有节点中复制了相同的数据。例如,如果我有 5 个节点,RF 为 2。所有 5 个节点都具有相同的数据。
    • 在 Cassandra 中,您可以向任何节点发送请求,即使它不拥有给定范围,它也会简单地将请求转发到“拥有”该数据的节点。在这种情况下,节点被称为“协调节点”......我建议阅读docs.datastax.com/en/dse/6.0/dse-arch - 它很好地概述了 Cassandra 架构(尽管有一些 DataStax 细节)
    猜你喜欢
    • 2019-09-07
    • 2020-09-27
    • 2014-09-16
    • 1970-01-01
    • 2017-05-20
    • 2011-01-09
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    相关资源
    最近更新 更多