面试题答案
一键面试技术要点
- 故障检测:
- 采用心跳检测机制,节点定期向其他节点发送心跳消息。若在一定时间内未收到某节点心跳,判定该节点故障。
- 例如使用 TCP 心跳包,节点间每隔固定时间(如 1 秒)发送一个简单的 TCP 探测包,若连续多次(如 3 次)未收到响应,则认为该节点故障。
- 选举算法:
- Raft 算法:
- 节点有三种状态:领导者(Leader)、候选者(Candidate)、跟随者(Follower)。
- 选举触发:当 Follower 在选举超时时间内未收到 Leader 心跳,转为 Candidate 并发起选举。
- 投票过程:Candidate 向其他节点发送 RequestVote 消息,其他节点根据先来先服务原则(或其他规则)投票。获得多数(超过一半)选票的 Candidate 成为 Leader。
- Paxos 算法:
- 包含提议者(Proposer)、接受者(Acceptor)、学习者(Learner)角色。
- 提议过程:Proposer 提出提议,Acceptor 决定是否接受。通过多轮交互,最终达成一致提议。
- 一致性保证:通过 Phase1(Prepare 阶段)和 Phase2(Accept 阶段)确保提议的一致性。
- Raft 算法:
- 日志复制:
- 领导者接收客户端请求并将其追加到自己的日志中。
- 领导者通过 AppendEntries 消息将日志条目复制到跟随者节点。
- 跟随者接收到日志条目后,先持久化日志,再回复 ACK 给领导者。
- 只有当多数节点确认日志已复制,领导者才会将该日志条目应用到状态机,并向客户端返回响应。
- 数据同步:
- 新选举出的领导者需要确保所有节点的数据状态一致。
- 可以采用增量同步方式,领导者根据节点日志的差异,发送缺失的日志条目。
- 例如,领导者记录每个跟随者的日志最新索引,通过对比索引找出需要同步的日志范围并发送。
流程
- 故障检测与感知:
- 节点按固定周期发送心跳消息,若某个节点一段时间内未收到其他节点心跳,标记该节点故障。
- 故障信息在集群内广播,使其他节点知晓故障情况。
- 选举启动:
- 当节点感知到 Leader 故障(如未收到 Leader 心跳),从 Follower 转变为 Candidate 状态。
- Candidate 增加自己的任期号,向集群内其他节点发送 RequestVote 消息。
- 投票与选举:
- 其他节点(Follower 或 Candidate)收到 RequestVote 消息后,检查 Candidate 的任期号和日志情况。
- 如果 Candidate 的任期号大于自身且日志至少和自身一样新,节点会投票给该 Candidate,并在一段时间内不再接受其他 RequestVote 消息。
- Candidate 收到多数节点的选票后,成为新的 Leader。
- 数据与状态同步:
- 新 Leader 确定后,向所有节点发送心跳消息,表明自己的领导地位。
- 新 Leader 根据各节点日志情况,通过 AppendEntries 消息向跟随者节点同步数据,确保所有节点数据一致。
- 跟随者节点接收并应用日志条目,使自身状态与领导者一致。
- 恢复服务:
- 当所有节点数据和状态同步完成,集群恢复正常服务,新 Leader 开始处理客户端请求。