Lef*_*ium 24 replication cluster-computing cassandra
对Cassandra复制和一致性的介绍(幻灯片14-15)大胆地断言:
R+W>N保证读写仲裁的重叠.请想象一下,这种不平等有巨大的痛苦,滴着无辜的企业开发者的鲜血,所以你最能体会到它激发的恐怖.
我知道读取和写入一致性级别(R + W)的总和大于复制因子(N)是一个好主意......但有什么大不了的?
有什么影响,R + W> N与替代方案相比如何?
The*_*ong 31
我们试图解决的基本问题是:
是否会出现读取不返回最新值的情况?
显然,如果可能的话,最好避免这种情况!
如果R + W <= N,则可能发生这种情况.
写入可以向一组节点发送新值,而后续读取可以从完全独立的节点组读取,因此错过写入的新值.
如果R + W> N,则保证不会发生这种情况.
有N个节点可能保存该值.写入至少与W节点接触 - 在每个节点上放置"写"标签.随后的读取联系人至少有R个节点 - 在每个节点上放置一个"读取"标签.有R + W贴纸但只有N个节点,所以至少有一个节点必须有两个贴纸.也就是说,至少一个节点参与读取和写入,因此能够将最新的写入返回到读取操作.
R + W >> N是不可能的.
您可以读取或写入的最大节点数是N(根据定义,复制因子).所以我们可以得到的最多是R = N和W = N,即R + W = 2N.这对应于ConsistencyLevel ALL的读写.也就是说,您只需写入所有节点并从所有节点读取,就不会发生任何奇特的事情.
法定写和法定读允许在无领导者复制系统中检测过时的值。
例如,我们有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> 3,我们确信可以检测到任何过时的值。
对于R + W = 3,可以用A和B编写,但只能从C读取。在这种情况下,我们无法检测到过时的值。