ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Redis 哨兵模式详解:从原理到生产实践

Redis 哨兵模式详解:从原理到生产实践

一、为什么需要哨兵模式

在业务早期,很多团队会采用 Redis 主从复制架构:一个主节点(Master)负责写操作,多个从节点(Replica)负责读操作,通过读写分离提升性能。但这种架构有一个致命问题:主节点宕机后,整个集群就失去了写能力,需要人工介入切换主从。

在高并发、高可用要求的生产环境中,人工切换不仅响应慢,还容易出错。Redis 哨兵模式(Sentinel)正是为了解决这个问题而生——它在主从架构之上增加了一个独立的监控层,实现了自动故障检测、自动主从切换、自动配置更新。

一句话总结:哨兵模式 = 主从复制 + 自动故障转移 + 监控告警。它不是用来解决容量问题的,而是用来解决高可用问题的。

二、哨兵模式核心架构

一个完整的哨兵模式集群由三部分组成:主节点、从节点、哨兵节点。

  • 主节点(Master):负责所有写操作和查询操作,一个集群只有一个主节点。
  • 从节点(Replica):通过复制同步主节点数据,负责读操作,同时作为主节点的备份。
  • 哨兵节点(Sentinel):独立运行的进程,不存储业务数据,专门负责监控主从节点状态。

图:哨兵模式整体架构图

上图展示了典型的一主二从三哨兵架构。哨兵节点通常部署在不同的服务器上,避免和 Redis 节点部署在同一台机器上——否则机器挂了,哨兵也跟着挂了,就失去了监控意义。

三、哨兵的五大核心功能

3.1 监控(Monitoring)

哨兵会持续地向主节点和从节点发送 PING 命令,检查它们是否正常运行。如果一个节点在指定时间内没有回复 PING,或者回复了错误消息,哨兵就会认为这个节点"主观下线"(Subjectively Down,简称 SDOWN)。

3.2 通知(Notification)

当被监控的节点出现异常时,哨兵可以通过 API 向管理员或者其他应用程序发送告警通知。这是生产环境中必不可少的能力——你需要在第一时间知道 Redis 集群出问题了。

3.3 自动故障转移(Automatic Failover)

这是哨兵最核心的功能。当主节点真正宕机时,哨兵会自动从从节点中选举出一个新的主节点,让其他从节点改为复制新的主节点,整个过程不需要人工干预。

3.4 配置中心(Configuration Provider)

客户端连接 Redis 时,会先连接哨兵,询问当前的主节点地址。故障转移完成后,哨兵会告诉客户端新的主节点地址,客户端据此更新连接。这意味着应用不需要硬编码主节点 IP。

3.5 只读模式(ReadOnly Mode)

哨兵可以配置从节点是否接受读请求。在主节点故障期间,某些从节点可能被标记为不可用,哨兵会指导客户端只连接健康的从节点。

四、故障转移完整流程

很多人知道哨兵能自动切换,但具体怎么切、选谁当新主,背后是一套完整的选举机制。我们一步步拆解:

图:哨兵故障转移完整流程图

4.1 主观下线 vs 客观下线

这是理解哨兵机制的两个关键概念:

概念

触发条件

含义

主观下线(SDOWN)

单个哨兵认为主节点不可用

可能是误判,比如网络抖动,还不能确定主节点真的挂了

客观下线(ODOWN)

超过 quorum 数量的哨兵都认为主节点下线

经过多节点确认,主节点确实宕机了,可以开始故障转移

注意:客观下线只针对主节点。从节点和哨兵节点的下线不需要其他哨兵确认,单个哨兵判断就够了。

4.2 新主节点的选举规则

当 Leader 哨兵要选一个从节点升级为新主时,不是随便选一个,而是按照优先级排序:

  1. 第一步:过滤掉不健康的从节点(下线的、断线的)
  2. 第二步:过滤掉数据太旧的从节点(复制延迟太大的)
  3. 第三步:选择 replica-priority 配置值最小的从节点(优先级越高,值越小)
  4. 第四步:优先级相同,选择复制偏移量最大的(数据最新的)
  5. 第五步:偏移量也相同,选择 runid 最小的

五、关键配置参数详解

哨兵模式的核心配置都在 sentinel.conf 文件中,以下是生产环境必须理解的几个关键参数:

