CL Quorum 是不是可以进行脏读?

Posted

技术标签:

【中文标题】CL Quorum 是不是可以进行脏读?【英文标题】:Is it possible to have dirty reads with CL Quorum?CL Quorum 是否可以进行脏读? 【发布时间】:2015-07-24 14:32:09 【问题描述】:

基于

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

写一致性

一致性级别决定了在向客户端应用程序返回确认之前写入必须成功的副本数

读取一致性:

一致性级别指定在将数据返回到客户端应用程序之前必须有多少副本响应读取请求。

这意味着,如果我在同一个客户端应用程序(并且可能是同一个线程)中将 CL 指定为读写的 Quorum,我在写入之后(同样,使用 CL = Quorum)读取数据(使用 CL = Quorum CL = Quorum) 确保我获得最新数据。

但我不太清楚的是:这是否也适用于同一应用程序中的不同进程和不同线程?

是否可以指定 CL = Quorum 却错过更新(旧数据)或脏读?

更新:

为了澄清,我不是在谈论 CL QUORUM 完成之后。问题更接近于这些方面:

如果在写入过程中 (@QUORUM) 连接到同一个集群的另一个进程尝试使用 CL = QUORUM 读取同一个分区,是否可以读取旧数据?

假设写入尚未完成对所有副本的写入,因此 CL 尚未满足并发生读取。是否有可能写入仅写入一个节点(并且正在复制过程中),因此,当读取(CL = QUORUM)进入时,它会读取较旧的数据?节点是否知道它们应该“等待”直到写入完成

非常感谢,

【问题讨论】:

【参考方案1】:

只要读取和写入都在 QUORUM 上完成,它将是一致的。由于超过一半的人看到了写入,超过一半的人正在返回读取,所以肯定会有一些重叠。

【讨论】:

谢谢克里斯。情况是否如此,即使在写入过程中(@QUORUM),连接到同一集群的另一个进程尝试使用 CL = QUORUM 读取同一分区?我的意思是写入尚未完成对所有副本的写入,因此 CL 尚未满足并发生读取。是否有可能写入仅写入一个节点(并且正在复制过程中),因此,当读取(CL = QUORUM)进入时,它会读取较旧的数据?节点是否知道它们应该“等待”直到写入完成? 如果您在写入过程中进行读取,则仍可能读取旧值。在确认写入之前,它与 QUORUM 不一致。【参考方案2】:

有一个官方公式可以知道您是否会立即实现一致性(= 没有停滞的数据) 如果 NUM_READ + NUM_WRITE > 复制因子,则立即一致性

所以如果 RF 是 3 ,quorum = 2 所以如果读写都 = QUORUM ,那么 2 + 2 > 3 = 立即一致性

但是如果你已经 read = QUORUM 并且 write = ONE 然后 2 + 1 = 3 ,你只会得到最终的一致性

【讨论】:

以上是关于CL Quorum 是不是可以进行脏读?的主要内容,如果未能解决你的问题,请参考以下文章

什么是脏读,幻读和不可重复读

SQL 脏读

Quorum Software宣布与斯伦贝谢建立新一代规划和经济合作关系

尽管复制因子为 3 的 QUORUM 一致性级别,Cassandra 仍不一致

脏读不可重复读幻读

脏读和幻读