Cassandra的强相合性

问题描述 投票:2回答:4

根据数据文章的文章,如果R + W> N其中R是读操作的一致性级别,则可以保证强一致性W是写操作的一致性级别N是副本的数量

强一致性意味着什么?这是否意味着“每次”从数据库给出查询的响应,响应将“始终”是最后更新的值?如果在cassandra中保持强一致性的条件,那么,是否存在返回的数据可能不一致的情况?简而言之,强一致性是否意味着100%的一致性?

编辑1

在某些情况下添加一些额外的材料,即使R + W> RF,Cassandra也可能不一致

  1. Write fails with Quorum CL
  2. Cassandra's eventual consistency
cassandra cassandra-3.0
4个回答
3
投票

是。如果R + W一致性大于副本,那么您将始终获得一致的数据。 100%一致性。但您必须交易可用性以实现更高的一致性。

Cassandra具有可调整一致性的概念(基于查询设置一致性)。


3
投票

Cassandra具有可调整的一致性,您可以选择一些权衡。

R + W> N - 这只是意味着您的往返中必须有一个重叠节点,其中实际和最新数据可以保持一致。

例如,如果您在CL.ONE处写入,则需要在CL.ALL处读取以确保获得一致的结果:N + 1> N - 但您可能不希望CL.ALL,因为您无法容忍单个节点故障在您的群集中。

通常,您可以在读取和写入时选择CL.QUORUM,以确保一致性并容忍节点故障。例如,在RF = 3时,QUORUM需要(3/2)+ 1 = 2个节点可用,因此R + W> N将是4> 3 - 您的请求是一致的并且您可以容忍单个节点故障。

有一点需要记住 - 在所有节点(cassandra和应用程序)上同步时钟非常重要,您需要启动并运行ntp。


2
投票

对于读取和写入,ANY,ONE,TWO和THREE的一致性级别被认为是弱的,而QUORUM和ALL被认为是强的。


-1
投票

虽然这是一个老问题,但我认为我会努力设置记录。

R + W> RF并不意味着强一致性

具有** R + W> RF *的系统最终将是一致的。强烈一致性保证的声明在节点故障期间或写入之间中断。例如,请考虑以下情形:

假设有3个节点A,B,C,RF = 3,W = 3,R = 2(因此,R + W = 5> 3 = RF)

进一步假设密钥k与值v相关联,即(k,v)存储在数据库中。假设发生以下一系列操作:

  • t = 1:(k,v1)写请求从用户发送到A,B,C
  • t = 2:(k,v1)到达A并写入存储在A处
  • t = 3:读取器1发送密钥k的读取请求,由A和B回复
  • t = 4:读者1通过最新的写赢规则接收响应(k,v1)
  • t = 5:读取器1发送另一个读取请求,该请求由节点B和C服务
  • t = 6:读者1接收响应(k,v),这是较旧的值不一致
  • t = 7:(k,v1)到达C并写入存储在C中
  • t = 8:(k,v1)到达B并写入存储在B处

这表明W + R> RF不能保证强一致性。为了确保强一致性,您可能希望使用其他算法(如paxos或raft)来帮助确保写入是原子的。你可以在同一个here上阅读一篇有趣的文章(请查看FAQ部分)


编辑:

Cassandra确实有一些内部机制(称为阻塞读取修复) - 在将来自db的响应发送回客户端之前触发同步写入。这种同步读取修复发生在查询的节点之间不一致以实现读取一致性级别并确保称为单调读取一致性[见下面的定义]。这导致上述示例中的(k,v1)在第一次读取请求的情况下返回响应之前被写入节点B,因此第二次读取请求也将具有更新的值。 (感谢@Nadav Har'El指出这一点)

但是,这仍然不能保证强一致性。以下是一些清除它的定义:

顺序/强一致性:任何执行的结果与读取和写入按某种顺序发生的结果相同,并且每个处理器的操作按照其程序指定的顺序出现在此序列中[由Leslie Lamport定义]

单调读取一致性:一旦读取值,所有后续读取将返回此值或更新版本

顺序一致性要求客户端程序/阅读器查看自写入语句在程序指令序列中的read语句之前执行以来所写入的最新值。

© www.soinside.com 2019 - 2024. All rights reserved.