【问题标题】:How Cassandra make sure consistency when adding a new nodeCassandra 如何在添加新节点时确保一致性
【发布时间】:2016-12-22 04:19:14
【问题描述】:

我对 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' 中查询出陈旧的数据。我说的对吗?

【问题讨论】:

    标签: cassandra consistency


    【解决方案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”来消除它。

    【讨论】:

    • 谢谢施洛米。这是否意味着official document 不准确?
    • 当我查看RangeStreamer中的cassandra源代码时,如果rangemovement为真(默认情况下),这里是选择源节点的代码InetAddress sourceIp = addressList.iterator().next();如何确保它是正在放弃所有权的节点?
    • 看着后备箱(github.com/apache/cassandra/blob/trunk/src/java/org/apache/…)。由于集群中的节点数大于 RF,因此对 RangeStreamer 上的 addRanges 的调用将调用 getAllRangesWithStrictSourcesFor(假设我们设置了 strictConsistency)。 getAllRangesWithStrictSourcesFor 确保传输一致。
    • 是的 Shlomi,这就是我感到困惑的地方,在同一个文件中查看 line279。它只是使用oldEndpoints.iterator().next()选择源节点,我认为不能确保一致性,对吧?
    【解决方案2】:

    你可能是对的。建议在添加新节点之前运行 nodetool repair,以免集群中出现不一致。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      • 2012-10-24
      • 2016-08-16
      • 2015-09-08
      • 1970-01-01
      • 2017-10-29
      • 2014-05-14
      相关资源
      最近更新 更多