3. Sentinel核心概念与术语
Sentinel 的运维与排障,本质上是在一组“角色 + 状态 + 纪元”之间做判断。如果只记住命令,遇到主从切换异常、脑裂或误判时就会无从下手。本节把 Sentinel 体系中最关键的八个术语放在同一张关系图中理解:Sentinel 节点、主节点、从节点、主观下线、客观下线、领导者选举、故障转移、配置纪元。它们不是并列的名词,而是一条从“监控”到“判定”再到“执行与传播”的因果链。
一、三类节点:谁在监控,谁在被监控
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 只针对主节点,从节点下线不会触发故障转移。
三、领导者选举:谁来执行这次故障转移
主节点被判定 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 时,才能判断每个参数究竟作用在链路的哪一环。