Scylla集群RF=2双节点数据不一致问题求助
双节点Scylla集群数据不一致问题解答
这不属于预期行为,你的副本机制理解是正确的:当keyspace的复制因子(RF)设为2时,所有写入操作会同步到两个节点,双节点的数据应该完全一致。以下是可能的原因排查和解决步骤:
可能的原因
- 节点加入时的初始同步异常:添加节点2的过程中,初始数据同步未完成就开始接收写入,或者同步过程中出现网络中断、日志报错等问题,导致部分数据未同步。
- Repair操作未正确执行:你执行的repair可能不是全量repair,或者执行过程中被中断,没有覆盖所有数据范围。
- 行数统计工具的误差:你用来统计行数的工具(比如
nodetool tablestats)可能存在统计偏差,比如未计入memtable中的数据(虽然你执行了flush,但仍需验证)。 - GC或删除操作的影响:虽然
gc_grace_seconds设为864000(10天),但如果节点2在加入后有大量数据被标记删除并完成GC,而节点1的GC尚未执行,不过这种情况导致近700万行的差距可能性极低。
排查与解决步骤
验证实际行数的准确性
分别连接两个节点的cqlsh(指定节点IP:cqlsh 192.168.1.51和cqlsh 192.168.1.100),执行以下CQL命令统计实际行数:SELECT COUNT(*) FROM uzzstore.chunks;确认两个节点的实际查询结果是否一致,排除统计工具的误差。
执行全量Repair操作
在任意节点执行全量repair,确保覆盖整个keyspace:nodetool repair -full uzzstore执行过程中不要中断,查看Scylla日志确认repair是否完成,没有报错。
检查集群日志
查看两个节点的Scylla日志(默认路径/var/log/scylla/scylla.log),搜索repair、stream、replication相关关键词,排查同步过程中是否有错误、中断等异常信息。检查Token分配情况
执行nodetool ring查看集群的token范围分配,确认两个节点的token覆盖范围正常,没有重叠或缺失的情况,确保数据分片分配正确。验证当前写入的同步性
插入一条测试数据:INSERT INTO uzzstore.chunks (id, size) VALUES (textAsBlob('test-id'), 100);然后在两个节点分别查询这条数据,确认当前的写入操作是否能正常同步到节点2。
如果以上步骤执行后数据仍不一致,可能是节点加入过程中出现了不可逆的数据丢失,建议从节点1备份数据后恢复到节点2,或者将节点2移出集群后重新加入。
内容的提问来源于stack exchange,提问作者Ste
相关产品推荐
相关产品推荐

