根据datastax文章,如果R+W>N,其中R是读取操作的一致性级别W是写入操作的一致性级别N是副本的数目,则可以保证强一致性。
强一致性在这里意味着什么?这是否意味着每次查询的响应都来自数据库,响应将“始终”是最后更新的值?如果在cassandra中保持强一致性的条件,那么是否存在返回的数据可能不一致的情况?简而言之,强一致性是否意味着100%的一致性?
编辑1
添加一些关于卡桑德拉可能不一致的场景的额外材料,即使在R+W>RF中
发布于 2018-01-08 13:23:19
卡桑德拉与你可以选择的一些折衷方案具有可调的一致性。
R+W>N-这仅仅意味着往返中必须有一个重叠的节点,其实际数据和最新数据必须是一致的。
例如,如果您在CL.ONE上编写,您需要在CL.ALL上阅读以确保得到一致的结果: N+1 >N-但是您可能不想要CL.ALL,因为您不能容忍集群中的单个节点失败。
通常,您可以在读和写时选择CL.QUORUM,以确保一致性和容忍节点故障。例如,在RF=3,仲裁需要(3/2)+1=2节点可用,因此R+W>N将是4>3 --您的请求是一致的,并且可以容忍单个节点失败。
有一件事要记住--在所有节点(cassandra和应用程序)上有一个非常重要的同步时钟,您会希望ntp启动并运行。
发布于 2019-06-05 16:43:04
虽然这是个老生常谈的问题,但我想我还是把事情搞清楚。
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)存储在数据库中。假设发生了以下一系列操作:
这说明W+R>RF不能保证很强的一致性。为了确保强一致性,您可能需要使用另一种算法,例如、paxos、或 as ,它可以帮助确保写入是原子的。您可以阅读一篇关于相同的 这里 (请查看常见问题部分)的有趣文章
编辑:
Cassandra确实有一些内部机制(称为阻塞读取修复)--在将来自db的响应发送回客户端之前触发同步写入。这种同步读取修复发生在查询的节点之间出现不一致的情况下,以实现读取一致性级别,并确保单调读取一致性(参见下面的定义)。这使得上面示例中的(k,v1)在第一次读取请求返回响应之前被写入节点B,因此第二读取请求也具有更新的值。(感谢@Nadav Har‘’El指出这一点)
然而,这仍然不能保证很强的一致性。下面是一些需要澄清的定义:
序列/强一致性:任何执行的结果都是相同的,就像读和写按某种顺序进行一样,并且每个处理器的操作按照莱斯利兰波特定义的程序指定的顺序显示。
单调读取一致性:一旦读取值,所有后续读取都将返回此值或更新版本
顺序一致性要求客户端程序/读取器查看所写的最新值,因为写入语句是在读语句之前按照程序指令顺序执行的。
发布于 2018-01-08 13:19:44
对于读写,任何、一、二和三的一致性级别都被认为是弱的,而仲裁和所有的一致性级别都被认为是强的。
https://stackoverflow.com/questions/48150888
复制相似问题