Redis 主从复制
主从复制用于数据副本、读扩展和高可用基础。Sentinel 和 Cluster 都依赖复制能力完成故障转移和副本同步。
基础架构
client write
|
v
redis master 6379
|
+-- redis replica 6380
|
+-- redis replica 6381
写入只发送到主节点,从节点通过复制链路接收数据。普通主从不会自动故障转移,需要配合 Sentinel 或人工切换。
从节点配置
在从节点 redis.conf 中配置:
replicaof 10.0.0.11 6379
masterauth change-me
requirepass change-me
replica-read-only yes
repl-diskless-sync yes
repl-backlog-size 256mb
也可以临时执行命令:
REPLICAOF 10.0.0.11 6379
取消复制:
REPLICAOF NO ONE
状态检查
INFO replication
ROLE
主节点重点字段:
| 字段 | 说明 |
|---|---|
role:master | 当前节点是主节点 |
connected_slaves | 已连接从节点数量 |
master_repl_offset | 主节点复制偏移量 |
repl_backlog_active | 复制 backlog 是否启用 |
从节点重点字段:
| 字段 | 说明 |
|---|---|
role:slave | 当前节点是从节点 |
master_host | 主节点地址 |
master_link_status | 复制链路状态 |
slave_repl_offset | 从节点复制偏移量 |
master_last_io_seconds_ago | 距离上次主从通信的秒数 |
全量同步和部分同步
全量同步通常发生在:
- 从节点首次连接主节点。
- 从节点复制偏移量不在主节点 backlog 中。
- 主从复制 ID 不匹配。
部分同步依赖 repl-backlog-size。写入量越大、网络越不稳定,越需要更大的 backlog。
读写分离注意事项
从节点适合承担读请求,但要接受复制延迟:
- 强一致读取不要走从节点。
- 登录态、权限、余额等敏感场景要谨慎。
- 客户端需要具备主从路由能力。
- 从节点默认
replica-read-only yes,不应该承接写入。
复制延迟排查
查看主从偏移量差距:
redis-cli -a "$REDIS_PASSWORD" -h 10.0.0.11 -p 6379 info replication
redis-cli -a "$REDIS_PASSWORD" -h 10.0.0.12 -p 6379 info replication
排查方向:
- 主节点写入量是否突增。
- 从节点 CPU、磁盘、网络是否瓶颈。
- 是否存在大 key 删除、慢命令或阻塞命令。
client-output-buffer-limit replica是否触发。repl-backlog-size是否过小导致频繁全量同步。
手动切换
普通主从场景下,主节点故障后的简化人工切换流程:
- 确认原主节点不可用,避免双主。
- 选择数据最新的从节点执行
REPLICAOF NO ONE。 - 修改其他从节点复制到新主节点。
- 修改业务连接地址或负载均衡配置。
- 原主节点恢复后作为从节点重新加入。
REPLICAOF NO ONE
其他从节点:
REPLICAOF 10.0.0.12 6379
生产环境建议使用 Sentinel 或 Cluster 自动完成故障转移。