R + W>的含义是什么? N为Cassandra集群?

时间:2011-10-19 06:44:38

标签: replication cassandra cluster-computing

This introduction to Cassandra Replication and Consistency(幻灯片14-15)大胆断言:

  

R+W>N保证读写仲裁的重叠。

     

请想象这种不平等有巨大的毒牙,滴血   无辜的,企业开发人员,所以你可以最好地欣赏   它激发了恐怖。

我理解读取和写入一致性级别(R + W)的总和大于复制因子(N)是一个好主意...但是什么是重要的是什么?

有什么影响,以及R + W&n; N与替代方案相比如何?

  • R + W< Ñ
  • R + W = N
  • R + W>> Ñ

3 个答案:

答案 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

  • 最佳情况(从同一组节点读取和写入):写入A,B并读取:A,B =>一致的读取即最新值。
  • 最坏的情况(一个节点是常见的):写入A,B并读取:B,C =>一致读取,因为节点B重叠。

因此只有R + W> N才能保证读取的一致性。

您可以探索更多选项here