Cassandra在添加新节点时如何确保一致性

时间:2016-12-21 05:33:56

标签: cassandra consistency

我很困惑cassandra在向集群添加新节点时如何确保一致性。我知道cassandra会进行范围移动并将数据流式传输到新添加的节点。问题是cassandra还将辅助副本的数据流式传输到新添加的节点。

例如,我们在集群中有4个节点,RF = 3(A,B,C,D) A(x = 1,y = 2),B(x = 1,y = 3),C(x = 1),D(y = 2)。分区键“x”将由A,B,C保持,而分区键“y”将由D,A,B保持。如果我在A和B之间添加一个新节点A'。我认为它将从A流分区“x”。但它是否也从B或D流分区“y”?

如果它确实流分区“y”,哪个节点将cassandra选择流式传输?来自official document。它将从D的主副本流传输。如果是这种情况,当D具有过时数据时(在添加新节点之前就可以了,作为A和B以及满足法定数量的最新数据),在流式传输之后,它是可能的从D和A'查询陈旧数据。我是对的吗?

2 个答案:

答案 0 :(得分:1)

Cassandra将从放弃令牌所有权的节点中传输信息

也就是说,在你的例子中:RF = 3(A,B,C,D)A(x = 1,y = 2),B(x = 1,y = 3),C(x = 1) ,D(y = 2)。如果在A之间添加E,则B和A将放弃拥有X到E,B将放弃拥有y。然后A将其X值发送给E,B将其Y值发送给E - 所以最终结果将是A(y = 2),E(X = 1,y = 3),B(x = 1) ),C(x = 1),D(y = 2)。

请注意,添加节点后,A有一个陈旧的X副本,而B有一个陈旧的Y副本,他们应该运行'nodetool cleanup'来摆脱它。

答案 1 :(得分:0)

你可能是对的。在添加新节点之前,建议运行nodetool修复,以使群集中不存在不一致。