Redis Sentinel
一、架构定位与第一性原理
1.1 Sentinel 的本质定义
Redis Sentinel 是一个:
去中心化的主节点裁决系统(Distributed Master Arbitration System),在 异步复制 + 弱一致性 的前提下,为 Redis 主从架构提供 自动化故障发现、主节点切换与客户端重定向能力。
它并不复制数据,也不参与业务请求处理,而是专注于一个核心问题:
当“谁是主节点”出现不确定性时,由谁、以什么规则、在什么条件下做出裁决。
1.2 Sentinel 解决的问题与不解决的问题
| 维度 | Sentinel 做的事 | Sentinel 不做的事 |
|---|---|---|
| 可用性 | 自动主从切换 | 不保证服务零中断 |
| 一致性 | 裁决主节点身份 | 不保证数据不丢失 |
| 架构职责 | 状态感知与协调 | 不参与数据复制 |
| 客户端 | 提供主节点发现 | 不屏蔽业务异常 |
关键设计取舍:Sentinel 明确选择了 可用性优先(Availability First)。
二、整体架构与角色模型
2.1 系统角色分工(职责边界)
| 角色 | 核心职责 | 设计哲学 |
|---|---|---|
| Redis Master | 提供写服务 | 单点、性能优先 |
| Redis Slave | 数据复制、读扩展 | 异步、弱一致 |
| Sentinel | 主节点裁决与通知 | 去中心化、多数决 |
| Client | 连接与重试 | 感知变化、自适应 |
Sentinel 只负责“判断与通知”,而不是“修复所有问题”。
三、Sentinel 的能力模型(结构化认知)
3.1 能力树总览
Redis Sentinel 能力模型├── 状态感知│ ├── 心跳检测(Ping)│ ├── 主观下线(sdown)│ └── 客观下线(odown)├── 共识裁决│ ├── Gossip 信息扩散│ ├── 法定人数(Quorum)│ └── 领导者选举├── 故障转移│ ├── 新主节点选择策略│ ├── 主从拓扑重组│ └── 客户端变更通知├── 系统协作│ ├── 与 Redis Replication 协作│ └── 与 Client 的契约└── 运维治理 ├── 部署与隔离策略 ├── 多集群管理 └── 运维控制接口四、状态感知:从局部怀疑到系统事实
4.1 三类定时机制的抽象意义
Sentinel 的定时任务不是“实现细节”,而是 状态收敛机制:
| 机制 | 抽象目的 |
|---|---|
| INFO 拉取 | 构建全局拓扑视图 |
| Gossip 消息 | 消除单点认知偏差 |
| Ping 心跳 | 最小成本的生存探测 |
4.2 sdown 与 odown 的哲学差异
sdown(主观下线):
- 个体视角的怀疑
- 不足以触发系统级动作
odown(客观下线):
- 群体共识的事实
- 触发架构变更的唯一入口
分布式系统的核心原则:单点怀疑 ≠ 系统事实
五、共识裁决:Sentinel 如何“达成一致”
5.1 Sentinel 与共识算法的关系
Sentinel 借鉴共识思想,但不是完整共识系统。
| 维度 | Sentinel | Raft |
|---|---|---|
| 目标 | 主节点裁决 | 日志一致性 |
| 一致性粒度 | 节点状态 | 数据操作 |
| 强度 | 弱一致 | 强一致 |
| 是否复制数据 | 否 | 是 |
Sentinel 的共识是 “是否切换 + 切到谁”,而不是“数据是否一致”。
5.2 为什么需要 Leader Sentinel
- 减少并发切换
- 保证拓扑调整的原子性
- 将“共识判断”与“执行动作”解耦
Leader 的角色:
共识的执行者,而不是权力中心。
六、故障转移:一次受控的系统重组
6.1 新主节点选择的设计原则
选择顺序背后的抽象逻辑:
- **可达性优先**(活着比完整更重要)
- **数据新鲜度优先**(复制偏移量)
- **稳定性优先**(优先级、运行时间)
这不是“规则堆叠”,而是 风险最小化策略。
6.2 故障转移的系统级因果链
节点异常 ↓主观下线(sdown) ↓客观下线(odown) ↓领导者选举 ↓新主节点裁决 ↓拓扑重组 ↓客户端感知变化七、数据丢失:设计必然性,而非缺陷
7.1 数据丢失的根因模型
异步复制 ↓主从状态不一致 ↓网络分区 ↓错误主节点继续写入 ↓主备切换 ↓写入回滚(数据丢失)7.2 Sentinel 的设计立场
- 选择 **AP(可用性 + 分区容忍)**
- 放弃 **强一致写安全**
Sentinel 不是为“零数据丢失”而生,而是为“快速恢复服务”而生。
八、部署与治理:架构稳定性的外延
8.1 Sentinel 数量与分布原则
- 至少 3 个(奇数)
- 跨物理机 / 可用区
- 避免与 Redis 节点强耦合
8.2 一套 vs 多套 Sentinel
| 方案 | 优点 | 风险 |
|---|---|---|
| 单 Sentinel 集群 | 成本低 | 故障影响面大 |
| 多 Sentinel 集群 | 隔离性强 | 运维复杂 |
九、客户端协作模型(被忽视的关键角色)
客户端必须承担的责任:
- 主节点变化感知
- 重试与幂等控制
- 写失败容忍
没有“傻客户端”的高可用系统。
十、选型与演进视角
10.1 Sentinel 适合的场景
| 场景 | 是否适合 |
|---|---|
| 缓存 / 会话 | ✅ |
| 读多写少 | ✅ |
| 简单高可用 | ✅ |
| 强一致金融系统 | ❌ |
10.2 与其他方案的哲学差异
- Sentinel:快速恢复、低复杂度
- Redis Cluster:分片 + 自动迁移
- etcd / Zookeeper:强一致协调
关联内容(自动生成)
- [/中间件/数据库/redis/复制.html](/中间件/数据库/redis/复制.html) Redis复制机制是哨兵模式的基础,哨兵主要监控的就是Redis的主从复制架构,了解复制机制有助于理解哨兵如何判断主从状态
- [/中间件/数据库/redis/集群.html](/中间件/数据库/redis/集群.html) Redis集群提供了另一种高可用方案,与哨兵模式在架构设计和故障处理上有异同,可对比参考
- [/中间件/数据库/redis/Redis.html](/中间件/数据库/redis/Redis.html) 作为Redis整体介绍文档,提供了Redis的基础概念和架构背景,有助于理解哨兵在整个Redis生态中的定位
- [/软件工程/架构/系统设计/分布式/分布式共识算法.html](/软件工程/架构/系统设计/分布式/分布式共识算法.html) 哨兵系统涉及分布式一致性问题和领导者选举,相关共识算法为理解哨兵的决策机制提供理论基础
- [/软件工程/架构/系统设计/可用性.html](/软件工程/架构/系统设计/可用性.html) 哨兵系统的核心目标是保障Redis的高可用性,该文档提供了可用性的通用设计原则和实践
- [/软件工程/架构/系统设计/分布式/分布式系统.html](/软件工程/架构/系统设计/分布式/分布式系统.html) 从分布式系统整体视角理解哨兵模式在分布式架构中的作用和设计原理
- [/中间件/数据库/文档数据库.html](/中间件/数据库/文档数据库.html) 其他数据库的高可用实现方式,如MongoDB的副本集,可与Redis哨兵进行对比分析
- [/软件工程/架构/系统设计/网关.html](/软件工程/架构/系统设计/网关.html) 网关的高可用设计与哨兵有相似之处,都是为了保障系统组件的可用性
- [/运维/K8s.html](/运维/K8s.html) Kubernetes的高可用架构设计,提供了另一种分布式系统高可用的实现思路
- [/软件工程/架构/系统设计/流量控制.html](/软件工程/架构/系统设计/流量控制.html) Sentinel作为流量控制组件与Redis哨兵在概念上有相似之处,但应用场景不同