主观下线和客观下线
概念区分
在 Redis 哨兵架构中,主节点的下线判定分为两个层次:主观下线(SDOWN) 和 客观下线(ODOWN)。正确理解这两个概念的差异是掌握哨兵工作机制的基础。
主观下线(SDOWN)
定义
主观下线是指单个哨兵根据自己的判断,认为某个节点已经不可用。这是局部判断,不要求其他哨兵同意。
判定条件
每个哨兵会定期向它监控的所有节点(主节点、从节点、其他哨兵)发送 PING 命令。如果哨兵在 down-after-milliseconds 时间内没有收到有效回复,该哨兵就会将这个节点标记为 SDOWN。
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
如果 down-after-milliseconds 设置为 30000 毫秒(30 秒),那么 30 秒内没有 PONG 回复就标记 SDOWN。
适用对象
主观下线判定适用于所有类型的节点——主节点、从节点和哨兵节点都可以被标记为 SDOWN。
隔离性
每个哨兵的 SDOWN 判定是独立的。哨兵 A 可能认为主节点已下线(发生网络抖动),而哨兵 B 认为主节点仍然正常。
客观下线(ODOWN)
定义
客观下线是指哨兵集群经过协商后,集体确认主节点确实不可用。这是全局共识,需要满足 quorum 条件。
判定条件
- 某个哨兵将主节点标记为 SDOWN
- 该哨兵向其他哨兵发送
SENTINEL is-master-down-by-addr命令,询问它们对主节点状态的看法 - 其他哨兵回复自己的判断(Yes/No)
- 如果反馈主节点已下线的哨兵数量 ≥ quorum(配置值),则该主节点被判定为 ODOWN
sentinel monitor mymaster 127.0.0.1 6379 2 # quorum = 2
在 3 个哨兵的集群中,quorum=2 意味着至少 2 个哨兵认为主节点下线,才能升级为 ODOWN。
适用对象
客观下线判定仅适用于主节点。从节点和哨兵节点不需要客观下线判定。
为什么需要两级判定
两级下线判定机制的设计目的是防止误判和避免无谓的故障转移:
- 防止网络抖动误触发:单个哨兵的网络短暂不可用不应触发整个集群的故障转移
- 提高决策可靠性:多方确认后才能断定主节点确实宕机了
- 降低假阳性:减少了因为网络分区导致的不必要的主从切换
状态转换流程
主节点正常运行
↓
单个哨兵心跳超时 → SDOWN(该哨兵视角)
↓
该哨兵询问其他哨兵 → 收集投票
↓
收到 ≥ quorum 个 ODOWN 判定 → ODOWN(全局确认)
↓
触发领导者选举 → 执行故障转移
恢复机制
- SDOWN 恢复:如果哨兵重新收到节点的 PONG 回复,该节点自动退出 SDOWN 状态
- ODOWN 恢复:当哨兵收到足够数量的”主节点正常”回复时,ODOWN 状态自动清除。或者当故障转移完成后,ODOWN 状态也随之清除
配置建议
quorum值通常设为(哨兵总数 / 2 + 1),例如 3 个哨兵设 quorum=2down-after-milliseconds值不宜过小(避免抖动误触发),也不宜过大(影响故障恢复速度),生产环境建议 10-30 秒- 如果 quorum 设置过大(接近哨兵总数),容错能力会下降;设过小可能引发不必要的切换
总结
SDOWN 是局部感知(单个哨兵说了算),ODOWN 是全局共识(多数哨兵同意才行)。两级判定在”尽早发现故障”和”避免误判”之间取得了平衡,是哨兵系统稳定可靠的关键设计。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容