# 监控的主节点名称、IP、端口、法定人数(quorum)
sentinel monitor mymaster 127.0.0.1 6379 2

# 主观下线超时时间(毫秒),超过这个时间没响应就认为主观下线
sentinel down-after-milliseconds mymaster 5000

# 故障转移超时时间(毫秒)
sentinel failover-timeout mymaster 15000

# 故障转移时,同时同步新主的从节点数量
# 值越小,越安全(逐个同步),但恢复时间越长
sentinel parallel-syncs mymaster 1

# 主节点密码(如果设置了密码)
sentinel auth-pass mymaster yourpassword

5.1 quorum 参数怎么设

quorum 是判断客观下线需要多少个哨兵同意。比如你有 3 个哨兵,设置 quorum=2,意味着至少 2 个哨兵都认为主节点挂了,才会真正开始故障转移。

推荐设置:哨兵总数的一半加一。比如 3 个哨兵设 2,5 个哨兵设 3。这样既不会因为单个哨兵误判就触发切换,也不会因为少数几个哨兵挂了就无法选举。

最佳实践:哨兵节点数量建议是奇数(3、5、7),这样在选举 Leader 哨兵时不会出现平局。3 个哨兵是最低配置,能容忍 1 个哨兵故障。

六、三种 Redis 高可用方案对比

很多同学会纠结:我到底该用主从、哨兵还是集群?这里做一个清晰对比:

对比维度

纯主从模式

哨兵模式

Cluster 集群

高可用

无,主挂了人工切换

有,自动故障转移

有,自动故障转移

数据容量

单机内存上限

单机内存上限

可水平扩展,多分片

写性能

单主,写瓶颈在单节点

单主,写瓶颈在单节点

多主,写性能可扩展

运维复杂度

简单

中等

复杂

适用场景

开发测试环境

中小规模,数据量不大

大规模,数据量大、并发高

七、生产环境踩坑指南

7.1 哨兵节点不要和 Redis 节点混部

很多人为了省机器,把哨兵和 Redis 部署在同一台服务器上。这是非常错误的做法——服务器挂了,Redis 和哨兵一起挂,谁来监控?哨兵至少要部署 3 台不同的机器(甚至不同机房)。

7.2 客户端要正确配置哨兵模式

使用 Spring Data Redis 或者 Redisson 时,必须配置哨兵模式的连接方式,不能直接连接主节点 IP。否则故障转移后,客户端还连着旧的主节点地址,服务就不可用了。

spring.redis.sentinel.master=mymaster
spring.redis.sentinel.nodes=192.168.1.1:26379,192.168.1.2:26379,192.168.1.3:26379
spring.redis.password=yourpassword

7.3 脑裂问题

哨兵模式存在一个著名的"脑裂"问题:假设主节点所在的网络和哨兵网络断开了,但主节点本身还活着。这时哨兵们会认为主节点挂了,选举一个新的主节点。但旧的主节点其实还在接收写请求——这就出现了两个主节点,也就是脑裂。

等网络恢复后,旧主节点会被降级为从节点,这段时间写入旧主的数据会全部丢失。

解决方案:配置 min-replicas-to-write 和 min-replicas-max-lag,让主节点至少要有 N 个从节点正常同步时才能接受写请求。这样网络分区时,旧主发现没有从节点同步,就自动拒绝写了。

7.4 不要用哨兵做分片

哨兵模式本质上还是单主架构,所有写压力都在一个主节点上。如果你的数据量超过了单机内存,或者写并发很高,哨兵模式解决不了这个问题,应该直接上 Redis Cluster。

八、总结

Redis 哨兵模式是中小规模生产环境中最常用的高可用方案,它的核心价值在于自动故障转移,解决了主从模式下主节点宕机需要人工介入的痛点。

最后总结一下选型建议:

  • 数据量小、并发不高:用哨兵模式,运维成本低,够用
  • 数据量大、需要水平扩展:直接上 Redis Cluster,不要用哨兵
  • 开发测试环境:主从模式就够了,不用哨兵

理解哨兵的关键不在于记住配置参数,而在于理解主观下线 → 客观下线 → Leader 选举 → 新主选举 → 故障转移这整条链路。掌握了这个流程,再去看源码和排查问题就会清晰很多。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进