大致思路
lab2A其实只要完成两个任务即可,一个是选举,一个是心跳
所以开启两个心脏(倒计时)electionTicker和appendTicker
由electionTicker来进行选举,appendTicker来完成心跳以维持leader的身份。 electionTimeout倒计时的时间被随机设置为150ms~300ms,每个节点的倒计时都是随机的。
任期:每一个节点都记录着一个Term任期,这个任期表示当前leader信息的有效性。
比如一个leader上任后,他的任期是7。因为一些网络问题导致这个leader的心跳不能发送出去,即它维持不了自己的leader身份。这时候,收不到心跳的节点在electionTimeout倒计时结束后会重新成为candidate并且发起新一轮的选举,如果它成功上任,这时候属于它的任期就是8。如果此时任期为7的老leader网络问题解决了,又能向外界发送心跳了,但是它发现任期已经更新了,改朝换代了,那么老leader就会将自己的身份重置为follower。
选举
初始时,所有节点都会被设置为follower,任期均为0,比如说有A、B、C三个服务器节点,那么初始时他们三个都会被设置为follower。并且都会同时开始自己的倒计时,当某一个节点的electionTimeout倒计时结束后,这个节点会将自己的身份由follower更改为candidate然后发起选举。
首先他会给自己先投一票,并开启新的任期,然后发送拉票请求RequestVote给其余节点。当其余节点收到拉票请求时,会重置自己的electionTimeout倒计时。
在选举过程中(可能会有多个节点发起选举),如果某个节点收到了超过半数以上节点的投票时,那么这个节点将会将自己的身份由candidate更新为leader。
心跳
初始选举过后,成为leader的节点会通过心跳来维持自己的leader身份,同时也会通过心跳来传递信息,维持数据的一致性。项目中我利用appendEntries来充当心跳。 只有leader才能向其他节点发送心跳,其余节点只能接受心跳。收到心跳的节点,在比对过信息确认这个leader发送的心跳有效后,需要重置自己的electionTimeout,和自己的follower身份。如果收不到心跳,那么electionTimeout倒计时结束后,这个follower节点就会更新自己的身份为candidate并发起新一轮的选举。
laba中的一些小提示
只完成了选举而没有写通过心跳重置follower的身份和选举倒计时的话,会报warning
warning: term changed even though there were no failures
增加心跳后就不报warning了