什麼是raft?
raft 是一種保證系統高可用的解決方案
如下圖,假如我們有1個master和2個slave節點,形成主備

那麼問題來了,如果Master節點宕掉了怎麼辦?
先簡單說一下raft是怎麼工作的,raft不是一個注冊中心,而隻是一個元件,它包含1個logtrace,用來記錄最新狀态
下面從3方面來闡述raft
1.Leader Election leader是如何被選舉出來的?
raft中是以Term 進行劃分的,每一個term都是以election開始的,如果election逾時了,那麼将進入新的Term進行下一輪選舉
選舉的算法:
current_term += 1
vote for self
ask for vote from all peers
下面分幾種情況來分析選舉最終産生leader的過程:
第一種情況:
3個節點随機選取的逾時時間不同,
那麼最左邊節點會先進入下一個Term,成為candidate ,向其他兩個節點發起拉票
其他兩個Follower 節點Term 沒有該節點新,是以将票投給它
那麼左側節點赢得了選票,成為leader
第二種情況:其中兩個節點(左側和上面的)的逾時時間幾乎一緻,
是以這兩個節點同時進入了下一個Term 成為了candidate, 并且想另外的Follower發起拉票
此時左側節點和上方節點都處于T1,是以都沒有得到對方的票
但是右側節點先收到了左側節點的請求,是以将票投給了左側節點,
當上方節點來拉票的時候,已經将票給了左側節點,是以隻能拒絕投給上方節點
那麼左側節點有自己投自己的1票,加上右側節點一票,多于半數,赢得選舉
這時左側節點(leader)也會向其他節點發送heartbeat,宣布自己已經赢得選舉,那麼上方節點收到後會切換回follower身份
第3種情況,3個節點進入下一個Term的時間幾乎相同,
那麼3個節點會幾乎同時進入新Term變成candidate,那麼3個節點都向其他節點發起拉票
第一次拉票都不成功,因為大家都投了自己,但是進入下次Term的随機時間有所不同
這一次 左側節點提前進入了新的Term,向另外兩個節點發起了拉票
其他兩個節點看到比它們新的Term, 是以都把票投給了左側節點,并且更新了自己的Term
那麼左側節點成功當選leader
日志複制部分,
大緻思路是 leader向follower發起資料同步時,會從後向前發起match
未完待續。。。。
-如果半數以上節點都宕掉了怎麼辦? 可以增加一下observer
但是這些家夥不參與 read/write ,但是raft中未必好使,xd會中提到他們公司16+5個節點,其中5個節點是observer ,我了解這套是zk的機制
新leader當選成功後,如何進行資料的複制?
從後向前直到match
當leader沒來得及複制就宕掉了?
過半數才會成功
但是如果新leader,沒有最新資訊呢? 會保證最新資訊的拿到票,先比較index,index相同的情況下才會比較term大小
網絡不穩定 network speration 的時候,可能導緻leader不停的切換