gpt4 book ai didi

cassandra - 即使使用 Quorum 配置,Cassandra 中的数据也不一致

转载 作者:行者123 更新时间:2023-12-01 02:34:00 25 4
gpt4 key购买 nike

当我们使用 Quorum 进行读写时,我在使用 Hector 和 Cassandra 时遇到了一致性问题。

我使用 MultigetSubSliceQuery 从 super 列限制大小 100 查询行,然后读取它,然后删除它。并开始另一个。

我发现应该由我之前的查询删除的行仍然显示在下一个查询中。

同样从一个普通的列族中,我将一列的值从 status='FALSE' 更新为 status='TRUE',下次查询时,状态仍然是 'FALSE'。

更多详情:

  • 不是每次都发生(1/10,000)
  • 两次查询之间的时间大约为 500 毫秒(但我们发现一对查询之间已经过去了 2 秒,仍然表明存在一致性问题)
  • 我们使用 ntp 作为我们的集群时间同步解决方案。
  • 我们有 6 个节点,复制因子为 3

  • 我知道 Cassandra 应该是“最终一致的”,并且在 Cassandra 内部写入之前可能不会发生读取。但是两秒?!如果是这样,那么拥有 Quorum 或其他一致性级别配置不是毫无意义吗?

    那么首先,Cassandra 的行为是否正确,如果不是,我们需要分析哪些数据以进行进一步投资?

    最佳答案

    通过系统日志查看源代码后,找到了不一致的根本原因。
    导致问题的三个因素:

  • 创建和更新相同的记录不同的节点
  • 本地系统 时间不同步足够准确(尽管我们使用 NTP)
  • 一致性级别为 法定人数

  • 问题来了,事件序列如下
     seqID   NodeA         NodeB          NodeC
    1. New(.050) New(.050) New(.050)
    2. Delete(.030) Delete(.030)

    第一 创建 请求来自 节点 C 带本地时间戳 00:00:00.050 , 假设请求第一条记录在 节点 A 节点B ,然后与 同步节点 C .

    然后 删除 请求来自 节点 A 带本地时间戳 00:00:00.030 ,并记录在 节点 A 节点B .

    阅读 请求来了,Cassandra 会做版本冲突合并,但是合并 仅取决于时间戳 , 所以虽然 删除 发生在 之后创建 ,但合并最终结果是“ New ”,由于本地时间同步问题,它具有最新的时间戳。

    关于cassandra - 即使使用 Quorum 配置,Cassandra 中的数据也不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11182637/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com