场景
如果一个follower因为网络的原因而导致选举超时时间内都没有收到来自leader的心跳包,以为leader挂了,于是term+1,开始新一轮选举,而实际上其他的follower可以感知到leader的存在,此时会因为收到term大点的candidate,而导致投票选举出新的leader,原来的leader退回follower。
解决
- 心跳时间的设置
broadcastTime << electionTimeout << MTBF
- PreVote
PreVote
Raft 原论文 9.6 节中提出了 Prevote 算法:在选举前可以选询问其他节点是否愿意参与选举,如果节点能够感知到领导人的心跳,那么它就不会参与选举,否则参与选举。只有过半的节点参与选举,才能开始下一届领导人选举。