Cassandra 2.1.15集群使用local_quorum查询结果不一致问题咨询
Cassandra 2.1.15扩容后local_quorum读不一致问题根因与规避方案
根因定位
该问题是Cassandra 2.1.x版本在大规模集群扩容场景下的典型元信息不一致问题,核心原因如下:
- 观察到不同节点
getEndpoint返回结果不一致、3副本配置却返回4个目标节点,说明部分节点的令牌环缓存没有同步最新的集群拓扑,同时保留了扩容前的旧分区所有者节点和扩容后的新所有者节点。 - 2.1.x版本存在已知缺陷:节点完成扩容后的清理(cleanup)操作后,不会主动触发全量拓扑元信息的广播,单DC 80节点的规模下,gossip协议的增量同步效率不足以覆盖所有节点的元信息更新,导致部分节点的令牌环缓存长期未失效。
- 协调者节点计算副本列表时,若使用的是旧的令牌环信息,会把已经清理完该分区数据的旧所有者节点也纳入副本列表,
local_quorum会从包含无效节点的列表中选2个节点返回数据,一旦选中无数据的旧节点就会返回错误结果,直到读修复完成数据同步、或者节点重启强制刷新元信息后,问题才会消失。
长期规避方案
- 版本升级:2.1.x版本早已停止官方维护,优先升级到3.11.x或4.0.x的稳定LTS版本,该类版本已经修复了大规模集群下gossip拓扑同步延迟、令牌环缓存不失效的相关问题,从底层避免此类元信息不一致故障。
- 扩容操作标准化:
- 单批次扩容节点数不超过集群总节点数的10%,160节点的集群单次扩容不要超过16台,每批扩容完成后等待2~3小时确认拓扑完全同步,再执行下一批扩容。
- 新节点加入后先执行
nodetool gossipinfo确认所有节点状态一致,再执行清理操作,所有扩容动作完成后,全集群执行nodetool resetlocalschema强制刷新元信息,无需逐台重启节点。
- 运维配置优化:
- 调整gossip相关参数:
cassandra.yaml中保持gossip_interval为默认1000ms,phi_convict_threshold调整为8适配跨机房大集群,加快拓扑变更消息的扩散速度。 - 定期执行全量反熵修复:每周针对每个keyspace执行
nodetool repair -pr,提前修复副本数据不一致问题,降低读波动概率。 - 新增拓扑一致性监控:通过JMX指标
org.apache.cassandra.net:type=Gossiper,attribute=LiveMembers监控集群节点列表变化,确认所有节点拓扑信息一致后再恢复业务流量。
- 调整gossip相关参数:
内容的提问来源于stack exchange,提问作者HUANG
相关产品推荐
相关产品推荐

