面试题答案
一键面试1. 选举算法确保一致性
- 领导者选举:Redis Sentinel 使用 Raft 或类似的选举算法。当 Sentinel 集群检测到主服务器可能发生故障时,会进行领导者选举。只有成为领导者的 Sentinel 才能执行故障转移操作。这避免了多个 Sentinel 同时进行故障转移导致的数据不一致。例如,假设多个 Sentinel 同时尝试将不同的从服务器提升为主服务器,会造成数据分裂,而选举算法确保了只有一个 Sentinel 能主导故障转移过程。
- 决策一致性:选举出的领导者 Sentinel 会收集其他 Sentinel 的信息,并基于多数派的意见进行决策。比如在判定主服务器是否真的下线时,需要多数 Sentinel 认同。这保证了在集群范围内对主服务器状态判断的一致性,从而为数据一致性奠定基础。
2. 心跳检测维护状态
- 主从服务器心跳:Sentinel 会定期向主服务器和从服务器发送 PING 命令作为心跳检测。通过监控心跳回复时间(即响应延迟),Sentinel 可以判断服务器是否正常运行。如果主服务器长时间未响应心跳,Sentinel 会标记其为疑似下线(主观下线)。例如,如果主服务器因为网络拥塞在 10 秒内未回复心跳,Sentinel 会记录此情况。
- Sentinel 间心跳:Sentinel 之间也会互相发送心跳信息,用于交换关于主从服务器的状态以及 Sentinel 自身的状态。这样可以保证 Sentinel 集群内信息的实时同步和一致性。例如,一个 Sentinel 发现主服务器疑似下线后,会通过心跳将此信息传递给其他 Sentinel。
3. 故障转移时的数据同步
- 从服务器晋升:当主服务器被判定为客观下线(多数 Sentinel 认同主服务器下线)后,领导者 Sentinel 会从从服务器中挑选一个晋升为主服务器。挑选规则通常基于从服务器的复制偏移量(复制进度)、优先级等。优先选择复制偏移量最大(即数据最完整)且优先级高的从服务器,以确保新主服务器的数据尽可能接近原主服务器。
- 数据同步:新主服务器选举出来后,其他从服务器会自动开始与新主服务器进行数据同步。Redis 使用复制机制,新主服务器会执行
SYNC
或PSYNC
命令,将自身的数据状态同步给从服务器。例如,新主服务器会生成一个全量快照(RDB 文件)发送给从服务器,从服务器加载该快照并应用后续的写命令日志(AOF 文件),从而达到数据一致性。在故障转移过程中,Sentinel 会持续监控这个同步过程,确保所有从服务器都能成功与新主服务器同步数据。