3. Sentinel核心概念与术语

Sentinel 的运维与排障,本质上是在一组“角色 + 状态 + 纪元”之间做判断。如果只记住命令,遇到主从切换异常、脑裂或误判时就会无从下手。本节把 Sentinel 体系中最关键的八个术语放在同一张关系图中理解:Sentinel 节点、主节点、从节点、主观下线、客观下线、领导者选举、故障转移、配置纪元。它们不是并列的名词,而是一条从“监控”到“判定”再到“执行与传播”的因果链。

① 监控层:Sentinel 节点观察主从 Sentinel-1 26379 / 独立进程 Sentinel-2 26379 / 独立进程 Sentinel-3 26379 / 独立进程 主节点 Master 6379 / 可写 redis-master 从节点 Slave-1 6380 / 只读 从节点 Slave-2 6381 / 只读 PING / INFO 复制 复制 ② 判定层:下线判定与选举 主观下线 SDOWN 单 Sentinel 超时判定 客观下线 ODOWN ≥ quorum 达成一致 领导者选举 Raft / 多数票胜出 故障转移 选从→提升→重定向 多节点确认 ③ 纪元层 配置纪元 configEpoch 单调递增版本号 冲突时大者胜 写入新纪元 判定链:Sentinel 持续 PING → 单点超时记 SDOWN → 询问其他 Sentinel 汇总票数 → 达到 quorum 记 ODOWN → 选举 Leader → Leader 执行故障转移并提升新主 → 用更高 configEpoch 广播新拓扑,旧主回归后降级为从。

一、三类节点:谁在监控,谁在被监控

Sentinel 节点是独立运行的进程,不存储业务数据,只负责监控、判定和协调。它默认监听 26379 端口,通过向主从节点发送 PING、INFO、PUBLISH/SUBSCRIBE 来获取拓扑与健康信息。生产环境至少部署 3 个 Sentinel,且应分布在不同物理机或可用区,否则一台机器宕机会同时带走多个“裁判”,判定能力直接失效。

主节点(Master)是当前唯一接受写请求的 Redis 实例,它把写命令通过复制流同步给从节点。从节点(Slave/Replica)默认只读,持续从主节点拉取数据。Sentinel 并不改变 Redis 自身的复制协议,它只是在拓扑发生变化时,用 SLAVEOF(新版本为 REPLICAOF)命令重新指定主从关系。

二、主观下线与客观下线:从“我觉得”到“大家确认”

主观下线(SDOWN,Subjectively Down)是单个 Sentinel 的本地判断。当它向某节点发送 PING 后,在 down-after-milliseconds 时间内没有收到有效回复(包括返回 -LOADING、-MASTERDOWN 等异常状态),就把该节点标记为 SDOWN。这个判断只代表“我这一个 Sentinel 认为它挂了”,可能是网络抖动、对方阻塞或本机网络问题。

客观下线(ODOWN,Objectively Down)是多个 Sentinel 达成的一致结论。当某个 Sentinel 把主节点判为 SDOWN 后,会向其他 Sentinel 发送 SENTINEL is-master-down-by-addr 询问,统计同意票数。若票数达到配置的 quorum,主节点才被标记为 ODOWN,才允许进入故障转移。注意:ODOWN 只针对主节点,从节点下线不会触发故障转移。

quorum 是“判定下线所需票数”,不是“选举 Leader 所需票数”。Leader 选举要求的是 Sentinel 总数过半(majority),两者不要混淆。例如 3 个 Sentinel、quorum=2,判定 ODOWN 需要 2 票,选举 Leader 需要 2 票。

三、领导者选举:谁来执行这次故障转移

主节点被判定 ODOWN 后,多个 Sentinel 都可能想执行故障转移,必须选出一个领导者(Leader),避免重复切换。选举基于 Raft 思路:每个 Sentinel 在同一个配置纪元(epoch)内只有一票,先向其他节点拉票,获得多数票者成为 Leader。若本轮无人过半,则等待随机超时后进入下一纪元重选。选举出的 Leader 才有权执行故障转移。

四、故障转移:从选从到重定向

故障转移(Failover)由 Leader 执行,核心动作包括:从原主节点的从节点中挑选一个最合适的提升为新主;向其余从节点发送 REPLICAOF 指向新主;把旧主标记为从节点,待其恢复后自动降级。挑选从节点的优先级顺序大致为:先看 replica-priority(数值越小优先级越高,0 表示不参选),再看复制偏移量(offset 越大数据越新),最后看 runid 字典序。转移完成后,Sentinel 通过发布订阅把新拓扑广播给客户端,客户端据此把写请求切到新主。

五、配置纪元:解决“谁说了算”的版本号

配置纪元(configEpoch)是每个主节点配置的单调递增版本号。每次故障转移产生新主时,新主的 configEpoch 会被提升到当前最大值之上。当多个节点对“谁是主”产生分歧时,configEpoch 更大的一方获胜,从而避免旧主恢复后仍自认为是主、造成双主写入。可以用以下命令观察纪元与拓扑:

# 查看某主节点的配置纪元与从节点信息
redis-cli -p 26379 SENTINEL master mymaster

# 输出示例(节选)
name               mymaster
ip                 192.168.1.10
port               6379
flags              master
num-slaves         2
num-other-sentinels 2
quorum             2
config-epoch       7
leader-epoch       7

# 查看所有 Sentinel 已知的从节点
redis-cli -p 26379 SENTINEL slaves mymaster

# 手动触发一次故障转移(仅用于演练)
redis-cli -p 26379 SENTINEL failover mymaster

把八个术语串起来看:Sentinel 节点监控主从;单点超时形成主观下线;多节点投票达到 quorum 形成客观下线;随后选举领导者;领导者执行故障转移;整个过程用配置纪元标记版本,保证新拓扑唯一且可比较。理解这条链,后续配置 quorum、down-after-milliseconds、failover-timeout 时,才能判断每个参数究竟作用在链路的哪一环。