以下来自Cassandra文件的陈述是我怀疑的原因。
例如,如果使用复制因子为3的写入一致性级别QUORUM,Cassandra会将写入复制到群集中的所有节点,并等待来自两个节点的确认。如果在其中一个节点上写入失败但在另一个节点上成功,则Cassandra报告无法复制该节点上的写入。但是,在另一个节点上成功的复制写入不会自动回滚。
参考:http://docs.datastax.com/en/cassandra/2.1/cassandra/dml/dml_atomicity_c.html
即使无法满足一致性,Cassandra也会写入节点(已启动)?
答案 0 :(得分:3)
Cassandra的一致性可以(是?)在声明级别定义。这意味着您可以在特定查询上指定所需的一致性级别。
这意味着如果未达到一致性级别,则上面的 语句不符合一致性要求。
Cassandra中没有回滚。你在Cassandra所拥有的是最终的一致性。这意味着,如果不是立即,您的陈述将来可能会成功。当副本节点生效时,群集(也称为Cassandra的容错)将负责写入副本节点。
因此,如果您的陈述失败,将来可能会成功。这与 RDBMS 世界相反,其中未提交的事务将回滚,就像没有发生任何事情一样。
<强>更新强> 我纠正了。谢谢阿伦。
来自:
http://docs.datastax.com/en/cassandra/2.0/cassandra/dml/dml_about_hh_c.html
在写入操作期间,当启用提示切换并且可以满足一致性时,协调器会在以下任一条件下在本地system.hints表中存储有关死副本的提示:
所以它仍然不回滚。节点知道当前的集群状态,如果不能满足一致性,则不会启动写入。
答案 1 :(得分:3)
我明白了。如果卡桑德拉知道无法满足一致性,他甚至都不会尝试写作。如果可以满足一致性,但没有足够的副本来满足复制因子,那么Cassandra会写入当前可用的副本并给出成功消息。稍后当副本再次启动时,它将写入其他副本。
例如如果复制因子为3,则3个节点中的1个节点关闭,那么如果我使用2的一致性写入,则写入将成功。但是如果复制因子为2并且2个节点中的1个都关闭,那么如果我使用2的一致性写入,Cassandra甚至不会写入可用的单个节点。
文档中提到的是在可以满足一致性的同时启动写入的情况。但在两者之间,一个节点发生故障而无法完成写入,而写入在另一个节点中成功。由于无法满足一致性,客户端将收到失败消息。写入单个节点的记录稍后将在节点修复或压缩期间删除。
答案 2 :(得分:1)
在驱动程序级别,您会遇到异常。
在写入成功的节点上,实际写入数据并最终回滚。
在正常情况下,您可以认为数据未写入任何节点。
如果在其中一个节点上写入失败但在另一个节点上成功, Cassandra报告无法复制该节点上的写入。 但是,在另一个节点上成功的复制写入不是 自动回滚。