Sentinel 是什么
哨兵(Sentinel)是由若干独立进程组成的监控集群,默认端口 26379,自身不存数据也不代理流量。它的四件事:周期 PING 主从与其它哨兵做监控;把失联实例标记为主观下线 sdown,票数达到 quorum 后升级为客观下线 odown;由哨兵之间选出的 leader 执行故障转移,把从库提升为新主并让其它从库指向它;最后通过 Pub/Sub 与 +switch-master 事件通知客户端。
基本信息
| 默认端口 | 26379 |
|---|---|
| 最小部署 | 3 个哨兵(分属 3 台机器)+ 1 主 2 从 |
| 关键配置 | sentinel monitor / down-after-milliseconds / failover-timeout / parallel-syncs |
| 判定机制 | quorum 决定能否判下线,过半哨兵同意才选出 leader |
| 客户端要求 | 必须支持哨兵协议:先问主地址,再连数据实例 |
典型使用场景
- 主从架构的高可用:主库宕机后自动提升从库,减少人工介入时间
- 读写分离场景:客户端从哨兵获取当前主库地址,避免写错实例
- 机房单点容忍:三个哨兵分散部署,避免与数据节点同机失效
- 故障演练:用 debug sleep 或停进程模拟主库失联,验证切换耗时
- 切换可观测:订阅 +switch-master 事件送进告警,掌握每次主库变更
- 客户端配置中心:业务不再硬编码主库地址,改由哨兵提供
最小部署形态
最小部署形态
# 3 个哨兵(分属 3 台机器)+ 1 主 2 从
# 每台哨兵启动:
redis-sentinel /etc/redis/sentinel.conf --sentinel
ss -tlnp | grep 26379 # 确认哨兵端口在监听
redis-cli -p 26379 SENTINEL masters # 查看被监控的主库与状态
redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster # 客户端取主地址的方式
# sentinel.conf 关键项:
# sentinel monitor mymaster 10.0.0.11 6379 2
# sentinel down-after-milliseconds mymaster 30000
# sentinel failover-timeout mymaster 180000
# sentinel parallel-syncs mymaster 1状态与事件读法
| 状态/事件 | 含义 | 关注点 |
|---|---|---|
| sdown | 单个哨兵认为实例不可达 | 可能是网络抖动,尚未触发切换 |
| odown | 达到 quorum 后确认客观下线 | 此时才进入故障转移流程 |
| +switch-master | 完成切换的主库地址变更事件 | 客户端订阅后应能及时刷新连接 |
| +failover-state-* | 切换过程各阶段事件 | 停留在某阶段过久说明切换受阻 |
哨兵自身不做数据读写也不代理流量:客户端必须支持哨兵协议(先问主地址再连),或使用支持 sentinel 的连接池。
quorum 只决定够不够票判下线,真正执行切换的 leader 还需要多数哨兵同意,所以部署 2 个哨兵没有意义:一台故障就凑不齐多数,切换无法完成。