即使无法满足​​一致性,Cassandra 是否会写入一个节点(已启动)?

Does Cassandra write to a node(which is up) even if Consistency cannot be met?

Cassandra 文档中的以下声明是我怀疑的原因。

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

参考:http://docs.datastax.com/en/cassandra/2.1/cassandra/dml/dml_atomicity_c.html

即使无法满足​​一致性,Cassandra 也会写入节点(已启动)吗?

在驱动级别,你得到一个异常。

在写入成功的节点上,真正写入了数据,最终会回滚。

正常情况下,可以认为数据没有写入任何一个节点。

From the documentation:

If the write fails on one of the nodes but succeeds on the other, Cassandra reports a failure to replicate the write on that node. However, the replicated write that succeeds on the other node is not automatically rolled back.

Cassandra 中的一致性可以(是?)在语句级别定义。这意味着您在特定查询上指定所需的一致性级别。

这将意味着如果不满足一致性级别,上面的语句不满足一致性要求。

Cassandra 中没有回滚。你在 Cassandra 中拥有的是最终一致性。这意味着您的声明即使不是立即成功,也可能在未来获得成功。当副本节点上线时,集群(又名 Cassandra 的容错)将负责写入副本节点。

所以,如果你的陈述失败了,它可能会在未来成功。这与 RDBMS 世界相反,其中回滚未提交的事务,就好像什么都没发生一样。

更新: 我的立场得到纠正。谢谢阿伦。

发件人:

http://docs.datastax.com/en/cassandra/2.0/cassandra/dml/dml_about_hh_c.html

During a write operation, when hinted handoff is enabled and consistency can be met, the coordinator stores a hint about dead replicas in the local system.hints table under either of these conditions:

所以还是没有回滚。节点知道当前的集群状态,如果无法满足一致性,则不会启动写入。

我明白了。如果 Cassandra 知道无法满足一致性,它甚至不会尝试写入。如果可以满足一致性,但没有足够的副本来满足复制因子,那么 Cassandra 将写入当前可用的副本并给出成功消息。稍后当副本再次启动时,它将写入其他副本。

例如如果复制因子为 3 ,则 3 个节点中有 1 个已关闭,那么如果我以 2 的一致性写入,写入将成功。但是如果复制因子是 2 并且 2 个节点中的 1 个出现故障,那么如果我以 2 的一致性写入,Cassandra 甚至不会写入可用的单个节点。

文档中提到的是在满足一致性的情况下发起while write的情况。但在这期间,一个节点宕机无法完成写入,而另一节点写入成功。由于无法满足一致性,客户端将收到失败消息。写入单个节点的记录将在稍后的节点修复或压缩过程中被删除。