【问题标题】:cassandra local_quorum query is inconsistentcassandra local_quorum 查询不一致
【发布时间】:2021-09-11 23:26:07
【问题描述】:

cassandra 版本:2.1.15

节点数:dc1:80,dc2:80

问题:

我们的复制策略如下:

WITH REPLICATION = {'class':'NetworkTopologyStrategy','dc1': 3,'dc2': 3};

我们在使用 Cassandra 时遇到问题,使用 local_quorum 查询时出现不一致。我们只会在 dc1 中读写。 我们也用 local_quorum 写,然后用 local_quorum 查询。

但是有一个现象,用下面的说法:

select count from table where partitionKey=?

查询的结果最初不一致,最终一致。

假设第一个是10000,第二个是9998,第三个是9997,最后可能保持在10001(可能是触发读修复,导致最终稳定)。 在此期间,我们进行了大规模的扩张。并确保每台机器都已清理干净。而且我们还发现在不同机器上使用getEndpoint的结果不一致。最后我们发现getEndpoint的结果在dc1中有4台机器。

然后我们在对应的4台机器上执行getSstable,只有3台机器显示结果,另一台机器没有显示结果。同时我们在另一个partitionKey也遇到了类似的问题,但是这个partitionKey只查询了一次,因为我们在别的地方记录了partitionKey的总数,可以确认partitionKey的总数不正确。

我们将dc1的每台机器一一重启后,这个问题就解决了。 partitionKey 的总数和我们记录的结果是一致的,如果多次查询同一个查询,结果是不会改变的。 所以我怀疑gossip同步节点信息太慢,可能导致选择节点查询时最终结果不一致。

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    听起来这里可能发生了一些事情。我同意这可能是由于集群的扩展。

    查询的结果最初不一致,最终一致。

    Cassandra 2.1 仍然允许为每个表配置读取修复机会,默认值为 10%。因此,如果重试次数足够多,就会触发读取修复,并且不一致的值会自行修复。

    然后我们在对应的4台机器上执行getSstable,只有3台机器显示结果,另一台机器没有显示结果。同时我们在另一个partitionKey也遇到了类似的问题,但是这个partitionKey只查询了一次,因为我们在别的地方记录了partitionKey的总数,可以确认partitionKey的总数不正确。

    不完全确定那里发生了什么,但听起来一个或多个新节点在加入时遇到了麻烦,并且在令牌分配过程中可能出现了问题。我的猜测是,一个或多个原始节点的令牌范围图(在system.peers 中)与其他节点可以看到的内容不正确或不一致。很高兴知道重新启动后问题得到了解决。

    建议:

    • 升级。如果您无法摆脱 Cassandra 2.1,至少可以使用 2.1.19。它于去年 11 月发布,将修复您现在没有的 2 年错误。
    • 将您的节点计数作为您的 RF 的一个因素。对于 3.0 之前的 Cassandra 版本,令牌分配有点不稳定。为了帮助优化它,节点的数量应该允许射频均匀平衡。在您的情况下,每个 DC 有 80 个节点不能被 3(RF)整除。所以我会将每个 DC 提升到 81。当然,然后运行 ​​cleanup
    • 禁用动态告密。动态告密者利用 gossip 尝试优化对性能更好的服务器的读取。但是,它会产生很多噪音,不幸的是,由于进行观察,这会减慢速度。它可能是这里的一个促成因素。只需设置dynamic_snitch:false

    有关这些提示和其他信息的更多详细信息,我推荐两篇文章:

    【讨论】:

      猜你喜欢
      • 2021-12-14
      • 1970-01-01
      • 2020-05-26
      • 2021-11-13
      • 2018-02-15
      • 1970-01-01
      • 2017-08-11
      • 2020-10-23
      • 2015-12-17
      相关资源
      最近更新 更多