【问题标题】:How data will be consistent on cassandra clustercassandra 集群上的数据如何保持一致
【发布时间】:2014-03-11 22:31:36
【问题描述】:

当我阅读有关 cassandra 写入一致性的 datastax 文档时,我有一个疑问。我对 cassandra 如何在以下情况下保持一致状态有疑问:

  • 写入一致性级别 = 法定人数
  • 复制因子 = 3

根据文档,当发生写入时,协调节点会将此写入请求发送到集群中的所有副本。如果一个副本成功而另一个副本失败,则协调节点将向客户端发送错误响应,但节点1成功写入数据并且不会回滚。

在这种情况下,

读取修复(或提示切换或节点工具修复)是否会将不一致的数据从节点 1 复制到节点 2 和节点 3?

如果不是,cassandra 将如何处理不将不一致的数据复制到其他副本?

你能澄清我的问题吗

【问题讨论】:

    标签: cassandra datastax-enterprise datastax cassandra-2.0


    【解决方案1】:

    你完全正确,读修复或其他方法会更新node-2和node-3。 这意味着即使失败的写入最终也会更新其他节点(如果至少有一个成功)。 Cassandra 没有关系数据库那样的回滚功能。

    【讨论】:

    • 我们如何克服这个问题。我不希望我的用户在他的收件箱中看到提交时失败的消息。有什么办法可以避免这个问题吗?
    • 我不知道有什么方法可以避免这种情况,但是您可以做的是在写入失败时重试。这仅适用于该分区键的足够节点可用,否则写入将再次失败。一种选择是将第二次写入的写入一致性级别降低到一个。
    • 感谢您的更新。我希望 Cassandra 能提出一些解决方案。
    【解决方案2】:

    我看不出有什么问题——系统按照你说的做,即两个覆盖一个,并且由于错误消息发送回客户端为“失败”,那么最终状态应该是“失败” " 通过读取修复工具。

    【讨论】:

      【解决方案3】:

      Cassandra Coordinator 节点在其存储中维护失败的副本数据,它会定期重试(3 次左右),如果成功则发送最新数据,否则将截断其存储中的数据。

      如果有任何读查询,Coordinator 节点会向所有副本节点发送请求,它会比较所有副本节点的结果。如果其中一个副本节点没有发送最新数据,则它将向该节点发送读取修复命令以保持节点同步。

      【讨论】:

        猜你喜欢
        • 2020-11-16
        • 2017-05-15
        • 2014-06-26
        • 2011-11-30
        • 1970-01-01
        • 1970-01-01
        • 2012-10-08
        • 2016-03-17
        • 1970-01-01
        相关资源
        最近更新 更多