Cassandra是否有可能返回不一致的值?

时间:2019-06-11 01:56:16

标签: java cassandra nodes distributed-system gossip

我对Cassandra还是陌生的,我想知道,Cassandra是否有可能返回不一致的值?

例如,假设我们有六个节点集群。

  

LOCAL_QUORUM =(复制因子/ 2)+ 1

这将使我们的本地定额为4。因此,对于简单的写入,六个节点中的四个必须响应,这意味着四个节点将具有最新值。

根据我的理解,两个尚未更新的节点最终将通过八卦协议进行更新。

如果是这样的话,如果客户端从两个节点之一读取数据,那该怎么办? 在协议发生之前更新?他们有获得过时价值的风险吗?

阅读修复如何影响这一切?

*另外请注意。并不是说您会这样做,但是如果您将复制因子设置为等于一致性级别,那么后面的操作与2PC(两阶段提交)是否基本相同?

2 个答案:

答案 0 :(得分:1)

  

Cassandra是否有可能返回不一致的值?

答案是:是的。

这取决于您如何设置读/写一致性级别。

  

如果是这样,如果客户端从协议发生之前未更新的两个节点之一读取,会发生什么情况?他们有获得过时价值的风险吗?

如果将读取操作的一致性级别设置为 ONE 两次,那么仍然有可能/有可能​​获得过时的价值。 为什么? :因为cassandra如果从指定数量的节点获得响应,将向客户端返回值。

Cassandra非常灵活,您可以根据应用程序的需要配置cassandra。要保持严格级别,您可以始终遵循以下规则:

  

读写操作的可靠性取决于一致性   用于验证操作。可以保证强一致性   当满足以下条件时:

     

R + W> N

     

其中R是读取操作的一致性级别

     

W是写操作的一致性级别

     

N是副本数

要了解更多有关结帐的信息,请访问:consistent read and write operations

  

阅读修复如何影响这一切?

在读取修复中,Cassandra并非直接向每个副本发送摘要请求  参与阅读。 Cassandra比较所有副本并写入最新副本 版本到没有副本节点的任何副本节点。如果查询的一致性 如果级别高于ONE,则Cassandra会在 数据返回给客户端之前的前台。读取修复可修复任何节点 通过阅读查询。这意味着对于一致性级别ONE,没有数据是 已修复,因为未进行比较。对于QUORUM,仅节点 查询操作得到修复,而不是所有节点都得到修复。

查看此链接以获取更多详细信息:

  1. Read Repair: repair during read path

  2. Repairing nodes

答案 1 :(得分:1)

欢迎来到卡桑德拉世界

  

Cassandra是否有可能返回不一致的值?

是的,Cassandra本质上具有“最终一致”的方法,因此,如果使用ANY or ONE设置读取的一致性级别,则返回不一致值的风险会增加。您可以将此设置增加到ALL,以确保信息一致,但是会牺牲性能和弹性。应用程序中使用的级别将取决于您的用例。

  

例如,假设我们有六个节点集群。

     

LOCAL_QUORUM =(复制因子/ 2)+ 1

复制因子与群集中的节点数量无关,经验法则是复制因子不应大于节点数量。

假设您在6个节点的群集中使用的复制因子为6:

  

这将给我们提供4的本地定额。因此,为了简单起见,其中四个   六个节点必须响应,这意味着四个节点将具有   最新值。

     

据我了解,两个最终未更新的节点   通过八卦协议进行更新。

使用Hinted handoffs来确保满足复制因子的机制; gossip protocol由节点用来报告节点的状态(从其自身和其他节点),其中一些状态是“ up”,“ down”,“ healthy”,“ joining”,“ leaveing” ”等。

  

如果是这样,如果客户机从两个节点之一读取   协议发生之前没有更新?他们有患上   获得陈旧的价值?

您将需要阅读有关read path of Cassandra的信息;首先,这将取决于复制因子以及读取操作的一致性级别。您还可以降低不正确的数据牺牲弹性和性能的风险。