redis主从数据不一致时,简单执行replicaof no one再replicaof不会触发全量同步,需停机清空rdb/aof后重启从库并重连,才能确保真正全量同步;同时必须设slave-read-only yes并验证offset追平。

Redis 主从数据不一致时,不能靠简单执行 replicaof no one 再 replicaof <master_ip><master_port></master_port></master_ip> 就认为“重连=重同步”。这种操作只切换复制源,不会清空从库已有数据,也不会强制触发全量同步——旧脏数据仍会残留,新同步可能基于错误 offset 继续推进,结果仍是不一致。
确认是否真需全量同步
先判断当前不一致是因断连导致的偏移滞后,还是数据已被人为写入、RDB 残留或主从 run_id 不匹配。关键看:
-
INFO replication 中的
master_replid和master_repl_offset是否与主库一致 - 从库是否曾被设为可写(
CONFIG SET slave-read-only no)并手动写入过数据 - 主库
repl-backlog-size是否足够大,且断连时间未超repl-backlog-ttl(默认 3600 秒)
真正触发全量同步的操作步骤
必须满足两个前提:复制流已停止 + 主从 replid/offset 不匹配。生产环境推荐以下稳妥方式:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 停掉从库 Redis 进程
- 删除本地
dump.rdb和appendonly.aof(如有启用 AOF) - 清空数据目录中可能残留的临时 RDB 文件(如
temp-*.rdb) - 启动从库,并在配置文件或启动后执行
replicaof <master_ip><master_port></master_port></master_ip> - 此时从库无任何有效复制状态,必走全量同步流程
避免修复后再次污染
全量同步完成不代表万事大吉。若从库仍处于可写状态,后续误写会立刻破坏一致性:
- 确保配置中
slave-read-only yes(默认值,但需确认未被运行时修改) - 检查是否曾执行过
CONFIG SET slave-read-only no,如有,重启后该设置不保留,但若没重启则仍生效 - 主库建议开启
min-replicas-to-write和min-replicas-max-lag,防止写入在从库严重滞后时仍被接受 - 禁用
repl-diskless-sync yes(除非网络极稳),改用磁盘同步(repl-diskless-sync no),避免断连时 RDB 传输中断导致半截文件残留
验证同步是否真正完成
connected_slaves: 1 只表示连接建立,不代表数据一致。应检查:
- 从库
INFO replication中slave_repl_offset是否持续追平master_repl_offset - 使用
redis-cli --rdb /dev/null -h <slave_ip> -p <port></port></slave_ip>导出从库快照,与主库 RDB 做内容比对(适用于小数据量) - 对关键 key 手动比对
GET结果,或用脚本批量校验 hash 值 - 监控
master_last_io_seconds_ago(应 slave_repl_offset 差值(理想为 0)










