K8S Docker搭建RocketMQ Dledger高可用集群

news2024/10/1 7:42:36

本篇文章回顾在华润基于K8S和Docker云设施搭建初步高可用具备failover的RocketMQ集群。RocketMQ版本是5.0.0。

目前现状

采用Dledger模式部署集群,3台namesrv,3台broker,namesrv每台1g的Docker部署,broker每台2g的Docker部署。测试以及生产实践在master发生故障或掉线时,broker集群可以选主出新的master。

RocketMQ集群的几种模式

首先我们看有几种集群的部署模式。官网文档对于模式这块的部署讲述的有点模糊,特别对dledger和controller模式之间的关系基本上没有讲,都是靠网上自己学习资料思考去理解。我说下我的理解,基本上就是以下3种模式。

master-slave模式

其中master-slave是最基本的集群,可以单master,多master,多master-slave,这样提供了水平扩展能力,解决高TPS和高QPS的能力。但是最主要缺陷是master挂了,slave没办法接替其角色继续写入消息,只能给consumer提供消费消息能力,相当于3master的集群,现在变成2master的负载能力。

Dledger模式

那么在此基础上增加了Dledger模式,就是让master-slave组具备自动failover的能力。这个模式会在broker之间建立通信,通过raft协议选出master剩余2个broker节点为其slave。master通过配置可以同步或异步地向slave发送消息。在master宕机后自动选出一个新master。因为基于raft协议所以最低需要3个节点才能进行failover的选主过程,在只有2个节点时不能完成此过程。

controller模式

controller模式是rmq在5.0版本后新推出的一种高可用集群模式。DLedger(Raft)能力从原本的复制链路上移到controller,将选主切换能力上移,单独作为一个选主组件。RIP-44提出增加一个DLedgerControlller的选主组件,它是可选部署的,在无切换架构的基础上,部署后经过配置就可以拥有切换的能力,它可以内嵌在Nameserver中,也可以独立部署。如果内嵌在NameServer中,NameServer本身的能力还是无状态的,比如有三个NameServer都内嵌部署了DLedger Controller,如果宕机两个节点,NameServer仍然存在一个可以提供路由服务,DLedger Controller宕机两个节点后由于达不到Raft多数派的要求无法再协助Broker切换,但是消息集群本身正常的收发服务不会受到影响。

RocketMQ Dledger集群搭建方案

最终在部署模式上我选择了Dledger模式部署。相对master-slave组有failover能力。相对controller模式部署更简单。

编写broker配置

首先需要编写broker配置文件。我们需要修改conf/dledger/broker.conf配置文件。将这份文件copy3份出来,命名为broker0.conf、broker1.conf、broker2.conf。这3份broker文件基本都一致,brokerRole都配置为master,让其自主选出master。只是在brokerIP、dLegerSelfId上有不同。

# 所属集群名称
brokerClusterName = CpmsCluster
#broker名称,master和slave使用相同的名称,表明他们的主从关系
brokerName = brokerA
#表示几点做消息删除动作,默认是凌晨4点
deleteWhen = 04
#在磁盘上保留消息的时长,单位是小时
fileReservedTime = 48
# 这里的ip是此broker部署的节点IP,因为是K8S上部署,所以是一个内网可以解析为IP的工作负载名称
brokerIP1 = rmq-brokerA0
# namesrv也是K8S上内网工作负载
namesrvAddr=rmq-nameserv0:9876;rmq-nameserv1:9876;rmq-nameserv2:9876
#Broker 对外服务的监听端口
listenPort = 30911
# 配置为一个异步复制的master
brokerRole=ASYNC_MASTER
# 消息同步刷盘
flushDiskType=SYNC_FLUSH

#存储路径
storePathRootDir=/rmq/store
#commitLog存储路径
storePathCommitLog=/rmq/store/commitlog
#消费队列存储路径
storePathConsumeQueue=/rmq/store/consumequeue
#索引存储路径
storePathIndex=/rmq/store/index
#checkpoint文件存储路径
storeCheckpoint=/rmq/store/checkpoint
#abort文件存储路径
abortFile=/rmq/store/abort

