尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
RocketMQ 集群特性
摘要本文重点梳理 Dledger 文件一致性协议含 Raft 原理与 RocketMQ 实现、主从节点切换的高可用集群、BrokerContainer 容器式运行机制。一、Dledger 文件一致性协议1. Dledger 高可用集群下的消息一致性问题RocketMQ 提供两种集群机制固定角色的主从集群和自行选主的 Dledger 集群。Dledger 集群的主节点由自主选举产生文件同步比主从同步复杂得多——消息数据不能简单从主节点向从节点同步而需要在整个集群内达成一致。分布式数据一致性问题的核心挑战包括服务稳定性各个 Server 状态不稳定随时可能宕机。网络抖动Server 之间网络抖动会导致请求丢失。网速差异传输速度不一致难以保证数据顺序需要引入操作日志集并保证日志顺序。快速响应写入响应时间不能简单依赖集群中最慢的节点。一致性算法分类弱一致性算法DNS 系统、Gossip 协议用于 Fabric 区块链、Cassandra、RedisCluster、Consul。强一致性算法Basic-Paxos、Multi-Paxos含 Raft 系列Nacos 的 JRaft、Kafka 的 Kraft、RocketMQ 的 Dledger、ZABZookeeper。RocketMQ 的 Dledger 基于 Raft 协议源自 OpenMessage 开源组织是一个保证分布式日志一致性的小框架被用于日志文件同步场景。2. 理解 Raft 协议的基本流程Raft 协议分为两个阶段Election 选举和Log Replication 日志同步。核心是保证所有节点上的 Entry 顺序一致注意不是保证 Entry 不丢失。基本工作流程多个 Server 共同选举产生一个 Leader负责响应客户端请求。Leader 通过一致性协议将客户端指令转发到集群所有节点。每个节点将指令以 Entry 形式保存到自己的 Log 日志中此时 Entry 为 uncommitted 状态。当多数节点共同保存了 Entry 后执行 Entry 中的指令并提交到 State Machine 状态机Entry 更新为 committed 状态。节点三种状态Leader选举产生多数派决定向 Follower 发送心跳响应客户端请求向 Follower 同步操作日志。Follower参与选举投票同步 Leader 数据接收 Leader 心跳长期未收到心跳则转为 Candidate。Candidate没有 Leader 时发起投票竞选 Leader。为防止脑裂Raft 引入Term 任期概念时间被划分为多个任期每个任期以选举开始选举成功后由一名 Leader 管理集群直到任期结束。从 CAP 理论看Raft 优先保证 CP放弃 A与之对比Eureka 保证 AP。‌说明一致性Consistency、可用性Availability、分区容错性Partition tolerance状态变化过程所有节点启动时从 Follower 状态开始。每个 Follower 设定选举过期时间Election Timeout通常 150ms-300ms 随机值超过则转为 Candidate。Candidate 开始新任期选举投自己一票向其他节点发起投票 RPC 请求。每个节点每个任期有一次投票资格按规则响应投票请求。Candidate 收到超过半数节点同意后转为 Leader开始发送心跳确认地位。其他节点收到心跳后转为 Follower等待同步日志Leader 心跳超时或宕机后触发下一轮选举。3. Raft 协议的基础实现机制拆解每个节点需要保存的数据currentTerm服务器当前任期。votedFor当前任期投票给了谁。log[]日志条目 Entry包含 Command客户端指令、term任期、idx偏移量。commitIndex已提交 Entry 的索引记录消息同步进度。lastApplied已执行完 Command 的 Entry 索引记录往状态机提交的进度lastApplied ≤ commitIndex。Leader 特有参数nextIndex[]给每个 Follower 同步到了哪一条 Entry。matchIndex[]每个 Follower 已复制到了哪一条 Entry记录待确认消息。核心 RPC 请求投票请求参数含 term、candidateId、lastLogIndex、lastLogTerm响应含 term、voteGranted。心跳请求Leader 发送不带日志条目。日志同步请求Leader 发送带日志条目支持批量同步参数含 term、leaderId、entries[]、leaderCommit。4. RocketMQ 中的 Raft 实现RocketMQ 的 Dledger 实现要点节点基础状态io.openmessaging.storage.dledger.MemberState 记录selfId自己的 IDrole 自己的角色leaderIdcurrentTerm当前 Leader 的任期currentVoteFor当前 Term 内投票给了谁。 一个任期内只能投一次票ledgerEndIndex当前节点最后一个Entry 的索引LedgerEndTerm当前节点最后一个 Entry 的任期。同步进度DLedgerEntryPusher 中的 dispatcherMap 相当于 nextIndex[]pendingMap 相当于 matchIndex[]。LogEntry 设计io.openmessaging.storage.dledger.entry.DLedgerEntrybody 传递消息主要是 CommitLog 的子类 DLedgerCommitLog。Dledger 集群与主从集群的日志文件不通用无法直接迁移。状态机io.openmessaging.storage.dledger.statemachine.StateMachine 接口记录 lastAppliedIndex 和 CommitIndex具体实现由 RocketMQ 自行完成。RPC 请求位于 io.openmessaging.storage.dledger.protocol 包下。二、主从节点切换的高可用集群Dledger 集群把选举和同步日志一起完成日志比主从集群大很多增加写日志的 IO 负担。因此 RocketMQ 5.x 提供Controller 机制既使用 Raft 选举机制带来的高可用特性又使用 RocketMQ 原生的 CommitLog 日志。部署方式参见官网https://rocketmq.apache.org/zh/docs/deploymentOperations/03autofailover理解重点Controller 组件不仅是一个工具更体现了 RocketMQ 思考问题的方式——在保证高可用的同时尽量复用原有组件、降低额外开销。三、RocketMQ 的 BrokerContainer 容器式运行机制在 RocketMQ 4.x 中一个 Broker 就是一个进程主从角色不对等导致服务器资源无法充分利用。RocketMQ 5.x 提供BrokerContainer模式一个进程中可加入多个 BrokerMaster、Slave 或 DledgerBroker提高单节点资源利用率通过交叉部署实现节点对等。启动方式bin/mqbrokercontainer -c broker-container.conf核心配置示例# 配置端口用于接收 mqadmin 命令 listenPort10811 # 指定 namesrv namesrvAddrworker1:9876;worker2:9876;worker3:9876 # 指定要向 BrokerContainer 内添加的 brokerConfig 路径多个 config 间用 : 分隔 brokerConfigPaths/app/rocketmq/conf/2m-2s-async/broker-b-s.properties:/app/rocketmq/conf/2m-2s-async/broker-a.properties四、RocketMQ 的集群架构总结RocketMQ 5.x 相比 4.x 向云原生迈进了一大步新增三大特性Controller 主从切换集群Raft 选举 原生 CommitLog。Container 容器化运行机制单进程多 Broker提高资源利用率。Proxy 组件兼容多语言客户端可与 Broker 组合部署或单独部署Java 客户端无需启动 Proxy。Proxy 部署参见官网https://rocketmq.apache.org/zh/docs/quickStart/01quickstart五、面试常见提问与解答Q1RocketMQ 主从集群和 Dledger 集群有什么区别答主从集群角色固定由主节点向从节点同步消息实现简单但主节点故障时需人工或额外机制切换。Dledger 集群基于 Raft 协议主节点由选举产生消息需在整个集群内达成一致具备自动故障转移能力但日志文件更大写 IO 负担更重。Q2Raft 协议如何保证数据一致性答Raft 通过 Leader 选举、日志复制和提交机制保证一致性。所有写请求由 Leader 处理Leader 将指令以 Entry 形式复制到多数节点后才提交到状态机。通过 Term 任期和多数派投票防止脑裂保证同一时刻最多只有一个 Leader。Q3Raft 中 Leader 选举的触发条件是什么答Follower 在 Election Timeout通常 150ms-300ms 随机值内未收到 Leader 心跳就会转为 Candidate 并发起新一轮选举。随机超时时间可防止多个节点同时发起选举导致投票分裂。Q4Raft 中 committed 和 uncommitted 状态有什么区别答Entry 被保存到节点日志时是 uncommitted 状态此时尚未执行。当多数节点都保存了该 Entry 后Leader 将其标记为 committed 并提交到状态机执行。只有 committed 的 Entry 才会真正影响系统状态。Q5RocketMQ 5.x 的 Controller 机制解决了什么问题答Dledger 集群日志文件大、写 IO 负担重。Controller 机制将 Raft 选举与日志同步分离既获得自动故障转移的高可用能力又保留 RocketMQ 原生 CommitLog 日志格式降低额外开销。Q6BrokerContainer 相比传统部署模式有什么优势答传统模式一个进程只有一个 Broker主从角色不对等导致资源利用率低。BrokerContainer 允许一个进程运行多个 Broker支持 Master、Slave、DledgerBroker 混合部署提高单节点资源利用率并可通过交叉部署实现节点对等。Q7Raft 协议中 nextIndex[] 和 matchIndex[] 的作用是什么答nextIndex[] 记录 Leader 给每个 Follower 同步到了哪条 Entry用于决定下次发送的起始位置matchIndex[] 记录每个 Follower 已复制到哪条 Entry用于判断哪些 Entry 已被多数节点复制从而推进 commitIndex。Q8为什么说 Raft 保证的是 Entry 顺序一致而不是不丢失答Raft 的核心目标是让所有节点以相同顺序应用日志条目保证状态机最终一致。但网络分区或节点宕机可能导致部分 Entry 未复制到所有节点这些 Entry 在 Leader 切换时可能被覆盖或丢弃因此 Raft 不保证 Entry 绝对不丢失。
RELATED

