RocketMQ 5.x新版本部署优化一览

news2025/7/15 9:09:24

​ RocketMQ从2022年9月份开始推出了新的5.x大版本。相比于之前的4.x版本,5.x版本向云原生前进了一大步。在增强原因功能的基础上,更是支持多语言客户端,周边生态也进行了补强和完善,明显可以看到离Kafka老大哥又近了很大一步。

一、整体部署组件优化

​ 在服务部署方面,5.x新版本进一步靠近云原生。将各种复杂功能进一步化整为零,通过更灵活的服务组合,提升整体性能。

在这里插入图片描述

1、在Broker与客户端之间增加Proxy组件

​ Proxy组件主要是为了兼容多语言客户端(c/c++, golang, csharp,rust,python, nodejs)。如果还是使用的Java客户端,则不需要启动Proxy。

​ Proxy组件部署分为两种模式,Local模式以及Cluster模式。其中,Local模式就是随Broker一起部署。 部署方式是在执行bin/mqbroker脚本启动Broker时,增加–enable-proxy参数。Cluster模式则是与Broker分开部署。部署方式是在启动Broker时不要添加–enable-proxy参数,而通过执行bin/mqproxy脚本单独启动Proxy服务。通过-n参数执行NameServer即可。如果需要定制配置项,可以通过添加-pc或者–proxyConfigPath参数指定一个单独的JSON配置文件。目前5.1.0版本中,这个配置文件还没有什么配置项,只有一个rocketMQClusterName属性指定对应的Broker集群的名字。

2、在Broker与NameServer之间增加Controller组件

​ 在之前的4.x版本中,如果需要搭建具备自动主从切换的高可用集群,是需要搭建Dledger集群的,对应发布版本的conf/dledger下的配置文件。这种模式在5.x版本中依然可以使用,不过,5.x版本增加了一种更轻量级进行主从切换的方式,那就是Controller组件。

​ 4.x版本中Dledger集群对RocketMQ的影响包含两个方面,一方面是通过集群选主,支持主从切换,另一方面就是接管RocketMQ的CommitLog日志文件读写。而Controller的作用就是将集群选主功能单独提取出来,提供主从切换的高可用功能。使用Controller组件后,RocketMQ就可以使用自己原有的日志读写机制搭建高可用集群,这样可以更好的用上RocketMQ原生的文件读写功能。未来应该会是RocketMQ集群搭建的主流方式。

​ Controller也有两种部署方式,可以嵌入到NameServer中运行,也可以单独部署运行。

  • 如果嵌入NameServer中部署,则需要在执行bin/mqnamesrv脚本启动NameServer时,通过-c参数指定配置文件,并在配置文件中增加一个关键配置: enableControllerInNamesrv = true 。这个参数表示在NameServer中开启Controller。接下来在配置文件中加入Controller的相关配置信息。这些配置信息和4.x版本配置Dledger集群的方式大致差不多。

示例配置:

enableControllerInNamesrv = true
controllerDLegerGroup = group1
controllerDLegerPeers = n0-127.0.0.1:9877;n1-127.0.0.1:9878;n2-127.0.0.1:9879
controllerDLegerSelfId = n0
controllerStorePath = /home/admin/DledgerController
enableElectUncleanMaster = false
notifyBrokerRoleChanged = true

Controller相关配置参数如下:

  • enableControllerInNamesrv:Nameserver 中是否开启 controller,默认 false。
  • controllerDLegerGroup:DLedger Raft Group 的名字,同一个 DLedger Raft Group 保持一致即可。
  • controllerDLegerPeers:DLedger Group 内各节点的端口信息,同一个 Group 内的各个节点配置必须要保证一致。
  • controllerDLegerSelfId:节点 id,必须属于 controllerDLegerPeers 中的一个;同 Group 内各个节点要唯一。
  • controllerStorePath:controller 日志存储位置。controller 是有状态的,controller 重启或宕机需要依靠日志来恢复数据,该目录非常重要,不可以轻易删除。
  • enableElectUncleanMaster:是否可以从 SyncStateSet 以外选举 Master,若为 true,可能会选取数据落后的副本作为 Master 而丢失消息,默认为 false。
  • notifyBrokerRoleChanged:当 Broker 副本组上角色发生变化时是否主动通知,默认为 true。
  • 如果要独立部署Controller,则直接调用bin/mqcontroller脚本,通过-c参数指定配置文件即可。相关参数跟在NameServer中配置是一样的。

