广告

Redis 主从复制故障排查指南:面向后端开发与运维的实战排错步骤

1. 环境与准备

1.1 集群拓扑与角色分布

在排查过程的第一步,明确集群拓扑主从结构及端口暴露情况。通过 INFO replication 可以快速看到 master 与所有 slave 的状态、以及从节点数量等信息。若拓扑中存在多层级的从节点,应对每一级别的复制状态进行确认。

此外,确认网络连通性与防火墙策略是否阻塞 Redis 之间的心跳通道。例如 master <-> slave 的 TCP 连接 是否长期处于 ESTABLISHED,以及是否有网络抖动导致的断连。

redis-cli -h 192.168.1.10 -p 6379 INFO replication
redis-cli -h 192.168.1.11 -p 6379 INFO replication

本指南围绕 Redis 主从复制故障排查指南,提供面向后端开发与运维的 实战排错步骤,帮助定位与解决复制问题。

1.2 版本与配置对齐

确认 Redis 版本与编译参数是否在受支持的范围内,版本不一致会带来复制相关的兼容性问题,例如 RDB 与 AOF 的冲突,以及 复制缓冲区大小repl-backlog 的配置差异。

对 master 和 slave 的配置进行对比,确保 slaveof 指向正确的 mastermasterauthreplica-read-only 等策略一致。

grep -E '^[#;]|^port|^bind|^cluster-enabled' /etc/redis/redis.conf

2. 基本故障现象与日志定位

2.1 常见现象描述

常见现象包括:主节点延迟飙升从节点 lag 增大复制阻塞master_link_status: upmaster_sync_in_progresstrue。定位要点是观察 replication 信息中的 master_link_statusslave0 的状态,以及 repl_backlog_time

监控工具需覆盖 INFO REPLICATIONLOG、以及系统层面的网络状态。通过这些信号可以快速判断是网络、磁盘 I/O 还是 CPU 资源导致的复制瓶颈。

redis-cli -h 192.168.1.12 -p 6379 INFO replication
tail -n +1 /var/log/redis/redis-server.log | grep -i 'warning\\|error' | tail -n 50

2.2 日志分析要点

日志中的 errorwarning、以及 repl 前缀日志是排错的入口。聚焦字段包括 master_link_statusrepl_backlog_size、以及 repl_back_log 的最近条目。

在日志中如果出现 Master is not up or terminatedSlave myid not found、或 duplicate key 等信息,需结合配置和网络状态进行排错。

3. 复制链路诊断与恢复

3.1 检查复制链路连通性

确定 masterslave 间的网络连通性没有被防火墙拦截,且 端口 6379 可达。对于跨数据中心的部署,需额外关注 延迟抖动 对复制时序的影响。

结合 timeREPL 相关时间戳,判断是否存在 脑裂 状态,若发现 master_last_io_seconds_ago 持续偏大,说明 Master 与 Slave 之间的心跳可能中断。

redis-cli -h 10.0.0.1 -p 6379 INFO replication
redis-cli -h 10.0.0.2 -p 6379 INFO replication

3.2 处理复制滞后与阻塞

对于从节点滞后较大,应优先查看 repl_backlog_sizerepl_back_log,以及系统 I/O 的瓶颈。必要时可通过调整 repl-backlog-sizerepl-backlog 相关参数来缓解。此处需要具备对 AOFRDB 的影响评估能力。

在阻塞场景下,应分析 慢 SQL、磁盘 I/O网络抖动 的叠加效应,确保主从端都具备足够的 写入带宽与队列容量。如有必要,立即进行数据同步的分阶段恢复。

redis-cli -p 6379 CONFIG SET repl-backlog-size 1048576
python - << 'PY'
import redis
r = redis.Redis(host='redis-master', port=6379)
print(r.info('replication').get('repl_backlog_size'))
PY

4. 故障场景下的恢复策略

4.1 从节点重新指向正确的 Master

在主从复制关系出现错位时,从节点需要重新指向正确的 Master,避免 延时或数据不一致。通过 SLAVEOFREPLICAOF 指令对从节点进行重新指向,并确保 masterauth 与认证信息一致。

恢复策略应包含对比 数据一致性校验,确保从节点具备最新的镜像数据,并且不会在下次重启后触发新的同步。

Redis 主从复制故障排查指南:面向后端开发与运维的实战排错步骤

redis-cli -h slave1 -p 6379 REPLICAOF master1 6379

4.2 自动容错与故障转移要点

在高可用架构中,哑节点/哨兵集群模式 提供自动故障转移能力。当主节点宕机时,监控系统需要快速定位到新的主节点,并将从节点切换。注意切换时对 数据回放写入顺序 的影响。

为避免重复写入,应限定 写入幂等性避免冲突的写入顺序,并在切换完成后进行 全量一致性检查

redis-cli -p 26379 SENTINEL failover mymaster

5. 常见场景与排错清单

5.1 场景回顾:网络抖动引发的复制中断

在网络波动较大时,master 和 slave 的心跳丢失,复制链路会出现短时间的中断。排错要点包括 master_link_statusmaster_last_io_seconds_ago、以及 netstat 的连接状态。

通过快速调整网络抖动以及提升心跳间隔,可以缓解此类问题,同时通过 redis-cli 的诊断命令监控复制端口的连通性与延迟。

netstat -tunp | grep 6379
redis-cli -p 6379 INFO replication

5.2 场景回顾:主从数据不一致

数据不一致往往与 偏移量积累、RDB/AOF 同步策略冲突、或 跨数据中心的延迟有关。要点是对比 rolemaster_link_status、以及 repl_offset 等复制指标。

在这类场景下,通常需要进行 手动数据对齐、以及必要时执行 重新全量同步,以确保主从数据一致性。

import redis
master = redis.Redis(host='redis-master', port=6379)
slave = redis.Redis(host='redis-slave', port=6379)
print(slave.info('replication').get('master_repl_offset'))
print(master.info('replication').get('master_repl_offset'))

广告

数据库标签