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

Chr*_*her 5 atomicity cassandra nosql

卡珊德拉2.0文档包含原子性的以下内容:

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

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

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

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

小智 0

我相信你正在混合原子性和一致性。跨节点不能保证原子性,而可以保证一致性。只有对单个节点中的单个行的写入才是真正意义上的原子性。

Cassandra 唯一一次写入失败的情况是,当协调器收到请求时,活动副本太少,即无法满足一致性级别。否则你的第二个陈述是正确的。它将提示失败的节点(副本)需要复制该行。

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