亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

RocketMQ中如何分析raft協議

發布時間:2021-12-09 09:12:20 來源:億速云 閱讀:213 作者:柒染 欄目:大數據

這篇文章給大家介紹RocketMQ中如何分析raft協議,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

Raft協議是分布式領域解決一致性的又一著名協議,主要包含Leader選舉、日志復制兩個部分。

1、Leader選舉



 
1.1  單節點發起的投票
RocketMQ中如何分析raft協議Raft協議中節點有3種狀態(角色):
  • Follower
    跟隨者。

  • Candidate
    候選者。

  • Leader
    領導者(Leader),通常我們所說的的主節點。

首先3個節點初始狀態為 Follower,每個節點會有一個超時時間(計時器),其時間設置為150ms~300ms之間的隨機值。當計時器到期后,節點狀態從 Follower 變成 Candidate,如下圖所示:

RocketMQ中如何分析raft協議  
通常情況下,三個節點中會有一個節點的計時器率先到期,節點狀態變為Candidate,候選者狀態下的節點會發起選舉投票。我們先來考慮只有一個節點變為Candidate時是如何進行選主的。

當節點狀態為 Candidate,將發起一輪投票,由于是第一輪投票,設置本輪投票輪次為1,并首先為自己投上一票,正如上圖所示的 NodeA 節點,Term 為1,Vote Count為1。

RocketMQ中如何分析raft協議  
當一個節點的計時器超時后,首先為自己投上一票,然后向該組內其他的節點發起投票(用拉票更加合適),發送投票請求。  
 
RocketMQ中如何分析raft協議  
當集群內的節點收到投票請求后如果本輪未進行過投票,則贊同,否則反對,然后將結果返回,并重置計時器。  
 
RocketMQ中如何分析raft協議  
當節點A收到的贊同票大于一半時,則升級為該集群的 Leader,然后定時向集群內的其他節點發送心跳,以便確定自己的領導地位,正如下圖所示。  
 
RocketMQ中如何分析raft協議  

 
Node A,集群中的 Leader 正在向其他節點發送心跳包。  
 
RocketMQ中如何分析raft協議  
節點在收到 Leader 的心跳包后,返回響應結果,并重置自身的計時器,如果 Flower 狀態的節點在計時時間超時內沒有收到 Leader 的心跳包,就會從 Flower 節點變成 Candidate,該節點就會發起下一輪投票。

例如NodeA節點宕機,停止向它的從節點發送心跳,我們來看一下集群如何進行重新選主。

RocketMQ中如何分析raft協議  
如果主節點宕機,則停止向集群內的節點發送心跳包。隨著計時器的到期,節點B先于節點C變成 Candidate,則節點B向集群內的其他節點發起投票,如下圖所示。  
 
RocketMQ中如何分析raft協議節點B,首先將投票輪次設置為2,然后首先為自己投上一篇,然后向其他節點發起投票請求。  
 
RocketMQ中如何分析raft協議  
節點C收到請求,由于其投票輪次大于自己的投票輪次,并該輪次并未投票,投出贊成票并返回結果,然后重置計時器。節點B將順理成章的成為新的Leader并定時發送心跳包。

3個節點的選主就介紹到這里了,也許有網友會說,雖然各個節點的計時器是隨機的,但也有可能同一時間,或一個節點在未收到另一個節點發起的投票請求之前變成 Candidate,即在一輪投票過程中,有大于1個的節點狀態都是 Candidate,那該如何選主呢?

下面以4個節點的集群為例,來闡述上述這種情況情況下,如何進行選主。

 
1.2 多節點同時發起的投票

首先同時有兩個節點進入Candidate狀態,并開始新的一輪投票,當前投票編號為4,首先先為自己投上一票,然后向集群中的其他節點發起投票,如下圖所示:

RocketMQ中如何分析raft協議  
然后各個節點收到投票請求,如下所示,進行投票:  
 
RocketMQ中如何分析raft協議  
首先節點C、D在收到D、C節點的投票請求時,都會返回不同意,因為在本輪投票中,已經各自為自己投了一票,按照上圖,節點A同意C節點、節點B同意D節點,那此時C、D都只獲得兩票,當然如果A,B都認為C或D成為主節點,則選擇就可以結束了,上圖顯示,C、D都只獲的2票,未超過半數,無法成為主節點,那接下來會發生什么呢?請看下圖:  
 
