探秘 RocketMQ 的 DLedgerServer:MemberState 的技術解析與深度剖析

在 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 的設計理念和實現方式也將不斷演進和完善,為構建更加可靠、高效的消息系統奠定堅實的基礎。?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904183.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904183.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904183.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

字符串匹配 之 KMP算法

文章目錄 習題28.找出字符串中第一個匹配項的下標1392.最長快樂前綴 本博客充分參考靈神和知乎的另一位博主 靈神KMP算法模版 知乎博主通俗易懂講解 對于給定一個主串S和一個模式串P,如果讓你求解出模式串P在主串S中匹配的情況下的所有的開始下標簡單的做法又稱為Brute-Force算…

Nginx相關知識

目錄 一.HTTP請求數據在服務器中的傳輸與處理詳解 1.2 套字節 1.3 零拷貝技術 二.I/O模型 2.1 I/O模型簡介 2.2 常見的I/O模型及其特點 1.同步/異步 2.阻塞vs 非阻塞 3. 同步/異步與阻塞/非阻塞的關系 4.多路復用I/O模型 5.異步I/O模型 三.Nginx模塊 3.1 概述ng…

分布式數字身份:邁向Web3.0世界的通行證 | 北京行活動預告

數字經濟浪潮奔涌向前&#xff0c;Web3.0發展方興未艾&#xff0c;分布式數字身份&#xff08;Decentralized Identity&#xff0c;簡稱DID&#xff09;通過將分布式賬本技術與身份治理相融合&#xff0c;在Web3.0時代多方協作的分布式應用場景中發揮核心作用&#xff0c;是構建…

ES6入門---第三單元 模塊四:Set和WeakSet

set數據結構: 類似數組&#xff0c;但是里面不能有重復值&#xff0c;如果有&#xff0c;只顯示一個 set用法: let setArr new Set([a,b]); setArr.add(a); 往setArr里面添加一項 let setArr new Set().add(a).add(b).add(c); setArr.delete(b); 刪除一項 setArr.ha…

Cognito

首先Cognito沒有提供登錄至AWS控制臺的功能&#xff0c;然而您可以通過Cognito Identity Pool獲取到IAM role的credentials [1]&#xff0c;再另外通過代碼自行將IAM role credentials拼湊成AWS控制臺登錄的URL [2]。 最后&#xff0c;由于Cognito的使用除了User Pool以及Iden…

EfficientNet 改進:與Transformer結合的圖像分類模型

1.介紹 在計算機視覺領域,EfficientNet因其高效的網絡架構設計而廣受歡迎。 本文將深入分析一個結合EfficientNet主干和Transformer分類頭的創新模型實現。 模型概述 這個實現將EfficientNet的高效特征提取能力與Transformer的強大序列建模能力相結合,主要包含以下幾個核心…

復雜網絡系列:第 5 部分 — 社區檢測和子圖

關鍵詞&#xff1a;Community Detection Algorithms 一、說明 在本教程中&#xff0c;我們將探討網絡分析的兩個基本方面&#xff1a;社區檢測和使用子圖。了解這些概念將使您能夠發現復雜網絡中隱藏的結構和關系。 二、何為社區&#xff0c;何為社區檢測&#xff1f; 2.1 …

【辦公類-99-04】20250504閔豆統計表excle轉PDF,合并PDF、添加中文字體頁眉+邊框下劃線

需求說明 督導檢查&#xff0c;各條線都要收集資料。 今天去加班&#xff0c;遇到家教主任&#xff0c;她讓我用保教主任的彩色打印機打印這套活躍度表格。&#xff08;2023學年上學期下學期-2024學年上學期&#xff0c;就是202309-202504&#xff09; 每個excle都是內容在A4一…

升級 CUDA Toolkit 12.9 與 cuDNN 9.9.0 后驗證指南:功能與虛擬環境檢測

#工作記錄 在 NVIDIA 發布 CUDA Toolkit 12.9 與 cuDNN 9.9.0 后&#xff0c;開發者紛紛選擇升級以獲取新特性和性能提升。 CUDA Toolkit 12.9 與 cuDNN 9.9.0 發布&#xff0c;帶來全新特性與優化-CSDN博客 然而&#xff0c;升級完成并不意味著大功告成&#xff0c;確認升級后…

LLM論文筆記 28: Universal length generalization with Turing Programs

