關于Raft原理,許多朋友也許不是很明白原理,下面的地址是一個好玩的Raft動畫,看完后能夠很快的掌握Raft原理:
動畫中的一些概念和簡要原理總結(jié)如下:

一、Raft原理
在Raft中,每個結(jié)點會處于下面三種狀態(tài)中的一種:
1、follower:所有結(jié)點都以follower的狀態(tài)開始。如果沒收到leader消息則會變成candidate狀態(tài)。
2、candidate:會向其他結(jié)點“拉選票”,如果得到大部分的票則成為leader。這個過程就叫做Leader選舉(Leader Election)。
3、leader:所有對系統(tǒng)的修改都會先經(jīng)過leader。每個修改都會寫一條日志(log entry)。leader收到修改請求后的過程如下,這個過程叫做日志復制(Log Replication):
- 復制日志到所有follower結(jié)點(replicate entry)
- 大部分結(jié)點響應時才提交日志
- 通知所有follower結(jié)點日志已提交
- 所有follower也提交日志
- 現(xiàn)在整個系統(tǒng)處于一致的狀態(tài)
三種角色的狀態(tài)轉(zhuǎn)換關系如下:

二、Leader Election
當follower在選舉超時時間(election timeout)內(nèi)未收到leader的心跳消息(append entries),則變成candidate狀態(tài)。為了避免選舉沖突,這個超時時間是一個150~300ms之間的隨機數(shù)。
成為candidate的結(jié)點發(fā)起新的選舉期(election term)去“拉選票”:
- 重置自己的計時器
- 投自己一票
- 發(fā)送 Request Vote消息
如果接收結(jié)點在新term內(nèi)沒有投過票那它就會投給此candidate,并重置它自己的選舉超時時間。candidate拉到大部分選票就會成為leader,并定時發(fā)送心跳——Append Entries消息,去重置各個follower的計時器。當前Term會繼續(xù)直到某個follower接收不到心跳并成為candidate。
如果不巧兩個結(jié)點同時成為candidate都去“拉票”怎么辦?這時會發(fā)生Splite Vote情況。兩個結(jié)點可能都拉到了同樣多的選票,難分勝負,選舉失敗,本term沒有l(wèi)eader。之后又有計時器超時的follower會變成candidate,將term加一并開始新一輪的投票。
三、Log Replication
當發(fā)生改變時,leader會復制日志給follower結(jié)點,這也是通過Append Entries心跳消息完成的。前面已經(jīng)列舉了Log Replication的過程,這里就不重復了。
Raft能夠正確地處理網(wǎng)絡分區(qū)(“腦裂”)問題。假設A~E五個結(jié)點,B是leader。如果發(fā)生“腦裂”,A、B成為一個子分區(qū),C、D、E成為一個子分區(qū)。此時C、D、E會發(fā)生選舉,選出C作為新term的leader。這樣我們在兩個子分區(qū)內(nèi)就有了不同term的兩個leader。這時如果有客戶端寫A時,因為B無法復制日志到大部分follower所以日志處于uncommitted未提交狀態(tài)。而同時另一個客戶端對C的寫操作卻能夠正確完成,因為C是新的leader,它只知道D和E。
當網(wǎng)絡通信恢復,B能夠發(fā)送心跳給C、D、E了,卻發(fā)現(xiàn)“改朝換代”了,因為C的term值更大,所以B自動降格為follower。然后A和B都回滾未提交的日志,并從新leader那里復制最新的日志。