【问题标题】:What will happen if write failed in cassandra cluster when using QUORUM CL?如果使用 QUORUM CL 在 cassandra 集群中写入失败会发生什么?
【发布时间】:2018-06-26 06:10:15
【问题描述】:

假设我有 3 个节点,RF 为 3,并使用 QUORUM CL。当我将数据记录写入集群时,如果一个节点成功,则一个节点失败。那么整个写请求都失败了,那么succeed节点怎么办呢?会自动回滚吗?或者它将通过八卦传播到其他节点。最后,即使原始请求失败,3个节点都会有记录?

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    shutty 的回答在微妙的方面是错误的,尽管所引用的文章是正确的并且是一个很好的来源。前三点似乎是正确的:

    • 查询协调器将尝试根据 RF=3 在所有节点上持久化您的写入。如果其中 2 个失败,则认为 CL=QUORUM 写入失败。
    • 接受失败写入的单个节点不会回滚它。由于没有发生任何可疑的事情,它会将其保存在内存表/磁盘上。
    • Cassandra 是一个最终一致的数据库,因此它在一段时间内处于不一致状态,但在未来会收敛到一致状态是绝对没问题的。

    但是最后两个似乎是错误的,这里是更正的版本:

    • 下次读取 (CL=QUORUM) 之前写入失败的密钥时,如果仍然没有足够的节点在线,则会读取失败。如果之前写入失败的两个节点在线(而不是成功写入的节点),您将收到之前的值,不受写入失败的影响。
    • 如果写入成功的节点也在线,QUORUM 读取会导致读取修复导致写入新值失败的节点更新为新值,然后返回。 (注意:“较新”一词是时间戳的含义,因此即使数据是最近写入的,它也有可能具有较旧的时间戳 -> 此集群以不一致的状态启动。)

    【讨论】:

    • 所以首先我返回我的写入失败,当我读取我的数据时,“失败”的写入数据将自行修复,现在它已写入磁盘??!
    • @J.Doe 根据我对此的搜索,这是真的。
    【解决方案2】:

    有一个article about it。 TL&DR 版本:

    • 查询协调器将尝试根据 RF=3 在所有节点上持久化您的写入。如果其中 2 个失败,则认为 CL=QUORUM 写入失败。
    • 接受失败写入的单个节点将回滚它。由于没有发生任何可疑的事情,它会将其保存在内存表/磁盘上。
    • Cassandra 是一个最终一致的数据库,因此在一段时间内处于不一致状态但在未来收敛到一致状态绝对没问题。
    • 下次读取 (CL=QUORUM) 之前写入失败的密钥时,如果仍然没有足够的节点在线,则会读取失败。如果其他 2 个节点恢复运行,它们将读取仲裁(即使该键的第三个节点数据不同)并且您将收到先前的值,不受写入失败的影响。
    • 如果 Cassandra 检测到单个密钥的此类冲突,它会执行 读取修复 过程,当冲突的少数节点数据将被来自仲裁多数的数据覆盖时。因此,接受失败写入的节点将在下一次成功的仲裁读取时自我修复不一致的行。

    【讨论】:

    • 您应该看看另一个答案,因为它不同意您的一些观点。如果这些点是正确的,您可能需要编辑您的答案,因为您的答案是公认的。
    猜你喜欢
    • 2020-09-18
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    相关资源
    最近更新 更多