# 开启Dledger集群
enableDLegerCommitLog=true
# DLedger Raft Group的名字,建议和 brokerName 保持一致
dLegerGroup=brokerA
# 集群内所有broker节点的IP
dLegerPeers=n0-rmq-brokerA0:40911;n1-rmq-brokerA1:40912;n2-rmq-brokerA2:40913
# 节点 id, 必须属于 dLegerPeers 中的一个;同 Group 内各个节点要唯一
dLegerSelfId=n0
# 发送线程个数,建议配置成 Cpu 核数
sendMessageThreadPoolNums=4

编写dockerfile

在3份broker配置准备好后,就可以编写打包namesrv和broker的dockerfile了。这需要一些dockerfile知识。首先编写namesrv。

# 这里指定镜像的适用平台和基础镜像
FROM --platform=linux/amd64 openjdk:8-jdk-alpine3.9

# 容器中建一个目录
RUN mkdir -p /rmq
# 将当前工作目录定到opt
WORKDIR /rmq
# 把宿主机Dockerfile下的文件拷贝到容器/opt/rocketmq
COPY . /rmq
RUN mkdir -p /rmq/logs
RUN echo "Asia/Shanghai" > /etc/timezone

CMD nohup sh ./bin/mqnamesrv

我这里是直接准备好3份dockerfile以方便打包3个broker镜像。有了3个broker镜像,我直接在K8S上部署这3个工作负载就行嘞。这3个dockerfile都基本一致,只不过在最后CMD启动时传的分别是broker-n0.conf,n1,n2等文件。

FROM --platform=linux/amd64 openjdk:8-jdk-alpine3.9

# 容器中建一个目录
RUN mkdir -p /rmq
# 将当前工作目录定到opt
WORKDIR /rmq
# 把宿主机Dockerfile下的文件拷贝到容器/rmq
COPY . /rmq
RUN mkdir -p /rmq/logs
RUN echo "Asia/Shanghai" > /etc/timezone

# 将容器中指定目录挂载到宿主机匿名卷(没有指定宿主机的指定目录就是匿名卷)。双方目录不存在都会自动创建,且目录下的所有文件都持久化
VOLUME ["/rmq/store","/rmq/logs"]
# ${}取环境变量,可以在docker run -e传入
CMD sh /rmq/bin/mqbroker -c conf/dledger/broker-n0.conf

打包镜像上华润云

现在我们准备好了broker配置和dockerfile,根据线上宿主机的实际配置要调整下namesrv和broker的内存大小(部门预算有限,要省着点花)。

修改runserver.sh的jvm内存参数,调整到合适的大小,估计1g就够了

JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m"

修改runbroker.sh的jvm内存参数

JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g" JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=10 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0"

然后把3个broker镜像和namesrv镜像打包出来了。在K8S中建立3个broker0、1、2的工作负载,namesrv工作负载。

踩得坑

对于broker和namesrv要在K8S上建工作负载时开放指定的端口,否则集群会无法互相通信。其中nameserv要开的端口有:9876。broker在集群模式下端口比较奇怪,listenPort是配置文件中指定的,如30911,还有集群内节点通信的端口40911。此外还有一个端口30909。这个端口不知道干嘛的,但是看其它两个broker的端口分别是30919、30929。好像是各自broker的listenPort-2。所以也都开放了。不开放的话,rmq-dashboard在连接broker时会报错提示。

压测和上线情况

压测方法

  • 编写生产者&消费者程序,多线程并发地发送消息给MQ,同时消费者消费消息。指定并发线程数和消息总数。完整的走了一遍发送消息->存储消息->消费消息的链路。更贴近真实线上业务场景。
  • 官方自带的压测脚本,省去自己编写脚本的工作,走了一遍发送消息->存储消息链路。

目前我们主要对broker集群存储消息的性能做测试,所以选择了第2种方法更加省时省力测试。

 压测场景

并发线程10,50万消息,每个消息512字节

从监控master所在201机器上看CPU、内存、磁盘IO、带宽,基本都处于较低资源使用水平。cpu不到30%,内存基本无变化,磁盘IOPS在400,都比较健康。TPS达到1700左右,最大RT246ms,50万消息10个线程并发耗时2分30秒发送完毕。

并发线程20,100万消息,512字节

