卡桑德拉的原子性和"回滚"

时间:2014-07-01 15:31:09

标签: cassandra atomicity nosql

Cassandra 2.0 documentation包含以下有关原子性的段落:

  

例如,如果使用复制因子为3的写入一致性级别QUORUM,Cassandra会将写入复制到群集中的所有节点,并等待来自两个节点的确认。如果在其中一个节点上写入失败但在另一个节点上成功,则Cassandra报告无法复制该节点上的写入。但是,在另一个节点上成功的复制写入不会自动回滚。

因此,写请求被发送到3个节点,我们等待2个ACK。假设我们只收到1个ACK(超时前)。所以很清楚,如果我们以一致性读取,我们可以读取该值,好的。

但以下哪一项陈述也属实:

  • 可能会发生写入已持久存储在第二个节点上,但节点的ACK丢失了? (注意:即使在读取一致性QUORUM时,这也可能导致读取值!)
  • 可能会发生写入稍后会持续到第二个节点(例如由于提示切换)? (注意:即使在读取一致性QUORUM时,这也可能导致读取值!)
  • 这是不可能的,写入是持久存储在第二个节点上,写入的值最终将通过ReadRepair从节点中删除?
  • 这是不可能的,写入是持久存储在第二个节点上,但是有必要执行手动"撤消"动作?

1 个答案:

答案 0 :(得分:0)

我相信你正在混合原子性和一致性。在节点之间不保证原子性,而一致性是。在最真实的原子性意义上,只写入单个节点中的单个行是原子的。

Cassandra唯一一次写入失败的原因是,当协调员收到请求时,只有很少的副本存在,即它不能满足一致性级别。否则你的第二个陈述是正确的。它将暗示失败的节点(副本)将需要复制此行。

本文介绍了不同的故障情况。 http://www.datastax.com/dev/blog/how-cassandra-deals-with-replica-failure