【问题标题】:Can cassandra guarantee the replication factor when a node is resyncing it's data?当节点重新同步其数据时,cassandra 可以保证复制因子吗?
【发布时间】:2015-08-20 11:40:01
【问题描述】:

假设我有一个 3 节点集群。

我正在写入节点 #1。

如果该集群中的节点 #2 出现故障,然后重新启动并重新同步来自其他节点的数据,并且我继续写入节点 #1,数据是否会同步复制到节点 #2?也就是说,该写入的复制因子是同步兑现还是在队列后重新同步之后?

谢谢 史蒂夫

【问题讨论】:

    标签: cassandra cassandra-2.0


    【解决方案1】:

    是的,前提是您正在以可以处理 1 个节点变得不可用的一致性级别进行读写。

    考虑以下场景:

    1. 您有一个 3 节点集群,其键空间为“ks”,复制因子为 3。
    2. 您在Consistency Level 'QUORUM' 写信
    3. 您正在阅读的一致性级别为“QUORUM”。
    4. 节点 2 停机 10 分钟。
    5. 当节点关闭时,读取和写入可以成功继续,因为“QUORUM”只需要 2 (3/2+1=2) 个节点可用。当节点 2 关闭时,节点 1 和 3 都为节点 2 维护'hints'
    6. 节点 2 上线。节点 1 和 3 发送他们在节点 2 下降到节点 2 时记录的提示。

    如果发生读取并且协调 cassandra 节点检测到节点缺少数据/不一致,它可能会执行 'read repair'

    如果节点 2 长时间停机,节点 1 和节点 3 可能无法保留所有指向它的提示。在这种情况下,操作员应考虑按计划运行repairs

    还要注意,在读取时,如果 Cassandra 在摘要请求期间发现数据不匹配,它将始终将具有最新时间戳的数据视为正确的数据(请参阅'Why cassandra doesn't need vector clocks')。

    【讨论】:

    • 节点 #2 何时准备好接收新的写入?是在它捕捉到它宕机时发生的写入之后吗?或者是否可以在节点在线但尚未赶上时立即处理新的写入。如果节点#3 在节点#2 完全赶上之前发生故障,那么新的写入请求会发生什么情况?所有这一切,假设一致性级别允许在 3 节点集群中出现单节点故障。
    • @Andy 在示例场景中,如果一个节点出现故障,则写入将失败,因为无法实现 QUORUM。在这种情况下,2 个节点应该确认写入,以使其成功。只有 ONE 的一致性才会成功。
    【解决方案2】:

    Node2 将立即开始接受新的写入以及其他人为此节点存储的任何提示。备份后在节点上运行读取修复是个好主意,这将确保数据与其他节点一致。

    请注意,每列都存储了一个时间戳,这将有助于 cassandra 在运行节点修复时确定哪些数据是最新的。

    【讨论】:

      猜你喜欢
      • 2016-06-23
      • 2018-04-28
      • 1970-01-01
      • 2017-03-25
      • 2023-03-12
      • 2012-04-10
      • 2020-12-22
      • 1970-01-01
      • 2020-02-09
      相关资源
      最近更新 更多