​ 接下来,在启动Broker服务时,如果想要使用Controller,则需要在Broker配置文件中加入:enableControllerMode=true以及controllerAddr 两个核心配置。这样Broker集群就可以具备自动选主的功能。

​ 但是要注意:如果部署了Controller服务,Broker端不开启Controller,这是可以正常运行的,只不过Broker集群不具备自动选主的功能。但是如果反过来,Broker端开启Controller,但是没有部署Controller服务,这样Broker服务就无法正常启动。

Broker中与Controller相关的配置参数如下:

  • enableControllerMode:Broker controller 模式的总开关,只有该值为 true,自动主从切换模式才会打开。默认为 false。
  • controllerAddr:controller 的地址,多个 controller 中间用分号隔开。例如controllerAddr = 127.0.0.1:9877;127.0.0.1:9878;127.0.0.1:9879
  • syncBrokerMetadataPeriod:向 controller 同步 Broker 副本信息的时间间隔。默认 5000(5s)。
  • checkSyncStateSetPeriod:检查 SyncStateSet 的时间间隔,检查 SyncStateSet 可能会 shrink SyncState。默认5000(5s)。
  • syncControllerMetadataPeriod:同步 controller 元数据的时间间隔,主要是获取 active controller 的地址。默认10000(10s)。
  • haMaxTimeSlaveNotCatchup:表示 Slave 没有跟上 Master 的最大时间间隔,若在 SyncStateSet 中的 slave 超过该时间间隔会将其从 SyncStateSet 移除。默认为 15000(15s)。
  • storePathEpochFile:存储 epoch 文件的位置。epoch 文件非常重要,不可以随意删除。默认在 store 目录下。
  • allAckInSyncStateSet:若该值为 true,则一条消息需要复制到 SyncStateSet 中的每一个副本才会向客户端返回成功,可以保证消息不丢失。默认为 false。
  • syncFromLastFile:若 slave 是空盘启动,是否从最后一个文件进行复制。默认为 false。
  • asyncLearner:若该值为 true,则该副本不会进入 SyncStateSet,也就是不会被选举成 Master,而是一直作为一个 learner 副本进行异步复制。默认为false。
  • inSyncReplicas:需保持同步的副本组数量,默认为1,allAckInSyncStateSet=true 时该参数无效。
  • minInSyncReplicas:最小需保持同步的副本组数量,若 SyncStateSet 中副本个数小于 minInSyncReplicas 则 putMessage 直接返回 PutMessageStatus.IN_SYNC_REPLICAS_NOT_ENOUGH,默认为1。

​ 最后,官方也列了个表格,展示了新版本的Controller功能与4.x旧版本的NameServer和Broker组合会是什么情况。就做做参考好了。

旧版 Nameserver旧版 Nameserver+独立部署 Controller新版 Nameserver 开启 controller功能新版 Nameserver 关闭 controller 功能
旧版 Broker正常运行,无法切换正常运行,无法切换正常运行,无法切换正常运行,无法切换
新版 Broker 开启 Controller 模式无法正常上线正常运行,可以切换正常运行,可以切换无法正常上线
新版 Broker 不开启 Controller 模式正常运行,无法切换正常运行,无法切换正常运行,无法切换正常运行,无法切换

3、如果一个节点上需要运行多个Broker,增加Container组件

​ 在RocketMQ 4.x 版本中,一个进程只有一个broker,通常会以主备或者DLedger(Raft)的形式部署,但是一个进程中只有一个broker,而slave一般只承担冷备或热备的作用,节点之间角色的不对等导致slave节点资源没有充分被利用。
​ 因此在RocketMQ 5.x 版本中,提供一种新的模式BrokerContainer,在一个BrokerContainer进程中可以加入多个Broker(Master Broker、Slave Broker、DLedger Broker),来提高单个节点的资源利用率,并且可以通过各种形式的交叉部署来实现节点之间的对等部署。

在这里插入图片描述

​ 部署方式是调用bin/mqbrokercontainer脚本,并通过-c参数指定配置文件即可。