cpu使用率比并发10稍高,峰值50%左右。内存平稳。iops稳定600左右。

gc情况良好,没有fgc,基本对象在ygc回收完毕。但是年轻代随着并发量增加,内存使用增加的比并发10要快很多,ygc频率增加,但是每次ygc时间很短。 

并发线程数增加后,吞吐量也增加,还没到拐点。TPS 5700,最大RT 360ms,平均 4ms。3分钟发完。

经过以上压测得出压测报告,TPS达到近6000的消息发送,且最大RT360ms,(实际业务中因为producer发消息给broker,有网络IO,所以这个TPS和RT会高一点)完全可以应付我们的日常业务需求。因此我们只用了3台namesrv每个实例1G,3台broker每个实例2G,小成本机器就搭建了一套初步高可用的线上MQ集群。 目前这套集群在华润万象生活的业务生产中每天收发100万左右的消息,集群状态平稳。

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

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

相关文章

Hyper-V创建虚拟机安装OpenEulerOS

文章目录 下载OpenEulerHyper-V创建虚拟机 下载OpenEuler 进入官网下载,我选择的是 openEuler 24.03 LTS ,选择第一个版本即可: Hyper-V创建虚拟机 点击新建->虚拟机: 点击下一步: 输入虚拟机名称&#xff0c…

AMD Product Specifications - AMD 产品规格汇总