RocketMQ中如何分析raft協議  
此時A,B,C,D的計時器各自在倒計時,當節點成為Candidate時,或自身狀態本身是Candidate并且定時器觸發后,發起一輪新的投票,圖中是節點B、節點D同時發起了新的一輪投票。  
 
RocketMQ中如何分析raft協議  
投票結果如下:節點A,節點C同意節點B成為leader,但由于BD都發起了第5輪投票,最終的投票輪次更新為6,如圖所示:  
 
RocketMQ中如何分析raft協議  
關于Raft協議的選主就介紹到這里了,接下來我們來思考一下,如果自己實現 Raf t協議,至少要考慮哪些問題,為下一篇源碼閱讀Dleger(RocketMQ多副本)模塊提供一些思路。    
1.3 思考如何實現Raft選主
  1. 節點狀態
    需要引入3種節點狀態:Follower(跟隨者)、Candidate(候選者),投票的觸發點,Leader(主節點)。

  2. 進入投票狀態的計時器
    Follower、Candidate 兩個狀態時,需要維護一個計時器,每次定時時間從150ms-300ms之間進行隨機,即每個節點的每次的計時過期不一樣,Follower狀態時,計時器到點后,觸發一輪投票。節點在收到投票請求、Leader 的心跳請求并作出響應后需要重置定時器。

  3. 投票輪次Team
    Candidate 狀態的節點,每發起一輪投票,Term 加一;Term的存儲。

  4. 投票機制
    每一輪一個節點只能為一個節點投贊成票,例如節點A中維護的輪次為3,并且已經為節點B投了贊成票,如果收到其他節點,投票輪次為3,則會投反對票,如果收到輪次為4的節點,是又可以投贊成票的。

  5. 成為Leader的條件
    必須得到集群中節點的大多數,即超過半數,例如如果集群中有3個節點,則必須得到兩票,如果其中一臺服務器宕機,剩下的兩個節點,還能進行選主嗎?答案是可以的,因為可以得到2票,超過初始集群中3的一半,所以通常集群中的機器各位盡量為奇數,因為4臺的可用性與3臺的一樣。

溫馨提示:上述結論只是我的一些思考,我們可以帶著上述思考,進入到Dleger的學習中,下一篇將從源碼分析的角度來學習大神是如何實現Raft協議的Leader選主的,讓我們一起期待吧。

 

2、日志復制



完成集群內的選主工作后,客戶端向主節點發送請求,由主節點負責數據的復制,使集群內的數據保持一致性,初始狀態如下圖所示:

RocketMQ中如何分析raft協議  
客戶端向主節點發起請求,例如set 5,將數據更新為5,如下圖所示:  
 
RocketMQ中如何分析raft協議  
主節點收到客戶端請求后,將數據追加到Leader的日志中(但未提交),然后在下一個心跳包中將日志轉發到集群內從節點,如下圖所示:  
 
RocketMQ中如何分析raft協議  
從節點收到Leader的日志后,追加到從節點的日志文件中,并返回確認ACK。Leader收到從節點的確認信息后,向客戶端發送確認信息。  
 
RocketMQ中如何分析raft協議  
上述的日志復制比較簡單,是由于只考慮正常的情況,如果中間發生異常,該如何保證數據一致性呢?
  1. 如果 Leader 節點向從節點廣播日志時,其中某個從節點發送故障宕機,該如何處理呢?

  2. 日志在什么環節進行提交呢?Leader節點在收到客戶端的數據變更請求后,首先追加到主節點的日志文件中,然后廣播到從節點,從節點收到日志信息,是提交日志后返回ACK,還是什么時候提交呢?

  3. 日志如何保證唯一。

  4. 如何處理網絡出現分區。

關于RocketMQ中如何分析raft協議就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巨野县| 凤庆县| 班玛县| 台江县| 阿瓦提县| 芦山县| 常宁市| 城市| 增城市| 平遥县| 龙口市| 美姑县| 长白| 苏州市| 临湘市| 志丹县| 巴彦淖尔市| 龙岩市| 新余市| 铅山县| 平远县| 商河县| 龙口市| 景德镇市| 凤阳县| 富裕县| 福海县| 五华县| 马山县| 邢台县| 弥渡县| 河南省| 尼勒克县| 自贡市| 四平市| 军事| 天柱县| 遂昌县| 瓮安县| 河间市| 中山市|