rocketmq原理源码分析之控制器模式- dledger
简介
RocketMQ 4.5 版本之前,RocketMQ 的broker是 Master/Slave部署架构,一组 broker 有一个 Master ,有0到若干Slave,Slave复制Master消息存储,随时替代下线的Master。Master/Slave部署架构提供一定的高可用性,但这样的部署架构,主节点下线需要手动进行重启或者手动切换,需要一个新的多副本架构,支持自动切换,解决方案基本可以分为两种:
- 独立的分布式协调组件,如 zookeeper,实现选主和分布式存储,该方案引入外部组件,增加运维成本。
- 可嵌入的分布式组件,如 raft , raft 协议相比前者的优点是不需要引入外部组件,自动选主逻辑集成到各个节点的进程中,节点之间通过通信就可以完成选主。
rocketmq选择 raft,目前有 dledger和jraft两个实现,本文分析dledger控制器,broker是rocketmq的核心组件,负责消息的存储,接收消息,分发消息,dledger控制器提供broker的选主,监管, 元数据保存等服务,保障broker高可用。
本文分分析基于rocketmq 5.2.0,关于dledger原理分析可参看参考资料
关键词
raft/dledger/jraft dledger/jraft 都是raft实现,其中jraft是蚂蚁金服的作品,改造自百度的braft,代码比较难懂,dledger是openmessage的一个组件,一开始就是java实现,代码相对易读,特性没有jraft丰富
选主/日志复制/状态机 raft特性,可参看参考资料了解
参考资料
https://blog.csdn.net/szlhj/category_12714458.html dledger源码原理分析,包括选主,心跳,日志复制,状态机
dledger
本文分析dledger控制器,本章简单介绍一下dledger
- 应用/client client是dledger提供给应用访问节点的组件
以下是节点内组件
- rpc服务
rpc服务内置rpc client/rpc server,对外接收外部rpc访问,包括client和节点间通讯;对内,解释rpc请求,转发给Server;对外,发送rpc请求到其他节点
- Server
主程序,负责节点启动,其他组件的启动;写入日志请求初步处理等
- Elector
选举类,负责集群主节点选举
- EntryPusher
日志写入器,内置分发器和处理器,分发器主节点用于复制日志到跟随者;处理器跟随者使用,写入日志
- 存储
存储日志条目,有两个实现,基于内存和基于文件
- 快照/状态机
新版本的dledger提供状态机,dledger成为通用的raft组件,不再是转为rocketmq使用
技术架构
上图dledger控制器模式的技术架构图,只关注dledger控制器与broker部分,dledger控制器集群提供broker选主和分布式存储同步,支撑broker的高可用。
上图的broker指向dledger控制器的蓝色虚线箭头代表broker向控制器的rpc调用,调用分两类,上报和获取,上报数据大部分走raft写, dledger主节点处理,然后复制*1到其他非主节点,过半的dledger worker复制完成,提交日志共识点,同时,所有的dledger节点,包括leader和worker,应用(apply)共识点日志到各自的状态机*2
状态机是dledger应用端的接口,接收已提交的共识日志,在这里,”dledger应用”是控制器,日志是broker上报的信息,控制器的状态机最终汇集日志到ReplicasInfoManager的replicaInfoTable和syncStateSetInfoTable。
*1 关于dledger日志写入和复制原理可参考 dledger原理源码分析系列(四)-日志写入和复制-CSDN博客
*2 关于dledger状态机原理可参考 dledger原理源码分析系列(五)-状态机-CSDN博客
原理分析
本节分析broker高可用需解决的问题,raft控制器怎样解决
问题
本节分析broker高可用问题
发现broker下线
broker下线,可能是自身崩溃或者网络故障
broker 选主
发现broker master下线,需选出master,在新master的引领下恢复broker组正常
消息存储可用性
broker健康是高可用的基础,但对于slave还不够,slave复制master消息存储,进度过低不可用,需排除;进度跟上,重新加入
解决
上节分析broker高可用需解决的问题,本节分析raft控制器和broker解决问题的方案
下图展示用例,如何保障broker高可用
broker侧:
- broker启动/恢复 无论启动还是恢复,注册到控制器
- 注册 broker注册到控制器,受控制器监管,注册需要获取brokerId,应用brokerId,broker获得标识
- 心跳 定时向控制器发送心跳,控制器记录和处理,这是发现broker下线的关键手段
- 同步broker副本数据 同步副本室心跳的补充,控制器扫描心跳发现broker下线,选举,通知broker选主结果,但通知服务是oneway模式,不保证通知成功,同步broker副本信息,比较自身的master epoch和其他broker的,如果有更新的master epoch,说明自身错过了新master通知,发起选举
- 同步SynStateSet master定时任务
- 变更为master/slave 控制器选主broker后,通知broker角色变更,master/slave组进入正常工作状态,自动切换完成
控制器侧:
- 扫描心跳 控制器定时扫描broker的心跳,这是发现broker下线的用例
- 选主 不同于dledger的共识选举,broker选主是控制器根据策略选某个broker作为master,不需要多数的3节点及以上
总结:
broker启动或重启恢复,注册到控制器,之后,定时发送心跳到控制器,控制器记录broker心跳,定时扫描心跳记录,未接收到broker 2个周期(可配置)的心跳,认为broker下线,发起broker选主,选主结束通知broker,broker依据选主结果切换为master/slave,实现broker高可用(自动切换)。
同步broker副本信息 这是心跳的补充,控制器扫描心跳发现broker下线,选举,通知broker选主结果,但通知服务是oneway模式,不保证通知成功,同步broker副本信息,比较自身的master epoch和其他broker的,如果有更新的master epoch,说明自身错过了新master通知
更新SyncStateSet broker master负责, master负责复制消息日志到组内slave,拥有slave复制进度的一手资料,不断更新到控制器,为重选master恢复准备
NEXT
下一篇源码分析
相关文章:
rocketmq原理源码分析之控制器模式- dledger
简介 RocketMQ 4.5 版本之前,RocketMQ 的broker是 Master/Slave部署架构,一组 broker 有一个 Master ,有0到若干Slave,Slave复制Master消息存储,随时替代下线的Master。Master/Slave部署架构提供一定的高可用性&#x…...
Hello Moto
“Hello Moto” 是摩托罗拉(Motorola)的一句经典广告口号,用于推广其品牌和产品,特别是在手机领域。以下是它的含义和背景: 1. 品牌宣传的标志性语句 直白含义:简单地向摩托罗拉打招呼(“Hell…...
存储基础 -- SCSI命令格式与使用场景
SCSI命令格式与使用场景 1. SCSI命令描述符块(CDB) 1.1 CDB基本概念 SCSI命令通过**命令描述符块(CDB, Command Descriptor Block)**表示。 CDB长度:SCSI命令根据使用场景有不同长度的CDB,常见的有6字节…...
ceph基本概念,架构,部署(一)
一、分布式存储概述 1.存储分类 存储分为封闭系统的存储和开放系统的存储,而对于开放系统的存储又被分为内置存储和外挂存储。 外挂存储又被细分为直连式存储(DAS)和网络存储(FAS),而网络存储又被细分网络接入存储(NAS)和存储区域网络(SAN)等。 DAS(D…...
CNN-GRU卷积门控循环单元时间序列预测(Matlab完整源码和数据)
CNN-GRU卷积门控循环单元时间序列预测(Matlab完整源码和数据) 目录 CNN-GRU卷积门控循环单元时间序列预测(Matlab完整源码和数据)预测效果基本介绍CNN-GRU卷积门控循环单元时间序列预测一、引言1.1、研究背景与意义1.2、研究现状1…...
Ubuntu 顶部状态栏 配置,gnu扩展程序
顶部状态栏 默认没有配置、隐藏的地方 安装使用Hide Top Bar 或Just Perfection等进行配置 1 安装 sudo apt install gnome-shell-extension-manager2 打开 安装的“扩展管理器” 3. 对顶部状态栏进行配置 使用Hide Top Bar 智能隐藏,或者使用Just Perfection 直…...
React应用深度优化与调试实战指南
一、渲染性能优化进阶 1.1 精细化渲染控制 typescript 复制 // components/HeavyComponent.tsx import React, { memo, useMemo } from react;interface Item {id: string;complexData: {// 复杂嵌套结构}; }const HeavyComponent memo(({ items }: { items: Item[] }) &g…...
Spring中的事件和事件监听器是如何工作的?
目录 一、事件(Event) 二、事件发布器(Event Publisher) 三、事件监听器(Event Listener) 四、使用场景 五、总结 以下是关于Spring中的事件和事件监听器的介绍与使用说明,结合了使用场景&…...
Vue.js组件开发-实现多个文件附件压缩下载
在 Vue 项目中实现多个附件压缩下载,可以借助 jszip 库来创建压缩文件,以及 file-saver 库来保存生成的压缩文件。 步骤 1:安装依赖 首先,在 Vue 项目中安装 jszip 和 file-saver: npm install jszip file-saver步骤…...
基于dlib/face recognition人脸识别推拉流实现
目录 一.环境搭建 二.推拉流代码 三.人脸检测推拉流 一.环境搭建 1.下载RTSP服务器MediaMTX与FFmpeg FFmpeg是一款功能强大的开源多媒体处理工具,而MediaMTX则是一个轻量级的流媒体服务器。两者结合,可以实现将本地视频或者实时摄像头画面推送到RTSP流,从而实现视频…...
qt QNetworkRequest详解
1、概述 QNetworkRequest是Qt网络模块中的一个核心类,专门用于处理网络请求。它封装了网络请求的所有关键信息,包括请求的URL、HTTP头部信息等,使得开发者能够方便地在Qt应用程序中执行网络操作,如文件下载、网页内容获取等。QNe…...
uvm timeout的哪些事
如下图所示,设置timeout并未生效,原因多了一个空格,坑 进一步分析,默认是overidable的 是否加括号呢,如下所示,这两个造型都可以,中间有空格也行 那么,我加上单位可以吗,…...
JavaScript赋能智能网页设计
构建AI驱动的实时风格迁移系统 案例概述 本案例将实现一个基于深度学习的实时图像风格迁移系统,通过浏览器端神经网络推理实现以下高级特性: WebAssembly加速的ONNX模型推理 WebGL Shader实现的风格混合算法 WebRTC实时视频流处理 基于Web Workers的…...
全面了解 Web3 AIGC 和 AI Agent 的创新先锋 MelodAI
不管是在传统领域还是 Crypto,AI 都是公认的最有前景的赛道。随着数字内容需求的爆炸式增长和技术的快速迭代,Web3 AIGC(AI生成内容)和 AI Agent(人工智能代理)正成为两大关键赛道。 AIGC 通过 AI 技术生成…...
leetcode_链表 234.回文链表
234.回文链表 给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是, 返回 true ; 否则, 返回false。思路: 找到中间节点(快慢指针法)反转后半部分的链表比较前半部分和后半部分链表 # Definition for singly-linked list. # class List…...
cloc下载和使用
cloc(Count Lines of Code)是一个跨平台的命令行工具,用于计算代码行数。以下是下载和使用 cloc 的步骤: 下载 cloc 对于 Windows 用户: 访问 cloc 的 GitHub 仓库:https://github.com/AlDanial/cloc在 …...
在 Windows 系统上,将 Ubuntu 从 C 盘 迁移到 D 盘
在 Windows 系统上,如果你使用的是 WSL(Windows Subsystem for Linux)并安装了 Ubuntu,你可以将 Ubuntu 从 C 盘 迁移到 D 盘。迁移过程涉及导出当前的 Ubuntu 发行版,然后将其导入到 D 盘的目标目录。以下是详细的步骤…...
【Redis】Redis入门以及什么是分布式系统{Redis引入+分布式系统介绍}
文章目录 介绍redis的引入 分布式系统单机架构应用服务和数据库服务分离【负载均衡】引入更多的应用服务器节点 单机架构 分布式是什么 数据库分离和负载均衡 理解负载均衡 数据库读写分离 引入缓存 数据库分库分表 引入微服务 介绍 The open source, in-memory data store us…...
wow-agent---task4 MetaGPT初体验
先说坑: 1.使用git clone模式安装metagpt 2.模型尽量使用在线模型或本地高参数模型。 这里使用python3.10.11调试成功 一,安装 安装 | MetaGPT,参考这里的以开发模型进行安装 git clone https://github.com/geekan/MetaGPT.git cd /you…...
Leetcode::3432. 统计元素和差值为偶数的分区方案
3432. 统计元素和差值为偶数的分区方案 已解答 简单 相关企业 提示 给你一个长度为 n 的整数数组 nums 。 分区 是指将数组按照下标 i (0 < i < n - 1)划分成两个 非空 子数组,其中: 左子数组包含区间 [0, i] 内的所…...
linux如何修改密码,要在CentOS 7系统中修改密码
要在CentOS 7系统中修改密码,你可以按照以下步骤操作: 步骤 1: 登录到系统 在登录提示符 localhost login: 后输入你的用户名。输入密码并按回车键。 步骤 2: 修改密码 登录后,使用 passwd 命令来修改密码: passwd 系统会提…...
GIS与相关专业软件汇总
闲来无事突然想整理一下看看 GIS及相关领域 究竟有多少软件或者工具包等。 我询问了几个AI工具并汇总了一个软件汇总,不搜不知道,一搜吓一跳,搜索出来了大量的软件,大部分软件或者工具包都没有见过,不知大家还有没有要…...
云计算架构学习之LNMP架构部署、架构拆分、负载均衡-会话保持
一.LNMP架构部署 1.1. LNMP服务搭建 1.磁盘信息 2.内存 3.负载信息 4.Nginx你们公司都用来干嘛 5.文件句柄(文件描述符 打开文件最大数量) 6.你处理过系统中的漏洞吗 SSH漏洞 7.你写过什么shell脚本 8.监控通过什么告警 zabbix 具体监控哪些内容 9.mysql redis查询 你好H…...
mamba论文学习
rnn 1986 训练速度慢 testing很快 但是很快就忘了 lstm 1997 训练速度慢 testing很快 但是也会忘(序列很长的时候) GRU实在lstm的基础上改进,改变了一些门 transformer2017 训练很快,testing慢些,时间复杂度高&am…...
uva 1354 Mobile Computing
原题: 房间中有一个天平,房间的宽度为r,有s个砝码,每个砝码的重量是 w i w_i wi。设计一个尽量宽,但是宽度不能超过r的天平,挂住所有砝码。天平全部由长度为1的木棍组成,木棍的每一端要么挂一…...
理解C++中的右值引用
右值引用,顾名思义,就是对一个右值进行引用,或者说给右值一个别名。右值引用的规则和左值一用一模一样,都是对一个值或者对象起个别名。 1. 右值引用和左值引用一样,在定义的同时必须立即赋值,如果不立即赋…...
约数个数(简单)
给定 nn 个正整数 aiai,请你输出这些数的乘积的约数个数,答案对 10971097 取模。 输入格式 第一行包含整数 nn。 接下来 nn 行,每行包含一个整数 aiai。 输出格式 输出一个整数,表示所给正整数的乘积的约数个数,答…...
Day33:字符串的切片
在 Python 中,**切片(Slicing)**是对字符串(以及其他序列类型,如列表、元组等)进行提取部分内容的强大工具。通过切片,你可以非常方便地提取字符串的子字符串、倒序字符串,甚至进行步…...
基于回归分析法的光伏发电系统最大功率计算simulink建模与仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于回归分析法的光伏发电系统最大功率计算simulink建模与仿真。选择回归法进行最大功率点的追踪,使用光强和温度作为影响因素,电压作为输出进行建模。…...
redis离线安装部署详解(包括一键启动)
像上文一样 因为在学习的过程中没有查到一个详细的离线部署方案 所以在自己学习之后想要自己写一个文章 希望可以帮助后续学习redis离线部署的朋友少走一线弯路 首先就是下载安装包 可以自己在本地下载再传到机器上(通过xftp或lrzsz都可) http://d…...
Coze插件开发之基于已有服务创建并上架到扣子商店
Coze插件开发之基于已有服务创建并上架到扣子商店 在应用开发中,需要调用各种插件,以快速进行开发。但有时需要调用的插件在扣子商店里没有,那怎么办呢? 今天就来带大家快速基于已有服务创建一个新的插件 简单来讲,就是…...
【Unity】 HTFramework框架(五十九)快速开发编辑器工具(Assembly Viewer + ILSpy)
更新日期:2025年1月23日。 Github源码:[点我获取源码] Gitee源码:[点我获取源码] 索引 开发编辑器工具MouseRayTarget焦点视角Collider线框Assembly Viewer搜索程序集ILSpy反编译程序集搜索GizmosElement类找到Gizmos菜单找到Gizmos窗口分析A…...
【Linux】统计文本中每行指定位置出现的字符串的次数
统计文本中每行指定位置出现的字符串的次数 假定情景 某些项目,会把某个特定事件记录到Log中并且落盘(保持到硬盘)。基于落盘后的日志,要统计这些日志里产生该特定事件的次数 统计脚本 可以写一个sh脚本,来解析某个…...
牛客周赛round78 B,C
B.一起做很甜的梦 题意:就是输出n个数(1-n),使输出的序列中任意选连续的小序列(小序列长度>2&&<n-1)不符合排列(例如如果所选长度为2,在所有长度为2 的小序列里不能出…...
【DB】Oracle存储过程
目录 什么是存储过程? 为什么要使用存储过程? 创建存储过程 无参存储过程语法: 带参存储过程语法: 带有输入参数的存储过程 带有输出参数的存储过程 带有输入输出参数的存储过程 带有异常处理的存储过程 存储过程中游标…...
亚博microros小车-原生ubuntu支持系列:14雷达跟踪与雷达守卫
背景知识 激光雷达的数据格式参见: 亚博microros小车-原生ubuntu支持系列:13 激光雷达避障-CSDN博客 本节体验雷达跟踪跟守卫 PID控制 从百度百科摘一段介绍 比例积分微分控制(proportional-integral-derivative control)&am…...
c++迷宫问题(migong)
今天的题目叫“迷宫问题(migong)”,是“DFS深度优先搜索 递归”一类的。 题目描述 设有一个N*N(2<N<10)方格的迷宫,入口和出口分别在左上角和右上角。迷宫格子中 分别放0和1,0表示可通,1表示不能,入…...
深度学习项目--基于LSTM的糖尿病预测探究(pytorch实现)
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 LSTM模型一直是一个很经典的模型,一般用于序列数据预测,这个可以很好的挖掘数据上下文信息,本文将使用LSTM进行糖尿病…...
Java Swing 基础组件详解 [论文投稿-第四届智能系统、通信与计算机网络]
大会官网:www.icisccn.net Java Swing 是一个功能强大的 GUI 工具包,提供了丰富的组件库用于构建跨平台的桌面应用程序。本文将详细讲解 Swing 的基础组件,包括其作用、使用方法以及示例代码,帮助你快速掌握 Swing 的核心知识。 一…...
深圳大学-智能网络与计算-实验三:网络容量优化分析实验
实验目的与要求 了解什么是凸优化问题;学会使用 Matlab CVX 工具箱解决最优功率分配问题,使得信道容量最大化;了解注水算法; 方法,步骤 深入理解最优功率分配问题。使用 CVX 找出最优的功率分配。使用凸优化数学分析…...
嵌入式基础 -- PCIe 控制器中断管理之MSI与MSI-X简介
PCIe 控制器中断管理技术文档 1. 背景 在现代计算机系统中,中断是设备与 CPU 通信的重要机制,PCIe 控制器提供了从传统线中断到基于消息的中断(MSI/MSI-X)的演进,以提升中断处理效率和可扩展性。x86 和 ARM 架构虽然…...
Android-okhttp详解
目录 一,介绍 二,简单使用 三,流程分析 四,分发器 五,拦截器 5.1 重试及重定向拦截器 5.1.1 重试 5.1.2 重定向 5.2 桥接拦截器 5.3 缓存拦截器 5.4 连接拦截器 5.5 请求服务器拦截器 一,介绍 OkHttp是当下…...
CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据)
CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据) 目录 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据)预测效果基本介绍 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测一…...
数字图像处理:实验七
uu们!这是我们目前数字图像系列的最后一张,之后有关人工智能结合的数字图像处理咸鱼哥正在学习和创作中,所以还请大家给咸鱼哥点时间,同时也提前预祝大家2025年新春快乐!(咸鱼哥真诚的祝愿每一个人…...
Excel分区间统计分析(等步长、不等步长、多维度)
在数据分析过程中,可能会需要统计不同数据区间的人数、某个数据区间的平均值或者进行分组区间统计,本文从excel函数到数据透视表的方法,从简单需求到复杂需求,采用不同的方法进行讲解,尤其是通过数据透视表的强大功能大…...
QWindow类使用介绍与代码演示
深入浅出C++ Qt开发技术专栏 https://blog.csdn.net/yao_hou/category_9276099.html?spm=1001.2014.3001.5482 文章目录 QWindow主要功能和特性常用的函数示例代码适用场景QWindow父类QSurface`QSurface` 类概述主要功能和特性常用的函数相关的子类示例代码`QSurface` 的实际应…...
OpenCV图像显示imshow()函数——详解
OpenCV图像显示imshow()函数——详解 本文目录: 零、时光宝盒 一、OpenCV 图像显示使用imshow()函数语法 二、imshow()显示图片时发生图片显示不全的解决方法 解决办法(1) 解决办法(2) 总结 三、imshow()图像显…...
Oracle 12c 中的 CDB和PDB的启动和关闭
一、简介 Oracle 12c引入了多租户架构,允许一个容器数据库(Container Database, CDB)托管多个独立的可插拔数据库(Pluggable Database, PDB)。本文档旨在详细描述如何启动和关闭CDB及PDB。 二、容器数据库 (CDB) 2.1…...
二次封装的方法
二次封装 我们开发中经常需要封装一些第三方组件,那么父组件应该怎么传值,怎么调用封装好的组件原有的属性、插槽、方法,一个个调用虽然可行,但十分麻烦,我们一起来看更简便的方法。 二次封装组件,属性怎…...
【BQ3568HM开发板】如何在OpenHarmony上通过校园网的上网认证
引言 前面已经对BQ3568HM开发板进行了初步测试,后面我要实现MQTT的工作,但是遇到一个问题,就是开发板无法通过校园网的认证操作。未认证的话会,学校使用的深澜软件系统会屏蔽所有除了认证用的流量。好在我们学校使用的认证系统和…...