选举过程
开始选举时,Follower 等待选举超时(随机150ms~300ms)后转换成 Candidate 状态, 并且会给当前 Term + 1 后发起投票请求
冷知识
当某个节点要发起选举之前,需要进入一个叫 PreVote 状态。<br>在该状态下,节点会尝试连接集群的其他节点,连接达半数以上节点,才真正发起新一轮选举
多场景应对
场景一 (奇数节点)
选举超时后,Candidate 先投自己然后会并行的向其他节点请求投票,如果其他的节点(无论当前是Candidate 还是 Follower)在当前Term下未进行过投票(包括投给自己),即必须为请求节点(Candidate)进行投票,并且重置其“选举超时”
场景二 (偶数节点, 当挂一个节点)
选举超时后,Candidate 先投自己然后会并行的向其他节点请求投票,如果此时某两个节点得票相同,则会放弃当前 Term 的投票,进入下一个 Term,重新进行投票,直至某个Candidate 成为Leader
如果某个Candidate 获取的票数大于节点数的一半,即成为当前Term 的 Leader
Leader 向其他节点发送“添加条目”信息,这些消息以“心跳超时”指定的时间间隔发送, Follower 会响应每个“追加条目”的信息 (即心跳信息)并重置heartbeat超时,直到下一个 Term 选举