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 主从同步的建立流程一致:
- 连接建立: 从节点向主节点发起 TCP 连接,发送
PING确认存活。 - 身份认证: 若主节点设置了
requirepass,从节点需通过masterauth密码认证。 - 数据同步: 首次连接或断连后触发全量同步(RDB 快照 + 缓冲区增量);后续持续增量同步(命令传播)。
- 状态维持: 从节点定期向主节点发送
REPLCONF ACK确认偏移量。
注意: 动态执行
SLAVEOF 时,如果目标主节点不可达或密码不匹配,命令会返回错误。建议在脚本中增加重试与超时处理。
4.5 主从同步架构示意
下图展示了通过 replicaof 或 SLAVEOF 配置后,主节点与从节点之间的数据流与命令传播路径:
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,重新全量同步 |