Cassandra的原子性和“回滚”

5

Cassandra 2.0 documentation中关于原子性的段落如下:

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

因此,写请求被发送到3个节点,我们正在等待2个ACK。假设我们只收到1个ACK(在超时之前)。那么很明显,如果我们使用一致性级别ONE进行读取,我们可以读取该值。

但以下哪种说法也是正确的:

  • 可能发生的情况是,写入已经持久化在第二个节点上,但该节点的ACK丢失了?(注意:这可能导致在读一致性QUORUM的情况下读取该值!)
  • 可能发生的情况是,写入稍后将持久化到第二个节点(例如由于暗示式转交)?(注意:这可能导致在读一致性QUORUM的情况下读取该值!)
  • 不可能发生的情况是,写入已经持久化在第二个节点上,但通过ReadRepair最终从节点中删除了写入的值?
  • 不可能发生的情况是,写入已经持久化在第二个节点上,但需要执行手动的“撤销”操作吗?
1个回答

0

我认为您混淆了原子性和一致性。原子性不能在节点之间保证,而一致性可以。只有在单个节点的单个行中写入才能真正实现原子性。

Cassandra仅在协调器接收请求时存活的副本太少无法满足一致性级别时才会失败写入。否则,您的第二个语句是正确的。它将提示需要复制此行的故障节点(副本)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接