引言
我們都知道對于一款訊息中間件來說,它是否能夠方便的實作高可用是評價其穩定性能力的一個重要指標,RocketMQ作為阿里開源的訊息中間件,在性能以及高可用等方面都有出色的表現,那么本文主要和大家探討下RockeqMQ到底是如何實作高可用的,
問題提出
相信大家都知道,在一些常見的中間件設計中如果想要實作資料的高可用性,那么經常采用的辦法就是進行資料冗余度存盤,當然RocketMQ也是不例外的,當資料寫入Broker節點之后,還需要進行資料冗余操作,也就是將資料同步到其他Broker節點上,這樣做的目的就是即便Broke集群存在節點掛了的情況,但是其他的Broker節點中還存有訊息資料,那么就不至于Broker無法對外提供服務,從而實作Broker的高可用,那么這其中就涉及到幾個問題:
1、Broker的集群節點都是對等的嗎?還會是存在leader節點以及follower節點?
2、RocketMQ黨Broker節點掛掉之后,是如何實作故障轉移的?
DLedger如何實作資料冗余存盤?
實際上RocketMQ使用了Dledger的技術來實作高可用的,那這個Dledger到底能干什么呢?首先是實作conmmitlog的統一管理,由于DLedger 提供了一些可以直接讀取CommitLog的API,于是就可以很方便地根據CommitLog去構建ConsumerQueue或者其他的模塊,這就是DLedger 在RocketMQ上最直接的應用,
RocketMQ中的Broker節點采用的是leader節點加follow節點的形式, DLedger 集群發起一個寫請求,集群中的 Leader 節點來處理寫請求,首先資料先存入 Leader 節點,然后需要廣播給它的所有從節點,從節點接收到 Leader 節點的資料推送對資料進行存盤,然后向主節點匯報存盤的結果,Leader 節點會對該日志的存盤結果進行仲裁,如果超過集群數量的一半都成功存盤了該資料,主節點則向客戶端回傳寫入成功,否則向客戶端寫入寫入失敗,

Broker如何實作自動故障轉移的?
在引入Dledger技術之前,Broker的master節點掛掉之后,需要手工進行Broker節點的重啟或者切換,非常的不方便,因此通過引入Dledger技術實作自動的故障轉移,要想實作自動的故障轉移,必定需要在主節點掛掉之后,可以自動進行主節點的選舉以及切換,在RocketMQ中,DLedger 就是一個基于 raft 協議的 commitlog 存盤庫,實際上也是基于Raft協議實作Broker的Leader節點進行選舉的,那么Raft具體的選舉流程又是怎樣的呢?
首先Dledger把RocketMQ集群中的broker節點分為三個角色,每個角色有著自己迪特的職責:
角色說明
Leader角色 :主要負責資料寫入,將資料同步到follower節點,保證主從資料一致性,同時使用心跳機制告訴其他節點它是Leader角色;
Follower角色:負責將leader節點發送過來的資料保存到本地,同時需要回應leader節點心跳;
Candidate角色:該角色等待進行leader選舉,
當RocketMQ 三個節點剛啟動或者leader節點故障掛斷的時候,這個時候集群全部節點都是candidate 狀態,此時會觸發leader選舉,選舉步驟大致:
1、三個RocketMQ Broker節點啟動后,此時它們的角色狀態都是Candidate狀態,等待進行Leader的選舉;
2、此時Broker0率先發起選舉,由于Broker0比較自信,它先選舉自己為Leader,給自己投了一票,然后通知其他節點;
3、當Broker1以及Broker2接收到選舉資訊后,由于它們還沒開始進行選舉,那么既然你Broker0這么自告奮勇,那我們就統一讓你來當Leader吧,于是它們都同意讓Boker0來當這個Leader;
4、當Broker0收到其他兩個節點的確認后,計算自己的投票已經超過半數,于是宣布自己當選,將自己的狀態修改為Leader,并通知其他節點,其他節點修改自己的狀態為Follower,

要想實作故障的自動轉移,那么在Leader節點掛掉之后,必須可以自動選舉新的Leader節點來繼續對外提供服務,那么自動重新選擇Leader節點是怎么選出來的,實際上是因為Follower節點會有一個定時器,如果定時器時間過了還沒收到Leader發送過來的心跳,那么就認為Leader掛了,Follower節點就會轉化為Candidate節點,重新開始進行Leader節點,直到新的節點選舉出來,

思考題
1、如果在同步的程序中,節點掛掉,會不會出現資料丟失的問題?
2、如果只是網路抖動,實際Leader并沒掛掉,但是Follower節點已將開始選舉怎么辦?
歡迎大家再評論區討論問題,
大家好,我是慕楓,感謝各位小伙伴點贊、收藏和評論,文章持續更新,我們下期再見!
真正的大師永遠懷著一顆學徒的心
微信搜索:慕楓技術筆記,優質文章持續更新,我們有學習打卡的群可以拉你進,一起努力沖擊大廠,另外有很多學習以及面試的材料提供給大家,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/377149.html
標籤:其他
