【问题标题】:How are nodes decided for replication in CassandraCassandra中的节点是如何决定复制的
【发布时间】:2017-05-31 09:28:52
【问题描述】:

我试图了解数据在 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?

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

谢谢!

【问题讨论】:

    标签: cassandra database-replication


    【解决方案1】:

    两者都是正确的,但我能理解其中的困惑。 让我解释一下:

    在这种情况下,您的行属于某个范围。分区器知道一个节点主要负责这个范围。它不知道其他节点。但是它可以根据第一个节点推断出其他节点。

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

    额外的副本被放置在环顺时针方向的下一个节点上。

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

    注意节点是顺时针排列的。五,六,最后一。由于令牌范围从最大值到最小值。

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

    【讨论】:

    • 我假设您指的是第一个图像,第二部分(带有虚拟节点)。如果是这种情况,则虚拟节点 E 位于节点 1、5、6 之下,虚拟节点 B 位于节点 1、4、6 之下。假设环中的节点的顺序为 1、2、3、4、5、6。现在,如果一行落在虚拟节点 E 下,它会被复制到节点 1、5、6。但如果它落在虚拟节点 B 下,它会按照第一个链接落在 1、4、6 下。但它与第二个链接相矛盾吗?
    • 我指的是第一张图片中的第一部分。没有vnodes的环。没有vnodes,主令牌范围之后的令牌范围顺时针由下一个节点拥有。但是,对于 vnode,所有范围都随机分配给节点。这意味着任何节点都可以持有下一个令牌范围。他们排在第二位,因为他们负责主要令牌范围之后的令牌范围。
    • 是的,您正确地指出“附加副本被放置在顺时针到环的下一个节点上。”但我对他们给出的与文档示例相矛盾的示例感到困惑。可能这个例子只是为了基本的理解。谢谢你的回答
    【解决方案2】:

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

    nodetool getendpoints
    

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

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

    以前每个节点都有一个标记,标记是环上的边界,用于一致的散列。基本上,您将整个范围划分为集群中的节点数量。当您需要对某个分区进行操作时,您获取分区键,对其进行哈希处理,然后您就知道该去哪个节点了。基本上在散列之后,你会得到一个范围为 -2^63 到 2^63 - 1 的数字。然后你在环上顺时针移动,直到你“找到”一个标记,这就是你知道分区最初属于哪个节点的方式。如果您有更大的复制因子,您只需继续在环上顺时针移动,直到“找到”您需要满足复制因子的所有节点。这就是您知道集群中哪些节点拥有您的分区的方式。

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

    这是以前的情况(集群中每个节点一个令牌):

    这是环与虚拟节点的样子:

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

    【讨论】:

    • 我现在无法访问 Cassandra 集群,我认为本地设置无法帮助回答我的问题。但我相信你说得对:“请考虑到文档已被简化,以便人们在第一次看到时更容易理解它。实际上,它是类固醇上的一致哈希。”可能是示例仅用于基本理解。将您的答案标记为已接受。再次感谢。
    猜你喜欢
    • 2021-08-10
    • 2015-12-28
    • 2020-06-28
    • 2019-08-29
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多