当前位置: 首页 > news >正文

rocketmq原理源码分析之控制器模式- dledger

简介

     RocketMQ 4.5 版本之前,RocketMQ 的broker是 Master/Slave部署架构,一组 broker 有一个 Master ,有0到若干Slave,Slave复制Master消息存储,随时替代下线的Master。Master/Slave部署架构提供一定的高可用性,但这样的部署架构,主节点下线需要手动进行重启或者手动切换,需要一个新的多副本架构,支持自动切换,解决方案基本可以分为两种:

  1. 独立的分布式协调组件,如 zookeeper,实现选主和分布式存储,该方案引入外部组件,增加运维成本。
  2. 可嵌入的分布式组件,如 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…...

Deployment 部署 Pod 流程

文章目录 k8s组件介绍部署文件示例部署 Pod 流程创建 Service 通过创建 Deployment 资源,来看看 k8s 部署 Pod 流程 k8s组件介绍 首先看看 k8s 各组件功能。 control plane 控制平面主要包含以下组件: kube-api-server: 顾名思义,负责处理所…...

塔罗牌(基础):大阿卡那牌

塔罗牌(基础) 大啊卡那牌魔术师女祭司皇后皇帝教皇恋人战车力量隐士命运之轮正义吊人死神节制恶魔高塔星星月亮太阳审判世界 大啊卡那牌 魔术师 作为一个起点,象征:意识行动和创造力。 一个【显化】的概念,即是想法变…...

TCP/IP 协议:互联网通信的基石

TCP/IP 协议:互联网通信的基石 引言 TCP/IP协议,全称为传输控制协议/互联网协议,是互联网上应用最为广泛的通信协议。它定义了数据如何在网络上传输,是构建现代互联网的基础。本文将深入探讨TCP/IP协议的原理、结构、应用以及其在互联网通信中的重要性。 TCP/IP 协议概述…...

Python 之 Excel 表格常用操作

