1. 程式人生 > >分布式一致性算法Raft

分布式一致性算法Raft

cat 算法 images 獲取 訪問 src 故障 領導者 服務器

什麽是分布式一致性?

我們先來看一個例子:

技術分享

我們有一個單節點node,這個節點可以是數據庫,也可以是一臺服務器,當client向node發送data時,X節點收到data,記錄下來

由此可見對於單個節點,一致性是很容易實現的。

技術分享

然而對於多個節點,我們如何來實現一致性,這就是分布式一致性的問題。

Raft就是一個實現分布式一致性的協議

下面讓我們來看看它是如何工作的?

node介紹:

每一個節點有三種state

(1) follower state

(2) leader state

(3) candidate state

Leader Election

所有的節點都是從follower state開始的,如果一個follower狀態的節點沒有被某個leader所控制,它就有可能成為候選者。而當一個節點成為候選者時,它就會向其他節點收集選票,而其他節點在收到候選者發出的信號後,就會把選票發給候選者。如果某個候選者獲取了大多數選票,則會成為領導者。這個過程就是領導者選舉。

整個選舉過程是有一個時間限制的,如下圖:

技術分享

Splite Vote是因為如果同時有兩個候選人向大家邀票,這時通過類似加時賽來解決,兩個候選者在一段timeout比如300ms互相不服氣的等待以後,因為雙方得到的票數是一樣的,一半對一半,那麽在300ms以後,再由這兩個候選者發出邀票,這時同時的概率大大降低,那麽首先發出邀票的的候選者得到了大多數同意,成為領導者Leader,而另外一個候選者後來發出邀票時,那些Follower選民已經投票給第一個候選者,不能再投票給它,它就成為落選者了,最後這個落選者也成為普通Follower一員了。

Log Replication

選出領導者後,對於這些節點組成的一個系統中的所有變化都會經過這個領導者,由它掌管全局。

領導者收到client發來的消息後,會把每一次的請求操作記錄在日誌上,在這條日誌記錄沒被提交之前,其他節點的值不會有任何改變。

技術分享

技術分享

領導者先把日誌條目set 5 拷貝到跟隨者節點中,當大多數的跟隨者節點已經把日誌記錄追加到本節點的日誌時,領導者就開始執行該條日誌,即把5寫入改節點。然後在下一個heartbeat中,領導者就會通知followers,該日誌條目已經提交,follows也會寫入5。這時整個集群保持了數據的一致性。這個過程叫做日誌復制。

對於每個新的日誌記錄,重復上述過程。

如果在這一過程中,發生了網絡分區或者網絡通信故障,使得Leader不能訪問大多數Follwers了,那麽Leader只能正常更新它能訪問的那些Follower服務器,而大多數的服務器Follower因為沒有了Leader,他們重新選舉一個候選者作為Leader,然後這個Leader作為代表於外界打交道,如果外界要求其添加新的日誌,這個新的Leader就按上述步驟通知大多數Followers,如果這時網絡故障修復了,那麽原先的Leader就變成Follower,在失聯階段這個老Leader的任何更新都不能算commit,都回滾,接受新的Leader的新的更新。

分布式一致性算法Raft