2014-02-13 42 views
0

我有一个疑问,当我阅读有关cassandra写入一致性的datastax文档时。我有卡桑德拉将如何保持对以下情形一致状态的问题:cassandra集群上的数据如何保持一致

  • 写一致性水平=法定人数
  • 复制因子= 3

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

在这种情况下,

将读取自修复(或暗示的切换或nodetool修复)从节点-1不一致的数据复制到节点2和节点3?

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

能否请你澄清我的问题

回答

2

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

+0

我们如何克服这个问题。我不希望我的用户在提交时失败的收件箱中看到邮件。有没有什么解决方法可以避免这个问题? – suresh

+0

我不知道有什么办法可以避免这种情况,但是您可以做的是在失败的写入中再次尝试。只有当该分区键有足够的节点可用时,这才起作用,否则写入将再次失败。 一种选择是将第二次写入的写入一致性级别降低为1。 – Navid

+0

感谢您的更新。我希望卡桑德拉能提出一些解决方案。 – suresh

0

我没有看到有什么不对 - 系统做你告诉它的事情,即两个覆盖一个,并且由于错误消息以“失败”的形式发送回客户端,那么最终状态应该是“失败“通过阅读修复工具。

0

Cassandra协调器节点在其存储器中维护失败的副本数据,并且会周期性地重试(3次左右),如果成功则会发送最新数据,否则会截断存储器中的数据。

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