如何在Cassandra中决定复制节点

时间:2017-01-16 14:02:35

标签: cassandra database-replication

我试图了解如何在Cassandra中的多个节点上复制数据。假设我们有6个节点,复制因子是3.为简单起见,我们假设单个数据中心和单个机架。由于RF为3,因此数据存储在3个副本中。我想了解3副本是如何决定的。

参考http://www.datastax.com/dev/blog/virtual-nodes-in-cassandra-1-2中的示例(第一图像第二部分,即虚拟节点),假设我们的行属于虚拟节点' E'由分区决定。因此,根据不同节点之间的虚拟节点分布,该行必须存在于节点1,5,6中。

但是来到文档 - http://docs.datastax.com/en/cassandra/2.1/cassandra/architecture/architectureDataDistributeReplication_c.html,它说即使在SimpleStrategy的简单情况下,节点上的第一个副本也是由分区程序决定的。其他复制品顺时针放置在环的下一个节点上。那么数据是存储在E,F,G虚拟节点中还是可以是节点1,2,3?

哪一个是正确的?第一个链接或文档?

谢谢!

2 个答案:

答案 0 :(得分:2)

如果您真正感兴趣的是分区数据在群集中的最终位置,您可以使用:

nodetool getendpoints

https://docs.datastax.com/en/cassandra/2.1/cassandra/tools/toolsGetEndPoints.html

请注意文档已简化,以便人们在第一次看到时更容易理解。实际上,它对类固醇的一致性哈希。

以前,每个节点都有一个令牌,令牌是环上用于一致性散列的边界。基本上,您将整个范围划分为群集中的节点数。当您需要对某个分区执行操作时,您使用了分区键,对其进行了哈希处理,然后您知道要转到哪个节点。基本上在散列后你得到的数字在-2 ^ 63到2 ^ 63 - 1的范围内。然后顺时针旋转到戒指上,直到你找到"标记,这就是您知道分区最初属于哪个节点的方式。如果你有更大的复制因子,你只需继续按顺时针方向转动,直到你找到"您需要满足复制因子的所有节点。这就是您知道群集中哪些节点具有分区的方式。

对于虚拟节点,有一个属性num_tokens,并且每个节点在加入环时选择那么多随机令牌(在前面提到的范围内),然后它们用于一致性散列。基本上每个节点都会看到新节点想要拥有环的一部分并将数据流传输给它。此外,当新写入进入时,它们将被发送到将拥有它们的新节点(直到节点完全加入环,当计算一致性级别时,它的响应将被忽略)。

之前的情况(集群中每个节点的单个令牌): Standard Consistent Hashing

这是虚拟节点环的样子: Consistent Hashing with vnodes

绝对相同的规则适用于虚拟节点和普通的一致性哈希,你可以绕圈选择 复制品。如果你在环绕环路时再次偶然发现同一个节点,你只需跳过它并继续,直到找到所有拥有数据的节点,根据你想要的复制因子。

答案 1 :(得分:1)

两者都是正确的但我能理解这种混乱。 让我解释一下:

在这种情况下,您的行会落入某个范围。分区程序知道一个节点主要负责此范围。它不知道其他节点。但是,它可以基于第一个节点推断其他节点。

在这种情况下,第一个节点是Five。它包含令牌范围E.现在让我们思考一下这个陈述。

  

其他副本将顺时针放置在环的下一个节点上。

如果您使用的是SimpleStrategy,则从第一个节点顺时针选择下一个节点。在这种情况下,这是六和一。选择一个,因为令牌范围从最大值到最小值。

请注意,节点顺时针排列。五,六,最后一个。因为令牌范围从最大值到最小值。

这是第一个链接中的图片试图通过给3个节点提供E令牌范围来解释的。某些节点负责此令牌范围,因为它们从较早的节点继承行。他们对某些范围负责,因为他们是下一个。