This introduction to Cassandra Replication and Consistency(幻灯片14-15)大胆断言:
R+W>N
保证读写仲裁的重叠。请想象这种不平等有巨大的毒牙,滴血 无辜的,企业开发人员,所以你可以最好地欣赏 它激发了恐怖。
我理解读取和写入一致性级别(R + W)的总和大于复制因子(N)是一个好主意...但是什么是重要的是什么?
有什么影响,以及R + W&n; N与替代方案相比如何?
答案 0 :(得分:29)
我们要解决的基本问题是:
是否会出现读取未返回最新值的情况?
显然,如果可能,最好避免这种情况!
如果R + W <= N,则可能出现这种情况。
写入可以向一组节点发送新值,而后续读取可以从完全独立的节点组中读取,从而错过写入的新值。
如果R + W&gt; N,那么这种情况保证不会发生。
有N个节点可能保存该值。写入联系至少W个节点 - 在每个节点上放置“write”标签。随后的读取联系人至少有R个节点 - 在每个节点上放置一个“read”标签。有R + W贴纸但只有N个节点,所以至少有一个节点必须有两个贴纸。也就是说,至少有一个节点参与读取和写入,因此能够将最新的写入返回到读取操作。
R + W&gt;&gt; N是不可能的。
您可以读取或写入的最大节点数是N(根据定义,复制因子)。因此,我们可以得到的最多是R = N和W = N,即R + W = 2N。这对应于ConsistencyLevel ALL的读写。也就是说,你只需要写入所有节点并从所有节点读取,就不会发生任何幻想。
答案 1 :(得分:4)
Quorum write和Quorum read允许检测无前导复制系统中的陈旧值。
例如,我们有3个复制子A,B,C(N = 3)。用户更新期间C已关闭。 A和B都接受更新(写入= 2)。
当用户读取值时,C返回。可以读取C中的陈旧值。为了检测陈旧值,用户还将从B读取(读取= 2)。
当用户收到来自B和C的更新时,可以使用版本号来确定哪个值更新(B有更新的版本号)。
在这种情况下,其中Write = 2,Read = 2,N = 3,R + W&gt; 3,我们确信可以检测到任何过时的值。
对于R + W = 3,可以用A和B编写,但只能从C读取。在这种情况下,我们无法检测到陈旧值。
答案 2 :(得分:0)
Cassandra使用无领导复制。这意味着没有一个节点可以提供最新的或正确的值。因此,我们将不得不采用更加民主的方式(对于多个键)读取值(例如,查询多个节点),然后得出正确的值。
让我们通过示例来理解它:
对于所有示例,假设有3个副本,即N = 3。三个节点分别是A,B,C
R = 1,W = 1,N = 3
这基本上意味着我们将存储3个相同数据的副本,但是我们已经配置为即使一个节点响应,也认为读写成功。
现在,让我们来看一下将x的值从当前值3更新为5的情况。 在写入过程中,假设由于某种原因(节点的W值为1)仅在节点A上成功写入,因此将其视为成功写入。
现在在读取过程中,我们可以得到以下值:
节点A是否可达;客户端读取的值为5(即获取正确的值)
如果节点A无法访问/关闭。客户端获得陈旧值3。
很明显,此配置(R + W
R = 1,W = 2,N = 3
在这里,尽管正在对两个节点进行写操作,但仍然只能从1个节点确认仍可以读取。仍然可以从没有最新值的节点进行读取。 很明显,此配置(R + W = N)无法提供一致的读取结果。
R = 2,W = 2,N = 3
因此只有R + W> N才能保证读取的一致性。
您可以探索更多选项here。