Cassandra什么时候不提供C,A和P,W / R设置为QUORUM?

时间:2014-08-01 02:23:05

标签: cassandra cassandra-2.0

当读取和写入都设置为仲裁时,我可以保证客户端在读取时始终获得最新值。

我意识到这可能是一个新手问题,但我不明白这个设置如何不提供一致性,可用性和分区。

3 个答案:

答案 0 :(得分:1)

如果没有足够的副本可用,则在法定人数下,您将无法使用(即不接受读取或写入)。您可以选择在较低的一致性级别上放松和读/写,以获得可用性,但是您将无法保持一致。

还有一种情况是读取和写入的法定数量可以保证您检索到最新的“写入”数据。但是,如果协调器不知道所需的分区是否已关闭(即在3个节点中的2个节点失败后没有传播八卦),它将发出对3个副本的写入[假设复制因子为3的仲裁一致性]。一个活动节点将写入,而另外两个不会(它们已关闭)。写入超时(它不会失败)。写入超时,即使一个节点写入也不是写入失败。这是一个“正在进行中”的写作。我们现在说下来的节点出现了。如果客户端接下来请求具有仲裁一致性的数据,则会发生以下两种情况之一:

  1. 请求转到两个已关闭的节点之一,并转到“is live”节点。客户端获取最新数据,读取修复触发器,一切都很好。
  2. 请求转到已关闭的两个节点。返回旧数据(假设未进行修复)。协调员从第三次获取摘要,阅读修复。这是当原始写入被认为是“完整”并且随后的读取将获得新数据。一切都很好,但是一个客户端将收到旧数据,因为写入“正在进行中”但不是“完整”。有一种非常罕见的情况会发生这种情况。有一点需要注意的是,写入cassandra是键上的upsert。所以通常重试可以解决这个问题,但是如果节点真的出现故障,初始读取可能是个问题。
  3. 通常,您需要平衡一致性和可用性要求。这就是可调谐一致性这个术语的来源。

答案 1 :(得分:0)

说在网络上它充满了反驳(或者至少试图)布鲁尔CAP定理的链接......从定理的角度来看,C说的是

  

所有节点同时看到相同的数据

与客户始终检索新信息的保证完全不同。严格遵循这个定理,在你的情况下,它不受尊重。

答案 2 :(得分:0)

DataStax文档包含Configuring Data Consistency部分。在查看所有可用的一致性配置时,对于QUORUM,它指出:

  

在法定数量的副本响应后,无论数据中心如何,都返回具有最新时间戳的记录。如果您能够容忍某种程度的失败,请确保一致性。

请注意,最后一部分“容忍某种程度的失败”。就在那里,它表明使用QUORUM一致性就牺牲了可用性(A)。

上面引用的文档还进一步定义了QUORUM级别,说明您的复制因子也起作用:

  

如果一致性是最重要的,您可以确保始终读取   使用以下公式反映最近的写作:

     

(nodes_written + nodes_read)> replication_factor

     

例如,如果您的应用程序使用QUORUM一致性级别   对于写入和读取操作,您正在使用复制   因子3,这确保总是写2个节点,2   总是读取节点。写入和读取节点的组合(4)   大于复制因子(3)确保强读   一致性。

最后,这一切都取决于您的应用要求。如果您的应用程序需要高度可用,ONE可能是您的最佳选择。另一方面,如果你需要强一致性,那么QUORUM(甚至是ALL)将是更好的选择。