很好的動畫http://thesecretlivesofdata.com/raft/
節點分爲3種狀態:leader、follower、candidate
leader選舉
網絡剛開始時,所有節點都是follwer狀態,如果他們收不到leader發過來的消息,就會有其中1個節點變成candidate狀態。
candidate節點給其他節點發送請求投票消息。
其他follwer節點會返回給candidate節點消息,表示同意。
如果收到一般以上節點同意,這個節點會成爲leader狀態。
整個網絡的所有改變必須經過leader節點。
客戶端會發一個消息給leader節點,leader節點會加一個entity到日誌log中。
leader會把這個entity廣播到其他follower節點。
當leader節點收到大多數節點回復同意的時候,leader會commit這個entity,然後廣播給其他follower節點,follower節點收到commit消息,本地提交,落盤。
election timeout選舉超時,這個值是隨機的,在150ms到300ms之間。誰最快的election timeout的,誰就會成爲candidate狀態,然後給自己投一票,然後給其他節點發送要求投他爲主節點的request。
heartbeat timeout,每隔一段時間間隔,leader就得給follower發送一次。follower回覆append entity消息給leader。
如果一個節點在election timeout的間隔中,收不到hearbeat消息,那麼它自己就會成爲candidate,從新開始共識。
如果leader選舉中產生2個candidate,不會產生leader,所有節點會再次election timeout從新選舉。
網絡腦裂處理
當發生腦裂,網絡分叉時,佔大多數的節點,可以繼續處理交易。佔少數的節點,就不能處理交易了,因爲得不到大多數的同意。
從這裏可以看出,raft只能用到聯盟鏈或私鏈中。
當網絡通了的時候,少數節點的網絡,會回滾,重新得到多數節點的log,和比特幣長鏈吃短鏈一個原理。