2. Redis Sentinel 架构原理:哨兵节点、主节点、从节点角色与选举机制

Redis Sentinel(哨兵)是 Redis 官方提供的高可用性解决方案。在模板引擎缓存场景中,Sentinel 负责监控主从集群的健康状态,并在主节点发生故障时自动完成故障转移,从而保证缓存层对模板渲染引擎的持续可用。理解 Sentinel 的架构原理,是掌握故障转移容错实践的基础。

2.1 核心角色与职责

一个标准的 Redis Sentinel 架构包含三类节点,每类节点承担不同的职责,共同构成高可用监控与故障恢复体系。

角色 数量 核心职责 模板引擎缓存中的意义
哨兵节点 (Sentinel) ≥ 3(奇数) 监控、通知、自动故障转移、配置提供 确保缓存写入/读取始终指向可用主节点
主节点 (Master) 1 处理读写请求、数据同步源 模板渲染结果写入主节点,保证数据一致性
从节点 (Replica) ≥ 1 复制主节点数据、提供读服务、故障时备升主 分担读压力,故障转移时成为新主节点
架构要点:生产环境中 Sentinel 节点必须部署为奇数(通常 3 或 5 个),这是为了在选举时能形成多数派(Quorum),避免“脑裂”导致同时出现两个主节点。

2.2 Sentinel 架构拓扑与通信流程

下图展示了 Sentinel 架构中三类节点的拓扑关系以及核心通信链路。哨兵节点之间通过 Gossip 协议交换对主从节点的认知,哨兵与主从节点之间通过定时任务(PING/INFO/PUBLISH)维持心跳与状态同步。

Redis Sentinel 架构拓扑与通信流程 Redis Sentinel 架构拓扑与通信流程 哨兵节点组 (Sentinel Ensemble) Sentinel-1 Sentinel-2 Sentinel-3 主节点 (Master) 读写 + 数据同步源 从节点 (Replica-1) 读服务 从节点 (Replica-2) 读服务 图例: 监控/心跳 (PING/INFO) 数据复制 / 哨兵间通信 Gossip 消息传播

2.3 哨兵节点的核心工作流程

Sentinel 节点通过三个定时任务持续维护集群状态,这是故障转移决策的数据基础。

  1. 每 1 秒 PING 所有节点:检测主节点、从节点和其他 Sentinel 节点的存活状态。
  2. 每 2 秒 PUBLISH 自身信息:向 __sentinel__:hello 频道发布自身对主节点的认知,其他 Sentinel 通过订阅该频道发现彼此并交换信息。
  3. 每 10 秒 INFO 主从节点:获取主从节点的完整拓扑信息(复制偏移量、角色、从节点列表等),用于选举时判断数据最新性。
模板引擎缓存关联:当模板渲染引擎写入缓存时,如果主节点故障,Sentinel 通过上述定时任务最快在 1 秒内感知到 PING 超时,随后启动故障转移流程,将缓存写入切换到新主节点,避免模板渲染因缓存写入失败而阻塞。

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 领导者选举步骤

  1. 发起竞选:每个检测到 ODOWN 的 Sentinel 都会向其他 Sentinel 发送 is-master-down-by-addr 请求,附带自己的运行 ID 和当前纪元(Epoch)。
  2. 投票规则:每个 Sentinel 在每个纪元内只能投票给一个候选人。先到先得,且候选人必须满足:请求中的纪元 ≥ 当前已知的最大纪元。
  3. 胜出条件:获得超过半数(> N/2)Sentinel 投票的节点成为领导者。如果平局,则等待下一个纪元重新选举。

2.5.2 故障转移执行流程

领导者 Sentinel 获得授权后,按以下步骤执行故障转移:

Redis Sentinel 故障转移执行流程 Redis Sentinel 故障转移执行流程 ① 从节点列表筛选 排除不健康/断连节点 ② 从节点排序 按复制偏移量降序 ③ 发送 SLAVEOF NO ONE 提升为新主节点 ④ 配置其他从节点 复制新主节点 关键决策点说明: • 筛选规则:排除主观下线、PING 超时、与主节点断开超过 10 倍 down-after-milliseconds 的从节点。 • 排序规则:优先选择复制偏移量最大的从节点(数据最新);偏移量相同时选择 run-id 较小的节点。 • 提升后操作:领导者 Sentinel 向新主节点发送 SLAVEOF NO ONE,等待其角色切换完成。 • 最终配置:向剩余从节点发送 SLAVEOF 新主节点 IP 端口,并更新自身配置中的主节点地址。

2.6 模板引擎缓存中的角色切换感知

故障转移完成后,模板引擎缓存客户端(如 Jedis、Lettuce、Redisson)需要感知主节点地址的变化。Sentinel 提供了两种机制:

  • 客户端直连 Sentinel:客户端通过 sentinel get-master-addr-by-name 命令获取当前主节点地址,并在每次操作前检查。适用于连接池较小的场景。
  • 客户端订阅 + 回调:客户端订阅 +switch-master 频道,当 Sentinel 发布主节点切换事件时,客户端自动更新连接池中的主节点地址。这是模板引擎缓存场景的推荐方式,切换延迟通常在毫秒级。
最佳实践:在模板引擎缓存初始化时,配置 Sentinel 节点列表和主节点名称(master-name),并启用自动重连与主节点切换监听。这样当故障转移发生时,模板渲染线程无需重启,缓存写入即可无缝切换到新主节点。

2.7 本章小结

Redis Sentinel 通过哨兵节点、主节点、从节点三类角色的协同工作,实现了对 Redis 主从集群的自动故障转移。哨兵节点利用定时 PING、INFO 和 PUBLISH 机制维持集群视图,通过主观下线与客观下线的两级判定避免误判,再基于 Raft 算法选举领导者执行故障转移。在模板引擎缓存场景中,理解这一架构原理是配置高可用缓存层、保障模板渲染持续可用的前提。