【问题标题】:Cassandra read consistency of ONE return no data sometimeONE 的 Cassandra 读取一致性有时不返回数据
【发布时间】:2016-07-27 07:22:40
【问题描述】:

我是 Apache Cassandra 的新手,所以请原谅我提出愚蠢的问题。 我最近在分布于 4 个 DC 的 8 个节点上部署了一个 Cassandra 集群。

这是配置: Strategy: NetworkTopologyStrategy Replication factor: 8 Write consistency: ALL Read consistency: ONE

现在我并不关心所有的写一致性导致的 PUT 延迟。但是在测试时,当我在 PUT 之后立即尝试“获取”某些内容时,请求有时会失败并显示“未找到”。

如果我正确解释了 datastax 文档,则 ONE 的一致性级别应该返回一些内容,因为写入一致性设置为 ALL。也就是说,当我执行 PUT 时,所有节点都应该在发回响应之前确认,之后的 GET 应该返回一些东西,即使它是过时的数据。

如果我遗漏了什么或者我严重误解了文档,请告诉我。

提前致谢。

【问题讨论】:

  • 理论上你是对的,Cassandra 应该在使用 ONE 查询时返回一个值。能否提供插入和读取数据的代码?
  • 您确定数据确实存在于您的数据库中吗?因为如果有任何节点写入失败,CL ALL 将无法写入。 (即使只有一个节点无法写入,整个写入也会失败,因为它是原子的) PS。对不起我的英语不好:)

标签: cassandra spring-data datastax nosql


【解决方案1】:

您是正确的,使用 ALL 写入并使用 ONE 读取相同的数据应该始终返回结果。您也可以使用以下公式:

(nodes_written + nodes_read) > 复制因子

计算你可以有什么读写一致性来保证一致性。

因此,有几件事可能会导致您出现此问题:

  • 在您读取数据时写入请求尚未完全完成的竞争条件。
  • 您使用 Consistency of ALL 的写入失败,并且您没有正确处理它。
    • 您的集群连接正在使用 DowngradingConsistencyRetryPolicy,其中 ALL 的第一次写入失败,因此它会以较低的一致性级别重试写入。
    • 您的集群连接正在使用 LoggingRetryPolicy,并且您没有正确检测到失败的写入。
  • 其他一些与您的应用程序如何读取写入数据相关的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-14
    • 2015-12-17
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 2020-04-25
    相关资源
    最近更新 更多