ScyllaDB集群不同节点执行CQL查询返回结果不一致
问题根因
- 新增DC流程遗漏核心数据同步步骤:仅修改键空间复制策略为
NetworkTopologyStrategy只会更新集群元数据,不会自动把存量数据同步到新DC节点。新节点启动后只会接收修改配置后的增量写入,存量数据完全缺失,直接造成跨DC数据不一致。 - 读修复完全关闭:表配置中
dclocal_read_repair_chance = 0.0、read_repair_chance = 0.0,所有读请求都不会触发后台副本同步修复,即使读到不一致的副本结果,也不会把缺失数据补到落后副本上,不一致问题不会自动收敛。 - 同节点重复count结果波动:ScyllaDB的count查询默认是分布式扫描,在副本数据不一致的前提下,每次扫描命中的副本组合不同,加上节点内部SSTable compaction、hinted handoff回放的临时影响,哪怕没有新写入,也会出现多次查询返回结果不同的情况。
- 同DC节点数据不一致:原有
SimpleStrategy的副本分布逻辑和新NetworkTopologyStrategy的分布规则不匹配,改完配置后没有做全集群修复,原有DC节点上的副本没有按新拓扑重新分布,导致同DC不同节点持有的副本范围、数据量不匹配。
操作与配置遗漏点
- 遗漏新DC节点存量数据拉取步骤:新增DC完成节点启动、修改完键空间复制策略后,必须在新DC的每台节点上执行
nodetool rebuild <原有DC名称>,从原有DC拉取该节点应持有的全部存量副本,这是新增DC流程的强制步骤,跳过就会导致新DC存量数据缺失。 - 遗漏全集群修复步骤:改完复制策略、完成新DC rebuild后,必须在全集群执行一次全量主修复
nodetool repair -full,修正原有DC内因复制策略变更导致的副本错位、数据不一致问题,确保所有节点按新复制策略持有正确副本。 - 读修复配置不合理:生产环境不建议将两个读修复参数都设为0,常规可设置为0.1,即10%的读请求触发后台读修复,在几乎不影响读性能的前提下自动收敛小规模不一致。
- 未匹配对应一致性级别:默认
ONE一致性级别只要读到任意一个副本就返回结果,副本不一致场景下必然出现不同节点返回结果不同的问题,需要强一致读结果时要使用QUORUM及以上级别。
修复操作步骤
- 在新DC每台节点依次执行
nodetool rebuild existing-dc,通过nodetool netstats监控任务进度,等待所有节点rebuild完成、无待流数据。 - 全集群滚动执行全量repair,确保所有副本持有完整的应存数据。
- 修复完成后使用
QUORUM一致性级别执行分区count查询,连续多次验证结果稳定无波动,再对比不同节点同查询的返回结果,确认一致。
注意:ScyllaDB中count属于重量级操作,大分区不建议频繁执行,验证数据一致性优先采用校验分区哈希、抽样核对主键的方式,效率远高于全量count。
内容的提问来源于stack exchange,提问作者Shobhana Sriram
相关产品推荐
相关产品推荐

