Raft 簡易的分布一致性演算法

2021-09-26 08:08:40 字數 1464 閱讀 5588

通過網路更新的概率性成功的,所以保證集群大多數達到一致就可以了。

乙個節點可以有三種狀態:

leader ----分布式系統所有讀寫的入口

follower ----與leader同步

candidate for leader ----leader失效或系統啟動時,leader的候選人。

系統一啟動,所有節點都是follower節點。

如果乙個follower節點不能收到leader的心跳資訊,在election timeout這麼長的時間過後,就認為自己公升級為candidate節點。於是聯絡其他節點向他們拉票,節點收到拉票請求就會根據某些條件決定是否投給它。如果乙個candidate節點收到了系統內大多數節點的投票(2f+1中的f+1個),就晉公升為集群leader。接下來的所有寫請求都**給leader節點。這個過程稱為選舉過程(leader election)。

分布式系統有leader之後,所有的讀寫都通過leader節點進行。每次更改都會在leader節點日誌(wal , a.k.a write-ahead log)中追加一項記錄(entry)。現在這項記錄是未提交的,還不能更新leader節點的值。為了提交,leader徵得大家的同意,於是發出訊息告訴大家自己要提交一項新的更改,當大多數節點投票同意,leader才將記錄提交。

然後leader通知其他節點乙個事件,就是記錄已提交。這個過程為日誌複製過程(log replication)。

raft裡面有兩個時間設定來控制leader選舉過程。

第乙個是election timeout(150-300 ms),這個變數是follower(abbv f節點)節點變成candidate節點的時長,一旦f節點收不到leader資訊,就設定乙個定時器。如果這個時間內還沒有收到leader的訊息就自我提公升為candidate節點。

f節點在過了election timeout這麼長時間後沒有收到訊息,就開始建立乙個新的選舉時期(term變數表示)。給自己拉票,收到拉票請求的節點檢視自己所在的選舉時期(自己所在的term《請求的term)比較老,如果在這個選舉時期還沒投票,就投它一票。投完後,收到拉票請求的節點知道新的leader也早晚也會掛掉,於是重置自己的election timeout定時器。

網路分割槽條件下,不包含leader的區域a會重新開始乙個新的選舉時期,不包含leader稱為區域b。分兩種情況:

區域a包含f+1個節點

此時,區域a是可以提交的,也就是可以繼續往下執行。但是區域b,因為不能收到多數節點的確認導致事務無法提交。

待到網路恢復,區域b的所有節點觀測到新的選舉時期,自動回滾到上乙個狀態,接受新的更新。

區域b包含f+1個節點

區域a無法進行事務提交,一直停留在分割槽前的狀態。區域b可以進行事務提交。

待到網路恢復,區域a可以像原來那樣,接受新的更新(這裡有可能落後多次更新,需要根據具體情況處理。比如set 的話,直接更新;遞增的話,需要拉取更新記錄)。

一致性演算法 Raft

乙個 raft 集群包含若干個伺服器節點 通常是 5 個,這允許整個系統容忍 2 個節點的失效,每個節點處於以下三種狀態之一 raft通過選出乙個leader來簡化日誌副本的管理,例如,日誌項 log entry 只允許從leader流向follower。基於leader的方法,raft演算法可以分...

raft 一致性演算法

redis使用raft leader election進行master選舉。概念 乙個cluster中有多個node,最終狀態有乙個leader,多個follower。leader通過heartbeat週期性和follower通訊。node有三種狀態 leader,follower,candidat...

raft一致性演算法

過去,paxos一直是分布式協議的標準,但是paxos難於理解,更難以實現,google的分布式鎖系統chubby作為paxos實現曾經遭遇到很多坑。來自stanford的新的分布式協議研究稱為raft,它是乙個為真實世界應用建立的協議,主要注重協議的落地性和可理解性。在了解raft之前,我們先了解...