节点如何决定在 Cassandra 中进行复制
How are nodes decided for replication in Cassandra
我想了解数据在 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?
哪个是正确的?第一个 link 或文档?
谢谢!
两者都是正确的,但我能理解其中的困惑。
让我解释一下:
在这种情况下,您的行属于某个范围。分区程序知道一个节点主要负责这个范围。它不知道其他节点。但是它可以根据第一个节点推断出其他节点。
在这种情况下,第一个节点是五。它持有令牌范围E。现在让我们思考一下这个说法。
Additional replicas are placed on the next nodes clockwise to the ring.
如果您使用的是 SimpleStrategy,则从第一个节点开始顺时针选择下一个节点。在这种情况下是六加一。 选择了一个,因为令牌范围从最大值到最小值。
注意节点是顺时针排列的。五、六,最后是一。由于令牌范围从最大值到最小值。
这就是第一个 link 中的图片试图通过给 3 个节点 E 令牌范围来解释的内容。一些节点负责此标记范围,因为它们从较早的节点继承行。他们负责某些范围,因为他们排在下一个。
如果您真的对分区数据在集群中的最终位置感兴趣,您可以使用:
nodetool getendpoints
https://docs.datastax.com/en/cassandra/2.1/cassandra/tools/toolsGetEndPoints.html
请考虑到文档已简化,以便人们在第一次看到时更容易理解。实际上,它是类固醇的一致散列。
以前每个节点都有一个令牌,令牌是用于一致性哈希的环上的边界。基本上,您将整个范围划分为集群中的节点数。当你需要对某个分区进行操作时,你可以获取分区键,对其进行哈希处理,然后你就知道要去哪个节点了。基本上在散列之后你得到一个 -2^63 到 2^63 - 1 范围内的数字。然后你在环上顺时针方向移动直到你 "find" 一个标记,这就是你知道分区属于哪个节点的方式最初。如果你有更大的复制因子,你就继续在环上顺时针方向移动,直到你 "find" 所有你需要满足复制因子的节点。这就是您知道集群中哪些节点有您的分区的方式。
对于虚拟节点,有一个 属性 num_tokens 并且每个节点 select 在加入环时有许多随机令牌(在前面提到的范围内),然后它们用于一致性哈希。基本上每个节点都会看到新节点想要拥有环的一部分并将数据流式传输到它。此外,当新的写入进入时,它们将被发送到将拥有它们的新节点(直到节点完全加入环,在计算一致性级别时忽略它的响应)。
这是以前的样子(集群中每个节点一个令牌):
这是带有虚拟节点的环的样子:
绝对相同的规则适用于虚拟节点和普通的一致性哈希,你绕过环 select
复制品。如果在绕环过程中再次偶然发现同一个节点,您只需跳过它并继续,直到根据您想要的复制因子找到拥有数据的所有节点。
我想了解数据在 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?
哪个是正确的?第一个 link 或文档?
谢谢!
两者都是正确的,但我能理解其中的困惑。 让我解释一下:
在这种情况下,您的行属于某个范围。分区程序知道一个节点主要负责这个范围。它不知道其他节点。但是它可以根据第一个节点推断出其他节点。
在这种情况下,第一个节点是五。它持有令牌范围E。现在让我们思考一下这个说法。
Additional replicas are placed on the next nodes clockwise to the ring.
如果您使用的是 SimpleStrategy,则从第一个节点开始顺时针选择下一个节点。在这种情况下是六加一。 选择了一个,因为令牌范围从最大值到最小值。
注意节点是顺时针排列的。五、六,最后是一。由于令牌范围从最大值到最小值。
这就是第一个 link 中的图片试图通过给 3 个节点 E 令牌范围来解释的内容。一些节点负责此标记范围,因为它们从较早的节点继承行。他们负责某些范围,因为他们排在下一个。
如果您真的对分区数据在集群中的最终位置感兴趣,您可以使用:
nodetool getendpoints
https://docs.datastax.com/en/cassandra/2.1/cassandra/tools/toolsGetEndPoints.html
请考虑到文档已简化,以便人们在第一次看到时更容易理解。实际上,它是类固醇的一致散列。
以前每个节点都有一个令牌,令牌是用于一致性哈希的环上的边界。基本上,您将整个范围划分为集群中的节点数。当你需要对某个分区进行操作时,你可以获取分区键,对其进行哈希处理,然后你就知道要去哪个节点了。基本上在散列之后你得到一个 -2^63 到 2^63 - 1 范围内的数字。然后你在环上顺时针方向移动直到你 "find" 一个标记,这就是你知道分区属于哪个节点的方式最初。如果你有更大的复制因子,你就继续在环上顺时针方向移动,直到你 "find" 所有你需要满足复制因子的节点。这就是您知道集群中哪些节点有您的分区的方式。
对于虚拟节点,有一个 属性 num_tokens 并且每个节点 select 在加入环时有许多随机令牌(在前面提到的范围内),然后它们用于一致性哈希。基本上每个节点都会看到新节点想要拥有环的一部分并将数据流式传输到它。此外,当新的写入进入时,它们将被发送到将拥有它们的新节点(直到节点完全加入环,在计算一致性级别时忽略它的响应)。
这是以前的样子(集群中每个节点一个令牌):
这是带有虚拟节点的环的样子:
绝对相同的规则适用于虚拟节点和普通的一致性哈希,你绕过环 select 复制品。如果在绕环过程中再次偶然发现同一个节点,您只需跳过它并继续,直到根据您想要的复制因子找到拥有数据的所有节点。