面试题答案
一键面试1. 不同故障场景下主观下线状态检测与预警机制和故障转移流程的协同工作
单节点故障场景
- 主观下线检测:Sentinel 节点定期向 Redis 实例发送 PING 命令进行心跳检测。当某个 Sentinel 在一定时间(由
down-after-milliseconds
配置项决定)内未收到 Redis 实例的有效回复,该 Sentinel 会将此 Redis 实例标记为 主观下线(SDOWN, Subjectively Down) 状态。这表明该 Sentinel 自身认为这个 Redis 实例出现了故障。 - 预警机制:该 Sentinel 会通过发布/订阅机制向其他 Sentinel 节点发送关于此 Redis 实例主观下线的消息。其他 Sentinel 节点接收到消息后,也会尝试与该 Redis 实例进行通信。
- 故障转移流程协同:如果多数 Sentinel 节点(超过
quorum
配置项设定的数量)都认为该 Redis 实例主观下线,那么会将其标记为 客观下线(ODOWN, Objectively Down) 状态。一旦进入客观下线状态,Sentinel 会从该 Redis 实例的从节点中挑选一个晋升为主节点,进行故障转移,同时修改其他从节点的复制目标为主节点。
网络分区故障场景
- 主观下线检测:在网络分区情况下,部分 Sentinel 节点与 Redis 实例所在网络分区被隔离。处于隔离区外的 Sentinel 节点由于无法与 Redis 实例通信,在
down - after - milliseconds
时间后,会将相关 Redis 实例标记为主观下线。 - 预警机制:隔离区外的 Sentinel 节点同样通过发布/订阅机制向其他 Sentinel 节点传播主观下线消息。但隔离区内的 Sentinel 节点由于网络问题无法收到这些消息,它们仍然认为 Redis 实例正常。
- 故障转移流程协同:如果隔离区外的 Sentinel 节点数量达到
quorum
,它们会将 Redis 实例标记为客观下线并启动故障转移。当网络分区恢复后,隔离区内的 Sentinel 节点会重新与其他 Sentinel 节点同步状态,认识到故障转移后的新集群状态。
2. 潜在问题及解决方案
误判问题
- 问题描述:由于网络抖动、短暂延迟等原因,Sentinel 可能误将正常的 Redis 实例标记为主观下线,进而可能引发不必要的故障转移。
- 解决方案:合理调整
down - after - milliseconds
参数值,使其既能够快速检测到真正的故障,又能避免因短暂网络问题导致的误判。同时,可以结合多个 Sentinel 节点的判断,因为需要多数 Sentinel 确认客观下线才会进行故障转移,这在一定程度上降低了误判风险。
脑裂问题
- 问题描述:在网络分区场景下,可能出现两个“大脑”,即不同网络分区内的 Sentinel 分别认为自己管理的 Redis 实例是主节点,从而导致数据不一致。
- 解决方案:
- 在 Redis 配置中设置
min - slaves - to - write
和min - slaves - max - lag
参数。当主节点发现连接的从节点数量小于min - slaves - to - write
,或者从节点与主节点的延迟超过min - slaves - max - lag
时,主节点会停止写入,防止数据不一致。 - 增加 Sentinel 节点数量,并合理分布在不同网络区域,减少因网络分区导致部分 Sentinel 形成少数派而误判的可能性。同时,确保 Sentinel 节点之间有稳定可靠的网络连接。
- 在 Redis 配置中设置