1. 程式人生 > >共識演算法(三)—— Raft(分散式一致性演算法)

共識演算法(三)—— Raft(分散式一致性演算法)

Raft簡介

Raft替代了paxos(太複雜),並提供了一種在計算系統叢集中分佈狀態機的通用方法,確保叢集中的每個節點都同意一系列相同的狀態轉換,也就是說,它在提供的計算機叢集分佈狀態機時,有個別或者多個狀態機down掉了,從而使其狀態不統一併影響了consensus一致性,繼而影響了整個系統的執行,而Raft演算法就可以解決這個問題,它允許有down機,從而可以避免影響整個系統的執行。一個Raft叢集包含若干個伺服器節點,通常是5個,這允許整個系統容忍2個節點的失效,每個節點處於一下三種狀態之一:

  1. follower(跟隨者) :所有節點都以 follower 的狀態開始。如果沒收到 leader 訊息則會變成 candidate 狀態。

  2. candidate(候選人):會向其他節點“拉選票”,如果得到大部分的票則成為 leader,這個過程就叫做 Leader 選舉(Leader Election)。

  3. leader(領導者):所有對系統的修改都會先經過 leader 。

Raft分為兩個階段

  1. 第一個階段:選舉:從叢集中選出一個合適的節點作為leader。即計算機叢集開始執行時,每個節點都是follower狀態,當term週期過後,就會有folloer節點成為conmidited節點,並給自己投一票,然後將自己通過RPC廣播出去,讓其他的節點投票給自己,其他節點收到它的廣播後,首先會檢查自己的票是否已經投出,如果沒有投出或者votefor為null,則就會檢查競選節點的日誌資訊是否比當前節點更全,如果不全,則拒絕投票,反之則投給它,當自己的票屬於一大半時,則競選通過,轉為leader,然後再將自己的資訊同步給其他節點。
  2. 日誌同步:1.選舉出的leader接收客戶端請求,將其轉為raft日誌。2.Leader將日誌同步到其他節點,當大多數節點已經同步完畢日誌後,日誌的狀態就會變為conmmited,從而這些日誌將不會被篡改。3.當leader節點down掉後,會重新執行第一階段。

raft日誌衝突:

如果follower節點的資料與leader節點資料發生衝突,則同步leader節點的資料,刪除自己本身的髒資料。