相关推荐

基于微信小程序的ACG手办商店系统(毕设源码+文档)

基于微信小程序的ACG手办商店系统(毕设源码+文档)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

📅 2026/10/23 9:17:19
Java在AI时代不会消亡:停更事件背后的真实技术演进与选型策略

Java在AI时代不会消亡:停更事件背后的真实技术演进与选型策略

最近在技术社区看到这个标题,说实话我第一反应是有点哭笑不得。Java群体本来就容易在大模型浪潮里感到焦虑,再配上"某国产适配组件停更"这种消息,很容易被渲染成"Java真的要完了"。但如果你把这个消息放在整个技术版图里…

📅 2026/10/23 9:12:18
iOS无签名IPA打包:原理详解与xcodebuild命令行实战

iOS无签名IPA打包:原理详解与xcodebuild命令行实战

做iOS开发的朋友,应该都遇到过类似的尴尬:证书过期、描述文件失效、或者临时要装一台没有加入开发团队的设备,而手头只有一个.xcarchive或者干脆只有一堆编译好的.app。这时候如果能把工程打成一个没有签名的 ipa 包,很多问题反而…

📅 2026/10/23 9:12:18
MORE NEWS

更多资讯

📰

不同GC算法调优实践:Serial、Parallel、CMS、G1的调优策略(附测试数据)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

