Redis 哨兵主观下线与客观下线
在Redis的高可用架构中,主观下线(SDOWN) 和客观下线(ODOWN) 是哨兵(Sentinel)机制进行故障检测时的两个核心状态。简单来说,这是一个从“单点判断”到“集群共识”的过程。
👤 主观下线(SDOWN):单点的怀疑
主观下线,全称是Subjectively Down(SDOWN)。
- 定义:单个哨兵(Sentinel)节点根据自己的检测,认为某个Redis实例(通常是主节点)无法连通,从而做出的下线判断。
- 触发条件:哨兵会持续向Redis实例发送
PING命令。如果在配置的down-after-milliseconds时间内没有收到有效回复(或收到错误回复),该哨兵就会将其标记为主观下线。 - 特点:这只是一个哨兵的“一面之词”,存在误判可能,比如网络瞬时抖动也可能导致
PING不通。
👥 客观下线(ODOWN):集群的共识
客观下线,全称是Objectively Down(ODOWN)。
- 定义:当多个哨兵节点都确认某个主节点主观下线,并达成一致后,才认定该主节点确实下线了。
- 触发条件:当一个哨兵判定主节点主观下线后,会询问其他哨兵的意见。当同意主观下线的哨兵数量达到配置的法定票数(
quorum) 时,该主节点就会被标记为客观下线。 quorum的配置:quorum值通常建议设置为超过哨兵总数的一半,例如N/2 + 1。生产环境通常至少部署3个哨兵实例。- 特点:这相当于启动了“少数服从多数”的决策机制,能有效避免单点误判,是触发后续自动故障转移的可靠信号。
⚖️ 两者对比
| 对比维度 | 主观下线 (SDOWN) | 客观下线 (ODOWN) |
|---|---|---|
| 判断主体 | 单个哨兵节点 | 多个哨兵节点(达到quorum数量) |
| 判断依据 | 自身发出的PING命令是否超时 | 收集并统计其他哨兵对“主观下线”的投票 |
| 性质 | 单方面的怀疑和猜测 | 经过投票验证的、集群的最终判决 |
| 后果 | 标记状态,启动询问流程 | 触发自动故障转移(如选举新主库) |
💡 补充:Redis Cluster中的类似概念
值得注意的是,在Redis集群模式(Redis Cluster)中,也存在类似机制,但术语略有不同:主观下线被称为**PFAIL(Possible Fail),客观下线被称为FAIL**。
🛠️ 关键配置参数
down-after-milliseconds:决定主观下线判定快慢的超时时间。quorum:决定客观下线所需票数的阈值。
总而言之,主观下线是哨兵个体的“怀疑”,而客观下线是哨兵集群经投票确认后的“判决”。这个机制确保了故障发现的准确性,是Redis实现高可用性的基石。