简介:今天搞数据迁移,发现一个主从redis主从数据不一致的情况。情况如下:
主库:
# Keyspace
db0:keys=21481715,expires=21481713,avg_ttl=5028135944
从库:
# Keyspace
db0:keys=21481710,expires=21481708,avg_ttl=4657042349
单靠info keyspace的expires来判断数据是否一致会出现偏差。其统计信息的统计值不是精确值,有一定的误差。
info keyspace的输出结果中:keys表示所有keys的数据量。expires表示带有过期keys的数据量,包含未过期和已过期的keys的数量。
因此,通过expires来判断数据量时,逻辑上已经过期但未被Redis删除的keys也会被统计进来,从而出现了源端和目标端的数据不一致的现象。
说明 Redis处理过期keys的时机主要为以下几种:
- CPU空闲时清理过期keys。
- 实际访问keys时会判断keys是否过期,并逐出过期keys。
- Scan命令扫描时判断keys是否过期,并逐出过期keys。
解决方法
建议可通过以下2种方法判断数据是否一致:
说明 同步Redis数据的任务,若想看同步之后数据是否有丢失,需要看源数据keys是否已经过期。已过期的数据也会被统计到expires中,因此,不能单靠expires去判断数据的一致性。
- 对比A(源库keys数量减去expires后得到的数量)与B(目标库keys数量减去expires后得到的数量),若A和B的差值很小,则可判断数据一致。
- 用redis-full-check校验。具体方法可参考:redis-full-check工具的使用。
519

被折叠的 条评论
为什么被折叠?