旧平板别吃灰!用Deskreen零成本打造电脑副屏,附避坑指南

家里有台吃灰的旧平板,或者淘汰下来的手机,你是不是也动过"把它当电脑副屏用"的念头?我最早折腾这件事,是因为写代码时窗口切来切去太烦,想弄个竖屏专门盯日志和文档,结果一查方案,要…

📰

固定资产管理系统Java源码解析:基于SSM框架的完整资产全生命周期实现

简介:固定资产管理系统Java项目源码以完整源代码形式,提供了一套基于Java技术开发的资产管理系统,覆盖固定资产的增、删、改、查、采购入库、分配折旧、盘点报废等生命周期管理功能,并支持通过ODBC配置灵活切换SQL Server、MySQL、…

📰

Miniconda虚拟环境配置指南:conda/pip分工与VS Code避坑

1. 先想清楚:为什么是 Miniconda,而不是 Anaconda 或裸 Python1.1 一个常见的翻车现场我见过太多人装 Python 环境的流程是这样的:官网下个安装包,一路下一步,装完打开终端敲pip install,然后过两个月回头看…

📰

DTW、Fréchet与Hausdorff手势轨迹匹配及Matlab GUI实现

1. 三种"像不像"的答案:手势轨迹匹配在比什么去年帮一个做教学演示的朋友搭手势控制的小程序,需求很朴素:用户在画布上用鼠标画一笔,系统判断这是"圆圈""横线""勾""闪电"中的哪…

📰

FGO-py 实战指南:自动爬塔 + 自动每周任务,睡前挂上它一晚刷完

FGO-py 实战指南:自动爬塔 自动每周任务,睡前挂上它一晚刷完 【免费下载链接】FGO-py 自动爬塔! 自动每周任务! 全自动免配置跨平台的Fate/Grand Order助手.启动脚本,上床睡觉,养肝护发,满加成圣诞了解一下? 项目地址: https://gitcode.com/GitHub_T…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