根据我从这个answer收集到的信息,如果未达到写入仲裁,cassandra 不会回滚持久写入的数据库中的写入。
拥有写入法定人数有什么意义?它与尽力写入或向所有节点发送写入并仅等待一次成功有何不同?
使用
QUORUM
进行写入的目的是提供保证,当这些写入成功时,使用 QUORUM
进行的后续读取将保持一致。
确实,写入不会回滚,并且 Cassandra 具有最终将写入传播到所有副本的机制 - 提示、修复、读取修复。然而,这些机制都不能保证使用
QUORUM
的读取查询结果将返回最新版本的数据。
另一方面,当使用
QUORUM
写入成功时,使用QUORUM
读取相同数据将始终保持一致,因为至少有1个副本参与读取请求,同时还涉及最新的 QUORUM
写入,返回最新数据。即使在 QUORUM
读取中只有 1 个副本保持一致的情况下,Cassandra 也会在返回结果之前通过阻塞读取修复来解决不一致问题。
如果您使用任何低于
QUORUM
的写入一致性,即使您使用 QUORUM
进行读取,也不能保证读取请求将从写入语句中成功的副本中读取。
如果您以一致性级别写入
ALL
,那么您将失去 Cassandra 的高可用性 - 导致停机所需的只是一个不可用的节点。
保证读取数据一致性的公式为:
读取一致性级别 + 写入一致性级别 > 复制因子
通常,读取和写入一致性级别的
LOCAL_QUORUM
是可用性和数据一致性的最佳点。
我希望这有帮助。