Redis 哨兵(Sentinel):主从架构的「自动保镖」
在 Redis 主从复制经典架构当中,主节点(Master)全权负责集群读写核心请求处理,从节点(Slave)仅专注于实时同步主节点数据,实现数据热备份与读请求分担。但这套基础架构存在一个无法忽视的致命短板:一旦核心主节点因服务器宕机、网络中断、进程崩溃等意外故障下线,整个集群的写服务会直接中断,后续只能依靠运维人员人工介入排查故障、手动挑选健康从节点升格为新主、批量修改所有从节点复制配置、同步更新业务客户端连接地址,整个故障恢复流程耗时漫长、操作繁琐,还极易因人工操作失误引发二次业务故障。
而 Redis 官方原生推出的 Redis Sentinel(哨兵模式),就是专门针对主从架构单点故障问题打造的专业级高可用核心解决方案,我们可以通俗把它理解为给整套Redis主从集群配备了一群7×24小时在岗值守的「自动安全保镖」,能够全天候不间断监控集群所有节点运行状态,一旦检测到主节点异常宕机,可全自动完成新主节点选举、集群配置迁移、从节点重新挂靠、客户端地址同步等全流程操作,全程零人工干预、秒级完成故障切换。今天就结合官方课件核心内容,从基础概念核心释义、Docker环境快速实操部署、底层核心运行原理到生产落地实操要点,全方位深度讲透Redis哨兵机制的所有核心知识点。
一、哨兵核心概念:什么是哨兵?
1. 哨兵的本质
哨兵本质上就是运行在专属特殊模式下的独立Redis守护进程 ,核心特点是不存储任何业务项目的真实业务数据,全程仅承担集群「实时监控者+故障决策者+配置通知者」三大核心职责。哨兵本身采用分布式集群架构设计,生产环境部署时严格要求配置奇数个节点(3个/5个最优),从根源上规避哨兵集群自身单点故障以及投票决策平局的问题,保障整个高可用集群的稳定性与可靠性。
打个比方:
-
主节点 = 餐厅「主厨」,负责炒菜(处理写请求)
-
从节点 = 「帮厨」,跟着主厨学做菜(同步数据)
-
哨兵 = 「大堂经理」,时刻盯着主厨状态,主厨罢工(宕机),立刻从帮厨里选新主厨,还通知顾客(客户端)新地址
2. 哨兵四大核心功能
-
✅ 监控(Monitoring):持续 ping 主从节点,检测是否存活
-
✅ 自动故障转移(Failover):主节点宕机,自动选最优从节点升主
-
✅ 通知(Notification):故障时主动通知客户端 / 运维
-
✅ 配置提供者:客户端问主节点地址,哨兵实时返回最新主节点信息
3. 哨兵集群架构
生产环境最标准、最通用、稳定性最优的哨兵集群基础部署架构为:1台主节点+2台从节点+3台哨兵节点,采用奇数个哨兵节点的核心目的就是彻底规避故障投票选举过程中出现票数均等、无法决策的平局问题,保障故障转移流程顺畅推进。
-
3 个哨兵互相监控,同时监控 1 主 2 从
-
哨兵之间通过Raft 算法选举「领导者」,只有领导者能执行故障转移
-
主从节点只同步数据,不参与哨兵决策
二、手把手部署哨兵(Docker 版)
为了降低环境搭建复杂度、避免本地系统环境冲突、实现集群环境隔离与快速启停重置,课件优先推荐大家采用Docker容器化方式一键部署哨兵集群,操作简单、上手门槛低、适配所有Linux服务器环境。整体部署流程分为两大核心步骤,先快速搭建基础的1主2从Redis数据集群并验证数据同步正常,再部署3个哨兵节点接入集群开启高可用监控。
1. 准备主从节点(1 主 2 从)
(1)编写主从 docker-compose.yml
yaml
version: '3.7'
services:
# 主节点:6379
master:
image: redis:5.0.9
container_name: redis-master
restart: always
command: redis-server --appendonly yes # 开启AOF持久化
ports:
- "6379:6379"
# 从节点1:6380,跟随主节点
slave1:
image: redis:5.0.9
container_name: redis-slave1
restart: always
command: redis-server --appendonly yes --slaveof master 6379
ports:
- "6380:6379"
# 从节点2:6381,跟随主节点
slave2:
image: redis:5.0.9
container_name: redis-slave2
restart: always
command: redis-server --appendonly yes --slaveof master 6379
ports:
- "6381:6379"
(2)启动主从集群
bash
# 启动所有节点
docker-compose up -d
# 验证主节点(127.0.0.1:6379)
redis-cli
127.0.0.1:6379> info replication
# 输出:role:master,2个从节点在线
# 验证从节点(6380/6381)
redis-cli -p 6380
127.0.0.1:6380> info replication
# 输出:role:slave,主节点地址127.0.0.1:6379
2. 部署 3 个哨兵节点
(1)编写哨兵配置文件(sentinel.conf)
三个哨兵节点的核心配置规则完全保持一致,仅对外暴露的服务端口做差异化区分即可,统一配置能有效避免集群监控规则混乱,降低后续运维排查成本,适配集群统一监控管理需求:
conf
# 哨兵端口
port 26379
# 绑定所有地址
bind 0.0.0.0
# 监控主节点:名称redis-master,地址master:6379,法定票数2(3哨兵需2票同意宕机)
sentinel monitor redis-master master 6379 2
# 心跳超时:1000ms没响应,判定主观下线
sentinel down-after-milliseconds redis-master 1000
# 故障转移超时
sentinel failover-timeout redis-master 30000
(2)编写哨兵 docker-compose.yml
yaml
version: '3.7'
services:
# 哨兵1:26379
sentinel1:
image: redis:5.0.9
container_name: redis-sentinel1
restart: always
volumes:
- ./sentinel1.conf:/etc/redis/sentinel.conf
command: redis-sentinel /etc/redis/sentinel.conf
ports:
- "26379:26379"
depends_on:
- master
- slave1
- slave2
# 哨兵2:26380
sentinel2:
image: redis:5.0.9
container_name: redis-sentinel2
restart: always
volumes:
- ./sentinel2.conf:/etc/redis/sentinel.conf
command: redis-sentinel /etc/redis/sentinel.conf
ports:
- "26380:26379"
depends_on:
- master
- slave1
- slave2
# 哨兵3:26381
sentinel3:
image: redis:5.0.9
container_name: redis-sentinel3
restart: always
volumes:
- ./sentinel3.conf:/etc/redis/sentinel.conf
command: redis-sentinel /etc/redis/sentinel.conf
ports:
- "26381:26379"
depends_on:
- master
- slave1
- slave2
(3)启动哨兵集群
bash
# 启动所有哨兵
docker-compose up -d
# 验证哨兵状态
redis-cli -p 26379
127.0.0.1:26379> info sentinel
# 输出:3个哨兵在线,主节点状态正常
三、哨兵工作原理:从监控到故障转移
1. 节点状态判定:主观下线 vs 客观下线
(1)主观下线(SDOWN)
单个哨兵节点通过定时心跳机制持续ping探测主节点服务状态,若在**预设超时时间(默认固定1s)**内没有收到主节点任何响应数据包,当前这一个哨兵节点就会单方面主观判定该主节点处于「主观下线(SDOWN)」状态。
- 仅单个哨兵认为宕机,不可靠(可能是哨兵自身网络问题)
(2)客观下线(ODOWN)
只有集群当中超过半数法定数量的哨兵节点,都先后独立判定主节点为客观下线状态后,哨兵集群才会正式生效认定主节点真正故障下线,标记为「客观下线(ODOWN)」状态,随即自动触发后续全套故障转移执行流程。
- 3 哨兵需 2 票,5 哨兵需 3 票,避免误判
2. 领导者选举:谁来执行故障转移?
当主节点被哨兵集群正式判定为客观下线后,并不会所有哨兵都执行故障转移操作,而是需要在多个哨兵节点之间通过业界通用的Raft分布式选举算法,公平公正筛选出唯一的一个「哨兵领导者(Leader)」,全程只有这名当选的领导者哨兵有权限执行后续所有故障转移核心操作,避免多哨兵重复操作引发集群混乱:
-
每个哨兵都想当 Leader,向其他哨兵发「拉票请求」
-
每个哨兵只能投 1 票,先到先得
-
获得超过半数票数的哨兵当选 Leader,只有它能执行故障转移
3. 故障转移全流程(核心!)
(1)选新主:从从节点里挑「最优者」
成功当选的Leader哨兵会严格按照三重固定优先级排序规则,在所有健康在线的从节点当中,逐层筛选综合条件最优的节点作为新一代主节点,最大程度保障新主节点数据完整性与服务稳定性:
-
优先级(slave-priority):配置值越小,优先级越高
-
复制偏移量:偏移量越大,数据越新(同步数据越多)
-
运行 ID:ID 越小,优先级越高
(2)升新主:让最优从节点变主
Leader哨兵会向筛选出的最优从节点专属执行Redis核心命令slaveof no one,直接解除该节点原有从节点从属身份,正式将其升级为集群全新的主读写节点,全权接管原主节点所有业务读写请求。
(3)重配从:其他从节点跟随新主
新主节点就位完成后,Leader哨兵会逐一集群内其余所有健康从节点,批量下发slaveof 新主IP 新主端口配置命令,让所有从节点快速重新挂靠跟随新主节点,持续同步新主节点后续新增业务数据,保障集群数据备份架构不变。
(4)通知客户端:更新主节点地址
整个集群配置切换完成后,哨兵集群会依托自身内置的发布订阅机制,实时向所有接入的业务客户端推送主节点切换通知,同步更新最新主节点连接地址,业务端无需手动修改配置,自动适配新主节点完成业务读写衔接。
4. 故障恢复:旧主重启后怎么办?
后续原先故障下线的旧主节点,无论因网络恢复、服务器重启还是进程重启重新上线后,无需人工任何配置干预,哨兵集群会自动识别该节点状态,直接将其强制降级为普通从节点,自动挂靠跟随当前在线的新主节点持续同步数据,纳入集群正常备份体系。
四、核心配置参数详解
conf
# 1. 监控主节点(核心)
sentinel monitor <主节点名> <主IP> <主端口> <法定票数>
# 例:sentinel monitor redis-master 127.0.0.1 6379 2
# 2. 主观下线超时(单个哨兵判定宕机时间)
sentinel down-after-milliseconds <主节点名> 1000 # 1秒
# 3. 故障转移超时
sentinel failover-timeout <主节点名> 30000 # 30秒
# 4. 从节点同步新主的并发数
sentinel parallel-syncs <主节点名> 1 # 一次1个从节点同步,减轻新主压力
五、哨兵的优缺点
✅ 优点
-
自动故障转移:主节点宕机秒级切换,无需人工
-
高可用:哨兵集群分布式部署,无单点故障
-
配置简单:Docker 部署一键搭建,运维成本低
-
客户端透明:客户端连哨兵,自动获取主节点地址
❌ 缺点
-
不保证强一致:主从异步复制,故障时可能丢少量数据
-
写能力有限:仍是单主节点,写并发受限于单实例
-
部署奇数哨兵:偶数易投票平局,需 3/5 个
六、总结
Redis哨兵模式作为主从复制架构的专属自动运维保镖,核心核心目标就是彻底解决传统主从架构主节点单点故障、人工运维成本高、故障恢复慢三大核心痛点,是中小规模Redis业务集群生产落地的标配高可用方案:
-
本质:分布式监控系统,奇数节点部署
-
核心:监控→主观下线→客观下线→选 Leader→选新主→重配从
-
定位:高可用,非分布式,适合中小规模写场景
但哨兵模式仅能实现集群高可用故障转移,无法解决海量数据分片存储、超高并发读写拆分的业务需求,当业务数据体量激增、读写并发压力持续飙升,哨兵搭配主从的架构性能会达到瓶颈,此时就需要进阶使用Redis Cluster集群分片模式,后续章节我们将详细讲解分片集群如何突破单实例性能与容量上限。