首页/数据/Redis 进阶速查/哨兵的边界与局限
主从与哨兵51 条

哨兵的边界与局限

哨兵解决主从高可用,但扩展性受单主写入限制;同时存在脑裂风险(主库与哨兵间网络割裂时可能双写),需要用写保护和多副本策略缓解。

Redis 进阶速查数据更新于 2026-10-13

哨兵是什么

Sentinel(哨兵)是 Redis 官方基于主从复制的高可用组件,只负责四件事:持续监控、事件通知、自动故障转移、给客户端提供当前主库地址。它本身不保存业务数据,也不分担任何读写流量。哨兵从 Redis 2.8 起随主程序一起发布,可用 redis-sentinel 或 redis-server --sentinel 启动,默认监听 26379 端口。生产环境至少要部署三个哨兵且为奇数,才能避免单点投票失效。

基本信息

运行方式redis-sentinel /etc/sentinel.conf(Linux 随 redis 安装包提供)
默认端口26379,与业务端口无关
部署数量3 或 5 个,跨机架或跨可用区分散
数据角色不读写数据,只参与裁决与通知
判定条件quorum 票数 + 多数哨兵同意才能切换

典型使用场景

  • 主库宕机后自动把从库提升为新主库,省掉人工登录改指向的操作
  • 客户端通过哨兵查询当前主库地址,主从切换后无需修改应用配置
  • 多台从库挂在同一主库上做读扩展,需要统一的主库漂移能力
  • 单机内存与写入量仍在可控范围,只需高可用而不需要分片能力时优先选哨兵
  • 运维告警联动:哨兵会发布 sdown、odown、switch-master 等事件,可接入监控系统

最小哨兵配置

最小哨兵配置
port 26379                                  # 哨兵自身端口
sentinel monitor mymaster 10.0.0.10 6379 2   # 末位 2 是判定客观下线所需票数
sentinel auth-pass mymaster app-password     # 主库有密码时必须配置
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
sentinel deny-scripts-reconfig yes           # 固定哨兵不再改写配置文件

常用查看命令

常用查看命令
redis-cli -p 26379 SENTINEL masters                        # 列出被监控的主库
redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster  # 当前主库地址
redis-cli -p 26379 SENTINEL replicas mymaster               # 该主库下的副本列表
redis-cli -p 26379 SENTINEL failover mymaster               # 手工触发一次切换演练

主要局限对照

局限具体表现缓解办法
单主写入写入能力受一台机器上限约束,无法横向扩展写入或数据量到顶时改用 Cluster
切换窗口不可写探测加选主期间写请求报错,通常持续数十秒客户端重试并缩短判定时间
脑裂双写旧主与哨兵网络割裂但仍被客户端可达时可能继续接收写配置最少副本写保护并做业务对账
没有分片槽位与数据分布不在哨兵职责范围内需要分片能力时选 Cluster
哨兵不代理流量,客户端必须支持哨兵协议或经一层代理才能用;把主库固定 IP 写死在应用配置里,切换之后必然连错。
切换期间主库身份会变,连接池里缓存的旧连接要能自动失效重建,否则应用会持续收到 READONLY 报错。

易错点

  • 把哨兵当零停机保证:切换窗口内写入确实会失败,业务侧必须允许重试,否则表现为应用大面积报错
  • 只部署两个哨兵节点:任一节点故障或网络抖动就可能凑不够法定票数,故障转移形同虚设
  • 从库与主库放在同一台物理机或同一机架,主库所在机器掉电时从库一起消失,高可用名存实亡
  • 未做写保护时旧主可能在脑裂窗口继续接受写入,这部分数据在恢复后会被覆盖丢失

数据来源与参考

  • Redis 官方文档:Sentinel 限制与脑裂说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