探秘 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.mzph.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…