示例文件 test.xlsx 将各个表单拆分成单独的 Excel 文件 import os.pathimport openpyxl import pandasdef handle_excel(file_path):dirname os.path.dirname(file_path)basename os.path.basename(file_path).split(".")[0]wb openpyxl.load_workbook(file_pat…...

2025春招 SpringCloud 面试题汇总

大家好,我是 V 哥。SpringCloud 在面试中属于重灾区,不仅是基础概念、组件细节,还有高级特性、性能优化,关键是项目实践经验的解决方案,都是需要掌握的内容,正所谓打有准备的仗,秒杀面试官&…...

jupyter版本所引起的扩展插件问题

文章目录 如何永久切换python安装源为https://mirrors.aliyun.com/pypi/simple方法一:通过配置文件永久设置(推荐)步骤 1:创建或修改 pip 配置文件步骤 2:验证配置是否生效 方法二:通过命令行直接配置效果验…...

01机器学习入门

机器学习入门可以分为以下几个阶段,逐步掌握核心概念和技能: 1. 基础准备 数学基础 线性代数:矩阵运算、向量空间(推荐《线性代数及其应用》)。概率与统计:概率分布、贝叶斯定理、假设检验(推…...

实现一个安全且高效的图片上传接口:使用ASP.NET Core和SHA256哈希

实现一个安全且高效的图片上传接口:使用ASP.NET Core和SHA256哈希 在现代Web应用程序中,图片上传功能是常见的需求之一。无论是用户头像、产品图片还是文档附件,确保文件上传的安全性和效率至关重要。本文将详细介绍如何使用ASP.NET Core构建…...

PyTorch中的movedim、transpose与permute

在PyTorch中,movedim、transpose 和 permute这三个操作都可以用来重新排列张量(tensor)的维度,它们功能相似却又有所不同。 movedim 🔗 torch.movedim 用途:将张量的一个或多个维度移动到新的位置。参数&…...

HTTP(1)

HTTP协议 HTTP是什么 HTTP(全称为"超文本传输协议")是一种应用非常广泛的基于TCP协议的应用层协议。 常见的应用场景: 浏览器与服务器之间的交互(访问网站)手机与服务器之间的通信多个服务器之间进行通信 …...

C#常考随笔2:函数中多次使用string的+=处理,为什么会产生大量内存垃圾(垃圾碎片),有什么好的方法可以解决?

在 C# 中,由于string类型是不可变的,当在函数中多次使用操作符来拼接字符串时,每次操作都会创建一个新的string对象,旧的对象则成为垃圾对象,这会导致大量的内存分配和垃圾回收,产生内存垃圾和碎片。 在需…...

leetcode刷题记录(一百)——121. 买卖股票的最佳时机

(一)问题描述 121. 买卖股票的最佳时机 - 力扣(LeetCode)121. 买卖股票的最佳时机 - 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并…...

MATLAB绘图时线段颜色、数据点形状与颜色等设置,介绍

MATLAB在绘图时,设置线段颜色和数据点的形状与颜色是提高图形可读性与美观性的重要手段。本文将详细介绍如何在 MATLAB 中设置这些属性。 文章目录 线段颜色设置单字母颜色表示法RGB 值表示法 数据点的形状与颜色设置设置数据点颜色和形状示例代码 运行结果小结 线段…...

CIMRTS材质美化--放大采样、缩小采样

最新的CIMRTS v1.0.10中在要素管理中的材质美化增加「放大采样」和「缩小采样」参数,对于透明树叶可以达到较好效果。 在CesiumLab中,一棵树处理完成后,在EarthSDK中,就是呈现这样缩小就会有树叶丢失的情况。效果如下&#xff1a…...

P8738 [蓝桥杯 2020 国 C] 天干地支

两种方法 #include<bits/stdc.h> using namespace std;int main(){int year;cin>>year;string tg[10] {"geng", "xin", "ren", "gui","jia", "yi", "bing", "ding", "wu&…...

PyCharm接入DeepSeek实现AI编程

目录 效果演示 创建API key 在PyCharm中下载CodeGPT插件 配置Continue DeepSeek 是一家专注于人工智能技术研发的公司&#xff0c;致力于开发高性能、低成本的 AI 模型。DeepSeek-V3 是 DeepSeek 公司推出的最新一代 AI 模型。其前身是 DeepSeek-V2.5&#xff0c;经过持续的…...

Java编程语言:辉煌的历史与未来前景

如果将软件开发世界比喻成一个宇宙&#xff0c;Java 无疑是其中最亮的星星之一。它从诞生起就改变了软件开发世界的格局。发展到今天&#xff0c;Java仍然是这个世界上最重要的编程语言之一。当然&#xff0c;它也面临着新的挑战。 Java的诞生 回溯到 1991 年&#xff0c;在 …...

麦田物语学习笔记:保存和加载场景中的物品

目录 基本流程 1.代码思路 2.代码实现 最终效果 补充知识点 1.序列化 2.委托 基本流程 现在在切换场景后,场景中的物品即使被拾取了,也还是会被重新加载出来,所以本篇文章的任务是在切换场景前后能保留当前场景的数据 1.代码思路 (1)为了保留处在地上的物品数据,就需要…...

页高速缓存与缓冲区缓存的应用差异

页高速缓存&#xff08;Page Cache&#xff09;与缓冲区缓存&#xff08;Buffer Cache&#xff09;是计算机系统中用于提高数据访问性能的两种不同类型的缓存机制&#xff0c;它们的差异主要体现在以下几个方面&#xff1a; 缓存目的 页高速缓存&#xff1a;主要用于加速对磁…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇&#xff1a;Liunx环境下搭建PaddlePaddle 3.0基础环境&#xff08;Liunx Centos8.5安装Python3.10pip3.10&#xff09; 一&#xff1a;前言二&#xff1a;安装编译依赖二&#xff1a;安装Python3.10三&#xff1a;安装PIP3.10四&#xff1a;安装Paddlepaddle基础框架4.1…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...