2. Redis Sentinel 架构原理:哨兵节点、主节点、从节点角色与选举机制
Redis Sentinel(哨兵)是 Redis 官方提供的高可用性解决方案。在模板引擎缓存场景中,Sentinel 负责监控主从集群的健康状态,并在主节点发生故障时自动完成故障转移,从而保证缓存层对模板渲染引擎的持续可用。理解 Sentinel 的架构原理,是掌握故障转移容错实践的基础。
2.1 核心角色与职责
一个标准的 Redis Sentinel 架构包含三类节点,每类节点承担不同的职责,共同构成高可用监控与故障恢复体系。
| 角色 | 数量 | 核心职责 | 模板引擎缓存中的意义 |
|---|---|---|---|
| 哨兵节点 (Sentinel) | ≥ 3(奇数) | 监控、通知、自动故障转移、配置提供 | 确保缓存写入/读取始终指向可用主节点 |
| 主节点 (Master) | 1 | 处理读写请求、数据同步源 | 模板渲染结果写入主节点,保证数据一致性 |
| 从节点 (Replica) | ≥ 1 | 复制主节点数据、提供读服务、故障时备升主 | 分担读压力,故障转移时成为新主节点 |
2.2 Sentinel 架构拓扑与通信流程
下图展示了 Sentinel 架构中三类节点的拓扑关系以及核心通信链路。哨兵节点之间通过 Gossip 协议交换对主从节点的认知,哨兵与主从节点之间通过定时任务(PING/INFO/PUBLISH)维持心跳与状态同步。
2.3 哨兵节点的核心工作流程
Sentinel 节点通过三个定时任务持续维护集群状态,这是故障转移决策的数据基础。
- 每 1 秒 PING 所有节点:检测主节点、从节点和其他 Sentinel 节点的存活状态。
- 每 2 秒 PUBLISH 自身信息:向
__sentinel__:hello频道发布自身对主节点的认知,其他 Sentinel 通过订阅该频道发现彼此并交换信息。 - 每 10 秒 INFO 主从节点:获取主从节点的完整拓扑信息(复制偏移量、角色、从节点列表等),用于选举时判断数据最新性。
2.4 主观下线与客观下线
Sentinel 对节点的故障判定分为两个阶段,这是防止误判的关键机制。
| 状态 | 判定条件 | 触发方 | 后续动作 |
|---|---|---|---|
| 主观下线 (SDOWN) | 单个 Sentinel 在 down-after-milliseconds 内 PING 无响应 |
单个 Sentinel 节点 | 标记节点为 SDOWN,并向其他 Sentinel 发送 is-master-down-by-addr 询问 |
| 客观下线 (ODOWN) | 超过 quorum 数量的 Sentinel 认为主节点 SDOWN |
多个 Sentinel 节点 | 触发故障转移选举流程 |
quorum 值建议设置为 Sentinel 节点总数的一半加一(例如 3 个 Sentinel 时 quorum=2)。如果 quorum 设置过大(如等于节点总数),当网络抖动导致一个 Sentinel 失联时,将永远无法达成客观下线,故障转移无法触发。
2.5 领导者选举与故障转移流程
当主节点被判定为客观下线后,Sentinel 集群内部会先选举出一个领导者(Leader Sentinel),由该领导者负责执行故障转移操作。选举基于 Raft 算法 的简化实现。
2.5.1 领导者选举步骤
- 发起竞选:每个检测到 ODOWN 的 Sentinel 都会向其他 Sentinel 发送
is-master-down-by-addr请求,附带自己的运行 ID 和当前纪元(Epoch)。 - 投票规则:每个 Sentinel 在每个纪元内只能投票给一个候选人。先到先得,且候选人必须满足:请求中的纪元 ≥ 当前已知的最大纪元。
- 胜出条件:获得超过半数(> N/2)Sentinel 投票的节点成为领导者。如果平局,则等待下一个纪元重新选举。
2.5.2 故障转移执行流程
领导者 Sentinel 获得授权后,按以下步骤执行故障转移:
2.6 模板引擎缓存中的角色切换感知
故障转移完成后,模板引擎缓存客户端(如 Jedis、Lettuce、Redisson)需要感知主节点地址的变化。Sentinel 提供了两种机制:
- 客户端直连 Sentinel:客户端通过
sentinel get-master-addr-by-name命令获取当前主节点地址,并在每次操作前检查。适用于连接池较小的场景。 - 客户端订阅 + 回调:客户端订阅
+switch-master频道,当 Sentinel 发布主节点切换事件时,客户端自动更新连接池中的主节点地址。这是模板引擎缓存场景的推荐方式,切换延迟通常在毫秒级。
2.7 本章小结
Redis Sentinel 通过哨兵节点、主节点、从节点三类角色的协同工作,实现了对 Redis 主从集群的自动故障转移。哨兵节点利用定时 PING、INFO 和 PUBLISH 机制维持集群视图,通过主观下线与客观下线的两级判定避免误判,再基于 Raft 算法选举领导者执行故障转移。在模板引擎缓存场景中,理解这一架构原理是配置高可用缓存层、保障模板渲染持续可用的前提。