我对Cassandra还是陌生的,我想知道,Cassandra是否有可能返回不一致的值?
例如,假设我们有六个节点集群。
LOCAL_QUORUM =(复制因子/ 2)+ 1
这将使我们的本地定额为4。因此,对于简单的写入,六个节点中的四个必须响应,这意味着四个节点将具有最新值。
根据我的理解,两个尚未更新的节点最终将通过八卦协议进行更新。
如果是这样的话,如果客户端从两个节点之一读取数据,那该怎么办? 在协议发生之前更新?他们有获得过时价值的风险吗?
阅读修复如何影响这一切?
*另外请注意。并不是说您会这样做,但是如果您将复制因子设置为等于一致性级别,那么后面的操作与2PC(两阶段提交)是否基本相同?
答案 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 :(得分: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的信息;首先,这将取决于复制因子以及读取操作的一致性级别。您还可以降低不正确的数据牺牲弹性和性能的风险。