sh bin/mqbrokercontainer -c broker-container.conf

​ 在配置文件中可以指定多个Broker的配置文件,作为一个整体一起执行。例如

#配置端口,用于接收mqadmin命令
listenPort=10811
#指定namesrv
namesrvAddr=127.0.0.1:9876
#或指定自动获取namesrv
fetchNamesrvAddrByAddressServer=true
#指定要向BrokerContainer内添加的brokerConfig路径,多个config间用“:”分隔;
#不指定则只启动BrokerConainer,具体broker可通过mqadmin工具添加
brokerConfigPaths=/home/admin/broker-a.conf:/home/admin/broker-b.conf

4、虚拟化部署

​ 整体来看,5.x新版本的功能组件拆分更加分散,而部署的组合也更加灵活,随时可以优化资源配置,设计更合适的部署方案。但是我觉得另一方面也加大了服务部署的门槛。结合Docker或者虚拟化技术会更加好用。

​ 你对Docker不熟?也不用担心,RocketMQ也推出了一个仓库,专门介绍如何结合Docker以及K8s使用RocketMQ。Git仓库地址: https://github.com/apache/rocketmq-docker 有兴趣的可以去看看。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/369902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux网络编程-多进程实现TCP并发服务器

服务端流程步骤socket函数创建监听套接字lfdbind函数将监听套接字绑定ip和端口listen函数设置服务器为被动监听状态,同时创建一条未完成连接队列(没走完tcp三次握手流程的连接),和一条已完成连接队列(已完成tcp三次握手…

3-虚拟机篇

一.java JVM 的内存结构 内存:按线程类型分两类 线程共享: 方法区:存放类的信息堆:存放java对象的信息 线程私有: java虚拟机栈:存放java方法、方法参数和局部变量程序计数器:记录程序执行…

mars3d将当前视⻆指向北⽅且加载建筑物白膜

通过 setView⽅法实现,可以设置heading参数控制相对旋转⻆度map.scene.camera.setView({ orientation: { heading: 0, } }) 相关示例:1.http://mars3d.cn/editor-vue.html?idmap/options/scene2.功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技// *…

ESP32S3 SPI发送间隔频率 驱动ADS8326

ESP32S3 SPI发送间隔频率驱动ADS8326esp32s3 spi例程 代码测试用寄存器方式实现spi发送寄存器描述驱动ADS8326 ads8326驱动时序 首先CS信号拉低,然后clk发送6个时钟,ads8326开始启动转换。 最后clk发送16个时钟,就会读取到两个字节的数据&a…

Spring扫描逻辑原码解析(带图好理解)

先上流程图 再上类图 再上代码 public static void main(String[] args) {XsmApplicationContext applicationContextnew XsmApplicationContext(AppConfig.class);System.out.println(applicationContext.getBean("userService"));System.out.println(applicationCo…

Laravel框架学习笔记——Laravel环境配置及安装(Ubuntu20.04为例)

目录引言1、安装Nginx2、安装PHP3、安装Composer4、搭建Laravel框架项目5、修改Nginx映射6、安装MySQL引言 好久没写博客了,因为个人需要, 所以要涉及到Laravel框架的学习,所以会出一系列的关于PHP的Laravel框架学习笔记,希望能够…

【平台数仓设计——2023】

平台数仓设计——2023前言一、选取大数据平台1、CDH大数据平台2、HDP大数据平台3、CDP大数据平台4、各种云数据中台二、选取调度平台1、DolphinScheduler(海豚调度)2、AzKaban3、Oozie4、Airflow5、corntab命令三、选取数仓设计方案1、离线数仓2、实时数仓3、离线实时一体化数仓…

尚医通 (二十二)预约下单

目录一、预约下单功能(一)1、需求2、搭建订单模块3、封装Feign调用获取就诊人接口4、封装Feign调用获取排班下单信息接口二、预约下单功能(二)1、实现生成订单接口三、预约下单功能(三)四、预约下单功能(四)1、生成订单后处理逻辑-封装短信接口2、生成订单后处理逻辑-更新排班数…

cracklib与libpwquality 评估密码的安全性

一、cracklib 检测密码强弱linux中采用pam pam_cracklib module来实现对密码强度的检测,可以通过配置让linux系统自动检测用户的密码是否为弱密码。yuminstall cracklib # centos apt-get install libcrack2 # ubuntu # 如果需要依赖此库做开发的话需要安装这个 y…

墨者——内部文件上传系统漏洞分析溯源 内部文件上传系统漏洞分析溯源

墨者——内部文件上传系统漏洞分析溯源 内部文件上传系统漏洞分析溯源 1.选择合适的文件上传 2.可以看到为*.asp文件 3.可以推测出此站点为IIS 4.上传shell.asp试试 5.上传报错,将其改名为shell.asp.txt上传,发现上传成功 6.有个问题就是服务器将我们所…

Node 10.0.8.6:9003 is unknown to cluster

解决方案解决方案一解决方案一 ① 概念介绍 公网ip:就是任意两台连接了互联网的电脑可以互相ping ip,能够通的ip 内网ip:只是在内网中使用无法与外网连接的ip ②问题背景 在腾讯云上搭建的一个redis集群,集群启动后 可以看到启动节点…

腾讯企微、泛微、契约锁举办的这场大会,超1000人共商数字化转型

全程数字化运营平台体验大会 2月23日下午,腾讯企业微信、泛微、契约锁在上海联合举办了全程数字化运营平台体验大会,旨在推动政企客户的数字化转型。 活动以“智能、协同、高效”为主题,吸引了上千位政府及企事单位的信息化负责人参与。 在…

Tapdata 和 Databend 数仓数据同步实战

作者:韩山杰https://github.com/hantmacDatabend Cloud 研发工程师基础架构在云计算时代也发生着翻天地覆的变化,对于业务的支持变成了如何能利用好云资源实现降本增效,同时更好的支撑业务也成为新时代技术人员的挑战。 本篇文章通过&#xf…

含泪推荐5款小体积,超实用的工具

大家好,我又来啦,今天给大家带来的5款软件,共同特点都是体积小、无广告、超实用,大家观看完可以自行搜索下载哦。 1.文字自动验证工具——LanguageTool LanguageTool是一款文字自动验证工具,不仅支持中英文&#xff…

如何将虚拟机ubuntu设置网路连接为桥接模式

当将虚拟机的网络适配器设置为NAT模式时,一切正常,可以ping通所有ip, 但是当设置为桥接模式时,ping命令会提示ubuntu connect: Network is unreachable 这是因为桥接模式没有设置正确,通过下面的步骤可以将桥接模式配置正确。 1…

iOS 生命周期 (最新最完整)

要知道APP的生命周期,首先要了解一下生命周期的5种状态,结合状态理解生命周期的使用。 一、应用的状态 应用的状态包括: 1.1 未运行(Not running) 程序没启动 1.2 未激活(Inactive) 程序在…

尚医通 (二十一)预约挂号功能

目录一、预约挂号详情1、需求2、预约挂号详情接口3、预约挂号详情前端二、预约确认1、需求2、预约确认接口3、预约确认前端一、预约挂号详情 1、需求 接口分析 (1)根据预约周期,展示可预约日期数据,按分页展示 (2&…

JAVA设计模式之工厂模式讲解

目录 前言 开始表演 前言 Java中使用工厂模式的主要原因是为了实现代码的灵活性和可维护性。工厂模式是一种创建型设计模式,它提供了一种将对象的创建和使用进行分离的方式。具体来说,工厂模式可以将对象的创建过程封装在一个独立的工厂类中&#xff…

自动微分记录

计算图(数据流图):AI系统化问题 - 计算图的提出 计算图和自动微分 单算子切分、图的切分和调度 前端->统一表示->优化层->运行时态->底层库 语言 计算网络模型中间表示 计算图 自动微分 计算图优化 内存管理、计算图调度和执行 内核代码优化与编译 多硬件支持…

ip-guard如何在控制台上判断策略是否下发成功?

方法1.看控制台策略设置是否带*号,一般带*,然后刷新控制台依旧带*,说明策略没下发。可以点击刷新按钮进行刷新。 方法2.运行cmd,将控制台程序拖入命令行中,加参数-ad,回车运行。 然后,选中指定客户端,在维护-命令行,输入policy,