AMD Product Specifications - AMD 产品规格汇总 1. Desktop, Laptop and Workstation Processor Specifications (台式处理器、笔记本电脑处理器和工作站处理器规格)2. Server Processor Specifications (服务器处理器规格)3. Embedded Processor Specifications (嵌入式处理器…

element-ui表格1.0.0.1,表格的属性

前言:基于vue2element-ui的理论转实践的使用 第一组:数据显示 利用v-bind:data在table绑定数据源,将数据利用prop的属性传入到table-column,渲染到表格中 正片开始 首先,常用的属性(作者常用&#xff09…

书生大模型_InternLM + LlamaIndex RAG 实践

1.任务要求 基于 LlamaIndex 构建自己的 RAG 知识库,寻找一个问题 A 在使用 LlamaIndex 之前InternLM2-Chat-1.8B模型不会回答,借助 LlamaIndex 后 InternLM2-Chat-1.8B 模型具备回答 A 的能力,截图保存。 来源: https://github.…

鸿蒙媒体开发【媒体会话-提供方】音频和视频

媒体会话-提供方 介绍 本示例主要展示了媒体会话(媒体提供方)的相关功能,使用ohos.multimedia.avsession等接口实现媒体提供方与媒体播控中心自定义信息的交互功能。 注意: 此示例仅展示媒体提供方的相关功能,如果需…

2024 年华数杯全国大学生数学建模竞赛C 题 老外游中国 完整成品文章分享

最近,“city 不 city”这一网络流行语在外国网红的推动下备受关注。随着我国过境免签政策的落实,越来越多外国游客来到中国,通过网络平台展示他们在华旅行的见闻,这不仅推动了中国旅游业的发展,更是在国际舞台上展现了…

大模型学习笔记 - LLM 解码与部署

LLM 解码与部署 LLM 解码与部署 1. 解码策略 1.1 背景 1.1 贪心搜所1.2 概率采样 1.2 贪心搜所改进 1.2.1 束搜索 (保留前n个高概率的句子,最终选取整体概率高的生成)1.2.2 长度惩罚 (估计生成更长句子)1.2.3 重复惩罚…

stm32入门-----硬件I2C读写MPU6050

目录 前言 一、stm32中I2C库函数介绍(stm32f10x_i2c.h) 1.初始化 2.使能操作 3.生成起始位和结束位标志 4.发送I2C从机地址 5.发送数据和接收数据 6.发送应答位 7.状态检测 二、硬件I2C读取MPU6050 1.电路连线图 2.主要工程文件 3.MPU6050.…

WordPress网站被入侵,劫持收录事件分析

7.15,网站被入侵,但是直到7月17日,我才发现被入侵。 16日,17日正常更新文章,17日查询网站收录数据时,在站长资源平台【流量与关键词】查询上,我发现了比较奇怪的关键词。 乱码关键词排名 起初…

案例分享:如何使用原生的NodeJs下载视频网站上的视频资源到本地生成MP4文件

如何使用原生的NodeJs下载视频网站上的视频资源到本地生成MP4文件 1、当下视频网站的视频资源无法通过常规手段下载的原因2、什么是M3U8是什么视频文件?3、如何下载M3U8文件中的TS文件并在本地合并为MP4文件?3.1 FFmpeg 是什么工具?3.2 安装 FFmpeg 工具3.3 使用 FFmpeg 工具…

每天五分钟深度学习:向量化方式完成逻辑回归模型的参数更新

本文重点 上一节课程中,我们学习了m个样本的前向传播的向量化,我们可以同时完成m个样本的前向传播,也就是m个样本z的计算,然后a的计算。本节课程我们将学习dw和db参数更新的向量化,最终得到整个逻辑回归算法的参数更新的向量化表示。 非向量化的逻辑回归梯度下降算法 如…

学习日志8.4--DHCP攻击防范

目录 DHCP饿死攻击 DHCP Sever仿冒攻击 DHCP攻击防范 DHCP动态主机配置协议,是给主机提供自动获取IP地址等配置信息的服务。在主机对DHCP服务器发送DHCP Discover请求之后,服务器回复offer,主机再回复request,最后服务器回复AC…

uni-app开发打包成H5部署到服务器

1. 点击发行 2. 点击进入manifest.json的h5配置里,根据自己的情况配置一些信息。一定要注意配置 “运行的基础路径”,如果出现空白页面或者静态文件404的情况,可能是因为这个路径没有配置好。 3. 填写域名 4. 点击发行后,控制台后…

如何让左右两个div各占50%,并且高度相同?

如何设置两个div各占一半,并且高度随着内容增加,而且两边div的高度一致呢?默认会发现高度不一致,改用flex就可以了,另外发现传统的table也可以轻易实现。不知道不用flex的话是否可以实现。 方法1(div实现&a…

二分+dp,CF 1993D - Med-imize

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 D - Med-imize 二、解题报告 1、思路分析 对于n < k的情况直接排序就行 对于n > k的情况 最终的序列长度一定是 (n - 1) % k 1 这个序列是原数组的一个子序列 对于该序列的第一个元素&#xff0…

Spring中使用Async进行异步功能开发实战-以大文件上传为例

目录 前言 一、场景再现 1、Event的同步机制 二、性能优化 1、异步支持配置 2、自定义处理线程池扩展 3、将线程池配置类绑定到异步方法 三、总结 前言 在之前的博客中&#xff0c;曾将讲了在SpringBoot中如何使用Event来进行大文件上传的解耦&#xff0c;原文地址&…

算法回忆录(2)

6.输入一个非递减排列的整数数组nums,和一个目标值target。请找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值target,则输出0&#xff0c;0。请设计一个时间复杂度为0(log n)的算法解决此问题。 输入包括两行&#xff0c;第一行输入两个整数&#xff0c…

【电路笔记】-偏置晶体管

偏置晶体管 文章目录 偏置晶体管1、概述2、共发射极晶体管偏置3、集极反馈偏置4、双反馈晶体管偏置5、发射极反馈配置6、分压器晶体管偏置晶体管偏置是将晶体管直流工作电压或电流条件设置为正确电平的过程,以便晶体管可以正确放大任何交流输入信号 1、概述 双极晶体管的稳态…

DBA | 炼气期,关系数据库及六大范式(NF)理论概述!

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 前言简述 描述&#xff1a;上一章&#xff0c;我们简单了解了关系类型数据库&#xff0c;以及其相关产品&#xff0c;此章节我们由浅入深的学习一下什么是关系型数据库&#xff0c;不过在讲解关系…

中国县城建设统计年鉴(2015-2022年)

数据年限&#xff1a;2015-2022年&#xff0c;年鉴时间即为数据时间 数据格式&#xff1a;pdfexcel 数据内容&#xff1a; 共分12个部分&#xff0c; 包括县城市政公用设施水平&#xff08;人口密度/人均日生活用水量/供水普及率/燃气普及率/人均道路面积/建成区路网密度/污水处…