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,主节点失联期间拒绝写入。
  • 记忆点:复制解决冗余,哨兵解决高可用,异步复制是丢数据窗口的根源。
笔记加载中…