面试题答案
一键面试角色
- 领导者(Leader):
- 职责:负责处理客户端请求,将日志条目复制到其他节点,并维护与跟随者的心跳(Heartbeat)。领导者是整个Raft集群中唯一能接收客户端请求的角色,它会将请求转换为日志条目,然后通过心跳机制同步到其他节点。
- 特点:在一个任期(Term)内,集群中只有一个领导者。领导者持续向跟随者发送心跳信息,以维持自己的领导地位并告知跟随者当前任期号。
- 跟随者(Follower):
- 职责:被动接收来自领导者的心跳和日志条目。如果在一定时间内没有收到领导者的心跳,跟随者会转变为候选人状态。跟随者不会主动发起选举,只是响应候选人的投票请求。
- 特点:跟随者处于被动状态,主要用于备份日志和协助领导者达成共识。它会根据领导者的指令更新自己的日志。
- 候选人(Candidate):
- 职责:发起选举过程,向其他节点请求投票。候选人会增加当前任期号,并向集群中的其他节点发送投票请求消息。如果获得大多数节点的投票,候选人就会转变为领导者。
- 特点:候选人在选举过程中处于竞争领导地位的状态,它的主要任务就是获取足够的选票以成为领导者。
状态转换过程
- 跟随者 -> 候选人:
- 触发条件:跟随者在选举超时(Election Timeout)内没有收到领导者的心跳时,会转变为候选人。选举超时时间是一个随机值,一般在150 - 300毫秒之间。
- 转换动作:候选人会增加当前任期号,向集群中的其他节点发送投票请求(RequestVote RPC),并开始等待其他节点的响应。
- 候选人 -> 领导者:
- 触发条件:候选人在一个任期内获得集群中大多数节点的投票(超过半数节点投票给自己)。
- 转换动作:候选人转变为领导者,开始向其他节点(跟随者)发送心跳消息,以维持领导地位并开始处理客户端请求。
- 候选人 -> 跟随者:
- 触发条件:
- 候选人在等待投票过程中,收到了来自其他节点(领导者或其他候选人)更高任期号的消息(如心跳或投票请求),意识到自己的任期号过时,会主动转变为跟随者。
- 如果候选人在发起选举后,没有在一定时间内获得大多数节点的投票,也会重新回到跟随者状态,等待下一次选举超时重新发起选举。
- 转换动作:将自己的状态设置为跟随者,更新自己的任期号为接收到的更高任期号,停止发送投票请求,开始接收并处理来自领导者的心跳和日志条目。
- 触发条件:
- 领导者 -> 跟随者:
- 触发条件:领导者收到来自其他节点更高任期号的消息(如投票请求或心跳),意识到自己的任期号过时,会转变为跟随者。
- 转换动作:领导者将自己的状态设置为跟随者,更新自己的任期号为接收到的更高任期号,停止处理客户端请求和发送心跳,开始接收并处理来自新领导者的心跳和日志条目。