Redis 主从复制与哨兵是如何工作的?
结论先行:主从复制解决读扩展与数据冗余,核心是"全量同步 + 增量同步";哨兵(Sentinel)在主从之上提供监控、自动故障转移与通知,是主从架构的高可用大脑。复制是异步的,故障切换期间存在短暂写不可用与数据丢失窗口,需要配合配置兜底。
一、主从复制原理
- 全量同步:从节点首次连接时,主节点执行 bgsave 生成 RDB 发给从节点,并把期间的写命令放入复制积压缓冲区(repl_backlog)补发;
- 增量同步:基于 replid 与 offset 对比,从节点缺失的命令若仍在积压缓冲区内,主节点只补发差异部分;
- 版本演进:2.8 的 PSYNC 支持断线续传,4.0 的 PSYNC2 让故障切换后的从节点也能尝试部分重同步;
- 复制方向:支持级联(从节点再挂从节点),可缓解主节点复制压力;
- 关键点:复制是异步的,主节点写成功即返回,从节点延迟会导致读到旧数据;
- 排障三板斧:info replication 中的 role、master_link_status、slave_repl_offset 是定位复制问题的第一步;
- 持久化告诫:主从都建议开启持久化,否则主节点重启后可能以空数据集同步,把从节点数据一并清掉。
二、哨兵机制
| 职责 | 说明 |
|---|---|
| 监控 | 周期性向主从节点发心跳(PING) |
| 主观下线 | 单个哨兵判定节点不可达 |
| 客观下线 | 多个哨兵(quorum)确认后判定主节点故障 |
| 选主 | 哨兵集群选出 leader,按优先级、复制偏移、runid 选举新主 |
| 故障转移 | 新主提升,其余从节点改挂新主,通知客户端 |
三、常见配置命令
# 配置从节点
replicaof 127.0.0.1 6379
# 查看复制信息
redis-cli info replication
# 哨兵监控主节点:名为 mymaster,地址 127.0.0.1:6379,quorum 为 2
sentinel monitor mymaster 127.0.0.1 6379 2
常见追问 / 记忆点
- 追问:切换期间会丢数据吗?答:主节点故障前未同步到从节点的写会丢,可用 WAIT 或客户端写保护缓解,无法完全避免。
- 追问:为什么用哨兵而不用客户端自己切?答:客户端多且分散,由哨兵统一判定并推送新主地址,避免各客户端判断不一致。
- 追问:脑裂怎么防?答:配置 min-replicas-to-write 与 min-replicas-max-lag,主节点失联期间拒绝写入。
- 记忆点:复制解决冗余,哨兵解决高可用,异步复制是丢数据窗口的根源。