Arxiv日期&#xff1a;2024.10.4機構&#xff1a;Harvard University 關鍵詞 圖靈機 CoT 長度泛化 核心結論 Turing Programs 的提出 提出 Turing Programs&#xff0c;一種基于圖靈機計算步驟的通用 CoT 策略。通過將算法任務分解為逐步的“磁帶更新”&#xff08;類似圖靈…

【全隊項目】智能學術海報生成系統PosterGenius--圖片布局生成模型LayoutPrompt(1)

&#x1f308; 個人主頁&#xff1a;十二月的貓-CSDN博客 &#x1f525; 系列專欄&#xff1a; &#x1f3c0;大模型實戰訓練營_十二月的貓的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻擋不了春天的腳步&#xff0c;十二點的黑夜遮蔽不住黎明的曙光 目錄 1. 前…

位圖的實現和拓展

一&#xff1a;位圖的介紹 ①&#xff1a;需要位圖的場景 給40億個不重復的無符號整數&#xff0c;沒排過序。給一個無符號整數&#xff0c;如何快速判斷一個數是否在這40億個數中&#xff1f; 要判斷一個數是否在某一堆數中&#xff0c;我們可能會想到如下方法&#xff1a; A…

排序功法入門指南【江湖算法筆記】

話說江湖風云變幻&#xff0c;各路英雄好漢行走江湖&#xff0c;總得有個名號排行。若問“東邪西毒南帝北丐”誰強誰弱&#xff0c;總得排個座次不是&#xff1f;這排序之道&#xff0c;恰似武功秘籍&#xff0c;練好了能號令群雄&#xff0c;練岔了怕是要被笑掉大牙&#xff0…

【中間件】brpc_基礎_用戶態線程中斷

bthread之用戶態線程中斷 源碼 1 簡介 interrupt_pthread 核心功能是 通過信號機制中斷阻塞的 pthread 線程&#xff0c;以實現線程的協作式中斷。 2 核心功能與設計 2.1 信號選擇與注冊 信號選擇&#xff1a;使用 SIGURG 作為中斷信號。 原因&#xff1a;SIGURG 通常用于…

Linux 的網絡卡

#本機操作系統CentOS 10 #核心版本 rootbogon:/etc# uname -r 6.12.0-65.el10.x86_64 網卡能不能被捉到可以使用【dmesg|grep xx】來判斷&#xff0c;有沒有驅動則可以使用lsmod看看模塊有沒有加載核心&#xff01;最后&#xff0c;以ifconfig xxx測試看看 觀察核心所捉到的網卡…

前端雙工通信的幾種方案詳細描述

前端實現雙工通信&#xff08;全雙工或半雙工&#xff09;的常見方案及詳細實現如下&#xff1a; 一、WebSocket&#xff08;全雙工&#xff09; 原理&#xff1a;基于 TCP 的持久化協議&#xff0c;客戶端與服務端建立雙向通信通道&#xff0c;支持實時雙向數據傳輸。 // 客…

KUKA機器人快速啟動設置

KUKA機器人在首次開機啟動時&#xff0c;有時在示教器上需要進行投入運行等相關的設置。如以下相關的信息需要處理&#xff1a; 1、機器人系統開機后&#xff0c;選擇T1運行模式&#xff1b;2、顯示提示信息&#xff1a;“RDC 存儲器和控制系統不一致什么被更換了”時&#xf…

游戲代碼C

以下將結合不同編程語言的特點及游戲開發中的實際應用&#xff0c;展示多種語言的游戲代碼示例&#xff08;以簡單游戲為例&#xff0c;展示代碼結構和邏輯差異&#xff09;。由于代碼篇幅較長&#xff0c;我將分語言進行說明并引用相關來源&#xff1a; 1. C# Unity&#xff…

LangChain Agent核心解析:Zero-Shot-ReAct策略實現與實戰指南

引言 在LangChain的Agent框架中&#xff0c;zero-shot-react-description 是一種預定義的Agent類型&#xff0c;它結合了Zero-Shot&#xff08;零樣本學習&#xff09; 和 ReAct&#xff08;推理行動&#xff09; 策略&#xff0c;主要用于根據工具的描述動態選擇和執行工具&a…

PyQt 或 PySide6 進行 GUI 開發文檔與教程

一、官網文檔 Qt 官方文檔&#xff1a;Porting to Qt 6 | Qt 6.9Qt 維基&#xff1a;???????Qt WikiQt for Python (PySide6) &#xff1a;???????Qt for Python - Qt WikiPySide6 快速上手指南&#xff1a;???????Getting Started - Qt for Python PyS…