好玩的Raft動畫演示,原理秒懂

關于Raft原理,許多朋友也許不是很明白原理,下面的地址是一個好玩的Raft動畫,看完后能夠很快的掌握Raft原理:

http://thesecretlivesofdata.com/raft/

動畫中的一些概念和簡要原理總結(jié)如下:

image.png

一、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)換關系如下:

image.png

二、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那里復制最新的日志。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容