4. 配置主从同步:replicaof 指令与动态 SLAVEOF 命令

主从同步是 Redis 高可用架构的基石。本章聚焦两种配置方式:静态配置(通过 redis.conf 中的 replicaof 指令)与动态切换(通过运行时 SLAVEOF 命令)。理解两者的适用场景与底层差异,是后续故障切换验证的前提。

4.1 静态配置:replicaof 指令

在 Redis 5.0 及以上版本中,replicaof 替代了旧版的 slaveof 指令。该指令写入从节点的 redis.conf 文件中,重启后永久生效。

配置格式:
replicaof <master-ip> <master-port>

示例:将当前节点配置为 192.168.1.10:6379 的从节点

replicaof 192.168.1.10 6379

4.1.1 关键配置参数

除 replicaof 外,主从同步场景下还需关注以下参数:

参数名 默认值 说明
replicaof (空) 指定主节点的 IP 和端口
replica-read-only yes 从节点是否只读;生产环境建议保持 yes
replica-serve-stale-data yes 与主节点断连后,是否继续响应旧数据
replica-lazy-flush no 全量同步时是否使用 lazy free 清空旧数据
replica-priority 100 哨兵选举时的优先级,值越小越优先
最佳实践: 在 redis.conf 中配置 replicaof 后,务必同时设置 replica-read-only yes,避免从节点被意外写入导致数据不一致。

4.2 动态配置:SLAVEOF 命令

运行时通过 redis-cli 或客户端发送 SLAVEOF 命令,可以临时改变主从关系,无需重启 Redis 进程。该命令在故障切换、架构变更时极为常用。

命令格式:
SLAVEOF <master-ip> <master-port>

示例:将当前节点切换为 192.168.1.20:6379 的从节点

127.0.0.1:6379> SLAVEOF 192.168.1.20 6379
OK

4.2.1 取消主从关系

使用 SLAVEOF NO ONE 命令可使当前节点断开主从关系,并提升为独立主节点:

127.0.0.1:6379> SLAVEOF NO ONE
OK

该命令在故障切换中用于将从节点提升为新的主节点。

4.3 静态 vs 动态:对比分析

对比维度 静态配置(replicaof) 动态命令(SLAVEOF)
持久性 重启后保留 重启后丢失,需重新执行
生效时机 重启 Redis 后生效 立即生效
适用场景 初始化部署、固定主从架构 故障切换、临时维护、架构演练
风险等级 低(配置即锁定) 中(需注意命令执行顺序)
日志记录 启动时打印主从信息 执行时打印同步状态

4.4 主从同步建立流程

无论通过静态还是动态方式配置,Redis 主从同步的建立流程一致:

  1. 连接建立: 从节点向主节点发起 TCP 连接,发送 PING 确认存活。
  2. 身份认证: 若主节点设置了 requirepass,从节点需通过 masterauth 密码认证。
  3. 数据同步: 首次连接或断连后触发全量同步(RDB 快照 + 缓冲区增量);后续持续增量同步(命令传播)。
  4. 状态维持: 从节点定期向主节点发送 REPLCONF ACK 确认偏移量。
注意: 动态执行 SLAVEOF 时,如果目标主节点不可达或密码不匹配,命令会返回错误。建议在脚本中增加重试与超时处理。

4.5 主从同步架构示意

下图展示了通过 replicaof 或 SLAVEOF 配置后,主节点与从节点之间的数据流与命令传播路径:

Redis 主从同步架构(replicaof / SLAVEOF) 主节点 (Master) IP: 192.168.1.10 Port: 6379 从节点 (Replica) IP: 192.168.1.20 Port: 6380 从节点 (Replica) IP: 192.168.1.30 Port: 6381 全量同步 (RDB) 增量同步 (命令传播) 异步复制 配置方式 静态:redis.conf → replicaof 192.168.1.10 6379 | 动态:SLAVEOF 192.168.1.10 6379

4.6 验证主从同步状态

配置完成后,通过以下命令验证同步是否正常:

在从节点执行:
127.0.0.1:6380> INFO replication
# Replication
role:slave
master_host:192.168.1.10
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:123456

关键字段说明:

  • master_link_status:up — 主从连接正常
  • master_sync_in_progress:0 — 无正在进行的全量同步
  • slave_repl_offset — 从节点复制偏移量,应与主节点 master_repl_offset 一致
快速验证: 在主节点写入一个 key,在从节点立即读取,若返回相同值则同步正常。注意从节点默认只读,写入会报错。

4.7 常见问题与避坑

问题现象 可能原因 解决方案
master_link_status:down 网络不通、主节点未启动、防火墙拦截 检查网络连通性,确认主节点 bind 配置
全量同步反复触发 复制缓冲区不足、网络抖动导致断连 增大 repl-backlog-size,优化网络稳定性
动态 SLAVEOF 报错 ERR 主节点密码不匹配、端口错误 确认 masterauth 与主节点 requirepass 一致
从节点数据与主节点不一致 从节点被意外写入、使用了旧版本 RDB 设置 replica-read-only yes,重新全量同步