天天看點

raft協定學習總結

什麼是raft?

 raft 是一種保證系統高可用的解決方案

如下圖,假如我們有1個master和2個slave節點,形成主備

raft協定學習總結

那麼問題來了,如果Master節點宕掉了怎麼辦?

raft協定學習總結

先簡單說一下raft是怎麼工作的,raft不是一個注冊中心,而隻是一個元件,它包含1個logtrace,用來記錄最新狀态

raft協定學習總結

下面從3方面來闡述raft

1.Leader Election  leader是如何被選舉出來的?

raft中是以Term 進行劃分的,每一個term都是以election開始的,如果election逾時了,那麼将進入新的Term進行下一輪選舉

raft協定學習總結

選舉的算法:

current_term += 1

vote for self

ask for vote from all peers

下面分幾種情況來分析選舉最終産生leader的過程:

第一種情況:

3個節點随機選取的逾時時間不同,

raft協定學習總結

那麼最左邊節點會先進入下一個Term,成為candidate ,向其他兩個節點發起拉票

raft協定學習總結

 其他兩個Follower 節點Term 沒有該節點新,是以将票投給它

raft協定學習總結

那麼左側節點赢得了選票,成為leader 

raft協定學習總結

第二種情況:其中兩個節點(左側和上面的)的逾時時間幾乎一緻,

raft協定學習總結

是以這兩個節點同時進入了下一個Term 成為了candidate, 并且想另外的Follower發起拉票

此時左側節點和上方節點都處于T1,是以都沒有得到對方的票

但是右側節點先收到了左側節點的請求,是以将票投給了左側節點,

raft協定學習總結

 當上方節點來拉票的時候,已經将票給了左側節點,是以隻能拒絕投給上方節點

raft協定學習總結

 那麼左側節點有自己投自己的1票,加上右側節點一票,多于半數,赢得選舉

raft協定學習總結

 這時左側節點(leader)也會向其他節點發送heartbeat,宣布自己已經赢得選舉,那麼上方節點收到後會切換回follower身份

raft協定學習總結

 第3種情況,3個節點進入下一個Term的時間幾乎相同,

raft協定學習總結

 那麼3個節點會幾乎同時進入新Term變成candidate,那麼3個節點都向其他節點發起拉票

raft協定學習總結

 第一次拉票都不成功,因為大家都投了自己,但是進入下次Term的随機時間有所不同

raft協定學習總結

 這一次 左側節點提前進入了新的Term,向另外兩個節點發起了拉票

raft協定學習總結

 其他兩個節點看到比它們新的Term, 是以都把票投給了左側節點,并且更新了自己的Term

那麼左側節點成功當選leader

raft協定學習總結

日志複制部分,

 大緻思路是 leader向follower發起資料同步時,會從後向前發起match

raft協定學習總結
raft協定學習總結
raft協定學習總結
raft協定學習總結
raft協定學習總結
raft協定學習總結
raft協定學習總結

 未完待續。。。。

-如果半數以上節點都宕掉了怎麼辦? 可以增加一下observer

但是這些家夥不參與 read/write ,但是raft中未必好使,xd會中提到他們公司16+5個節點,其中5個節點是observer ,我了解這套是zk的機制

新leader當選成功後,如何進行資料的複制? 

從後向前直到match

當leader沒來得及複制就宕掉了?

過半數才會成功

但是如果新leader,沒有最新資訊呢? 會保證最新資訊的拿到票,先比較index,index相同的情況下才會比較term大小

網絡不穩定 network speration 的時候,可能導緻leader不停的切換