主观下线和客观下线

主观下线和客观下线

概念区分

在 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 条件。

判定条件

  1. 某个哨兵将主节点标记为 SDOWN
  2. 该哨兵向其他哨兵发送 SENTINEL is-master-down-by-addr 命令,询问它们对主节点状态的看法
  3. 其他哨兵回复自己的判断(Yes/No)
  4. 如果反馈主节点已下线的哨兵数量 ≥ quorum(配置值),则该主节点被判定为 ODOWN
sentinel monitor mymaster 127.0.0.1 6379 2  # quorum = 2

在 3 个哨兵的集群中,quorum=2 意味着至少 2 个哨兵认为主节点下线,才能升级为 ODOWN。

适用对象

客观下线判定仅适用于主节点。从节点和哨兵节点不需要客观下线判定。

为什么需要两级判定

两级下线判定机制的设计目的是防止误判和避免无谓的故障转移

  1. 防止网络抖动误触发:单个哨兵的网络短暂不可用不应触发整个集群的故障转移
  2. 提高决策可靠性:多方确认后才能断定主节点确实宕机了
  3. 降低假阳性:减少了因为网络分区导致的不必要的主从切换

状态转换流程

主节点正常运行
    ↓
单个哨兵心跳超时 → SDOWN(该哨兵视角)
    ↓
该哨兵询问其他哨兵 → 收集投票
    ↓
收到 ≥ quorum 个 ODOWN 判定 → ODOWN(全局确认)
    ↓
触发领导者选举 → 执行故障转移

恢复机制

  • SDOWN 恢复:如果哨兵重新收到节点的 PONG 回复,该节点自动退出 SDOWN 状态
  • ODOWN 恢复:当哨兵收到足够数量的”主节点正常”回复时,ODOWN 状态自动清除。或者当故障转移完成后,ODOWN 状态也随之清除

配置建议

  • quorum 值通常设为(哨兵总数 / 2 + 1),例如 3 个哨兵设 quorum=2
  • down-after-milliseconds 值不宜过小(避免抖动误触发),也不宜过大(影响故障恢复速度),生产环境建议 10-30 秒
  • 如果 quorum 设置过大(接近哨兵总数),容错能力会下降;设过小可能引发不必要的切换

总结

SDOWN 是局部感知(单个哨兵说了算),ODOWN 是全局共识(多数哨兵同意才行)。两级判定在”尽早发现故障”和”避免误判”之间取得了平衡,是哨兵系统稳定可靠的关键设计。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容