在 RocketMQ 構建高可靠、強一致性消息系統的架構中,DLedgerServer 扮演著舉足輕重的角色,而 MemberState 作為 DLedgerServer 內部用于描述節點狀態的核心類,更是整個分布式日志模塊穩定運行的關鍵。深入理解 MemberState 的設計理念、功能特性和工作原理,有助于我們揭開 RocketMQ 高可用背后的技術奧秘。本文將從多個維度對 DLedgerServer 中的 MemberState 進行詳細介紹與剖析。?
一、MemberState 的基礎概念與重要性?
MemberState 是 DLedgerServer 用于記錄和管理節點狀態的核心數據結構,它貫穿于 DLedger 協議的選舉、日志同步、故障恢復等各個環節。在基于 Raft 協議的 DLedger 集群中,每個節點都有自己的 MemberState 實例,該實例保存著節點在集群中的角色、選舉周期、日志同步進度等關鍵信息。這些信息的準確維護和及時更新,是保證集群正常運行、實現高可用和數據一致性的基礎。無論是節點的選舉過程,還是消息的復制與提交,MemberState 都在其中發揮著承上啟下的作用,協調著節點之間的協作與交互。?
二、MemberState 的核心屬性?
//deleger 框架的核心配置信息public final DLedgerConfig dLedgerConfig;//一個可重入的鎖private final ReentrantLock defaultLock = new ReentrantLock();//server成員的分組信息,一組是有多個Serverprivate final String group;//Server成員自己的idprivate final String selfId;//一組Server里面其他Server的節點信息private final String peers;//server節點當前的角色信息 默認角色是CANDIDATE(候選人)//一開始都是這個CANDIDATE角色 還沒有開始選舉 等選舉完成//就會有LEADER或者FOLLOWER 這兩種角色了private volatile Role role = CANDIDATE;//當前server節點所屬的分組中learder節點的idprivate volatile String leaderId;//當前term條目private volatile long currTerm = 0;//當前投票給誰當leaderprivate volatile String currVoteFor;//leader結尾的索引 默認是-1private volatile long ledgerEndIndex = -1;//leader結尾的 默認是-1private volatile long ledgerEndTerm = -1;//Server分組中已知道的最大的條目 默認也是-1private long knownMaxTermInGroup = -1;//當前server分組里其他peer節點的信息private Map<String, String> peerMap = new HashMap<>();//當前server分組里peer節點是否存活的映射數據信息private Map<String, Boolean> peersLiveTable = new ConcurrentHashMap<>();//傳輸者的概念private volatile String transferee;//當前用于獲取leader節點的terms條目 默認是-1private volatile long termToTakeLeadership = -1;
核心屬性?
-
role:該屬性用于標識節點在集群中的角色,常見的取值包括Leader、Follower和Candidate。Leader角色的節點負責接收客戶端的寫請求,并將日志復制到其他Follower節點;Follower節點處于被動狀態,接收并存儲Leader節點同步過來的日志,響應Leader的心跳和投票請求;Candidate角色則在選舉過程中出現,節點在發起選舉時會轉變為Candidate,嘗試獲取集群中其他節點的投票以成為新的Leader。例如,在一個新啟動的 DLedger 集群中,所有節點初始角色均為Follower,隨著選舉流程的推進,部分節點會轉變為Candidate,最終選舉出一個Leader節點
-
currTerm:表示當前的選舉周期。在 Raft 協議中,term是一個重要的概念,它用于標識不同的選舉階段,每個term內只會有一個Leader。當節點發起選舉時,會將自己的term值加 1,并向其他節點發送投票請求。其他節點在處理投票請求時,會優先考慮term值更高的節點。例如,在一次選舉過程中,如果有兩個Candidate節點同時發起投票請求,擁有更高term值的節點將更有可能獲得其他節點的投票。
-
currVoteFor:記錄當前節點在本次選舉周期中投票給了哪個節點。該屬性確保了每個節點在一個term內只能投一票,并且在選舉過程中可以追蹤投票的流向。當節點接收到投票請求時,會根據自身的term和voteFor屬性來決定是否投票給請求節點。如果請求節點的term大于當前節點的term,且當前節點尚未投票(voteFor為null),則當前節點會將票投給請求節點,并更新voteFor屬性。?
三、MemberState 的狀態轉換邏輯
3.1 從 Follower 到 Candidate 的轉換?
當Follower節點在一定時間內(選舉超時時間)沒有收到Leader節點的心跳消息時,它會認為Leader可能已經宕機,此時Follower節點會觸發選舉流程,將自身的MemberState中的role屬性從Follower轉變為Candidate,同時將term值加 1,并向集群中的其他節點發送投票請求。在發送投票請求時,會攜帶自身的term、ledgerEndIndex和ledgerEndTerm等信息,以便其他節點進行投票決策。例如,節點 A 作為Follower,在選舉超時后,將自己的role設置為Candidate,term從當前的 3 變為 4,并向節點 B、C、D 發送投票請求,請求內容包括 “我是節點 A,term為 4,ledgerEndIndex為 50,ledgerEndTerm為 3,請求投票”。?
3.2 從 Candidate 到 Leader 或 Follower 的轉換?
-
成為 Leader:當Candidate節點在一個選舉周期內獲得超過半數節點的投票時,它將贏得選舉,成為Leader節點。此時,Candidate節點會更新自身MemberState的role為Leader,并開始向其他Follower節點發送心跳消息和日志復制請求。例如,在一個包含 5 個節點的集群中,節點 A 作為Candidate,收到了節點 B、C 的投票,加上自身的一票,共獲得 3 票(超過半數),則節點 A 成功當選為Leader,將role設置為Leader,并向節點 B、C、D 發送心跳消息以維持領導地位。?
-
重新成為 Follower:如果Candidate節點在選舉過程中發現其他節點的term值比自己更高,或者在等待投票的過程中收到了Leader節點的心跳消息,它會意識到已經有其他節點成為了Leader,此時Candidate節點會將自身的role重新設置為Follower,并更新term為更高的term值,以與新的Leader保持一致。例如,節點 A 作為Candidate正在等待投票,此時收到了節點 B(term為 5)發送的心跳消息,而節點 A 的term為 4,那么節點 A 會將自己的role改為Follower,term更新為 5,繼續作為Follower接收Leader節點 B 的消息。
3.3 從 Leader 到 Follower 的轉換?
當Leader節點出現故障,如網絡中斷、宕機等情況,導致無法正常向Follower節點發送心跳消息和日志復制請求時,Follower節點會在選舉超時后發起新一輪選舉。如果在新一輪選舉中,其他節點當選為新的Leader,原Leader節點在恢復正常后,會發現集群中已經有了新的Leader(通過收到新Leader的心跳消息或投票請求得知),此時原Leader節點會將自身的role從Leader轉換為Follower,并更新term和其他相關屬性,以適應新的集群狀態。
四、MemberState 與 DLedgerServer 其他組件的協同工作?
MemberState 與 DLedgerServer 的選舉組件、遠程通信組件、日志存儲組件等密切協作,共同保障 DLedger 集群的正常運行。在選舉過程中,選舉組件依賴MemberState的屬性來判斷節點的選舉資格和投票決策;遠程通信組件在發送和接收消息時,會攜帶MemberState的相關信息,如節點角色、term等,以便其他節點進行處理;日志存儲組件在寫入和讀取日志時,會與MemberState中的lastLogIndex和lastLogTerm進行交互,確保日志的一致性和完整性。例如,在日志復制過程中,Leader節點的遠程通信組件會將MemberState中的ledgerEndIndex和ledgerEndTerm等信息封裝到日志復制請求中,發送給Follower節點;Follower節點接收到請求后,會根據自身MemberState的相關屬性進行校驗,然后將日志寫入日志存儲組件,并更新自身MemberState的ledgerEndIndex和ledgerEndTerm。?
MemberState 作為 RocketMQ 中 DLedgerServer 的核心狀態管理類,通過對節點角色、選舉周期、日志同步等關鍵信息的精準維護和高效管理,在集群的選舉、日志同步、故障恢復等各個環節中發揮著不可或缺的作用。深入理解 MemberState 的設計和工作原理,不僅有助于我們掌握 RocketMQ 高可用和強一致性的實現機制,還能為在實際應用中優化和調試 DLedger 集群提供有力的支持。隨著分布式系統技術的不斷發展,相信 MemberState 的設計理念和實現方式也將不斷演進和完善,為構建更加可靠、高效的消息系統奠定堅實的基礎。?