RocketMQ集群搭建,看完这篇文章你就懂了(基于2m-2s-async模式)

news2024/12/27 9:30:59

前言

上一篇初步认识了RocketMQ,这一篇文章我们简单来搭建一个RocketMQ集群。RocketMQ支持多种集群部署模式,其中最常用的是多主多从的异步复制模式(2m代表两个master,2s代表两个slave,async代表异步刷盘的机制)。今天我们就以这种方式来 搭建。

本篇文章除了集群的搭建,也适合面试使用,在这里希望能帮助到各位正在学习RocketMQ的小伙伴儿们!

在这里插入图片描述

一、集群架构

上一篇文章我们介绍了RocketMQ的四大组件,这里我们再重述一下这几个核心集群组件:

  1. NameServer集群:负责管理整个RocketMQ集群的路由信息。生产者和消费者在启动时会向NameServer注册自己的信息,并从NameServer获取路由信息,以便能够找到相应的Broker。
  2. Broker集群:负责存储和转发消息,提供负载均衡和故障转移功能。每个Broker都有一个独立的NameServer实例,用于与NameServer通信。Broker分为Master Broker和Slave Broker,Master Broker负责写入消息,而Slave Broker负责备份Master Broker的数据,这样的主从结构保证了消息的高可用性。
  3. 生产者集群:负责向Broker投递消息,提供负载均衡和故障转移功能。生产者通过连接到NameServer获取队列的元数据信息,然后把消息发送到指定的队列中。
  4. 消费者集群:负责从Broker中拉取消息并进行处理,提供负载均衡和故障转移功能。消费者通过连接到NameServer获取队列的元数据信息,然后从指定的队列中拉取消息。

在这里插入图片描述

RocketMQ集群模式

RocketMQ官方为我们提供了几个集群模式,包括2m-2s-async,2m-2s-sync,2m-noslave等,这些文件都在conf目录下,接下来我们先介绍一下这几种集群模式。

在这里插入图片描述

2m-2s-async(多Master多Slave异步复制模式)

RocketMQ官方文档2m-2s-async模式的特点:

  • 每个Master配置一个Slave,形成多对Master-Slave组合。

  • 高可用,采用异步复制方式,Master在接收到消息后,会立即向应用返回成功标识,随后异步地将消息复制到Slave。

  • 主备之间有短暂的消息延迟,通常是毫秒级别。

2m-2s-async模式的优点

  • 即使磁盘损坏,丢失的消息也非常少。
  • 消息的实时性不受影响,因为Master宕机后,消费者仍然可以从Slave消费
  • 性能与多个Master模式几乎一样。

2m-2s-sync(多Master多Slave同步复制模式)

RocketMQ官方文档2m-2s-sync模式的特点:

  1. 每个Master配置一个Slave,形成多对Master-Slave组合。
  2. 用同步双写模式,意思就是消息需要同时写入Master和Slave,都写成功后才向应用返回成功。

2m-2s-sync模式的优缺点:

  • 数据和服务都没有单点故障,Master宕机的情况下,消息无延迟,服务可用性与数据可用性都非常高。

  • 但是相比异步复制模式,性能会略低

2m-noslave(多Master无Slave模式)

RocketMQ官方文档2m-noslave模式的特点:

集群中全部为Master节点,没有Slave节点。

2m-noslave模式下的优缺点

  • 配置相对简单,毕竟没有从节点嘛。

  • 单个Master宕机或重启对应用没有影响。

  • 性能最高,因为所有节点都直接参与消息的处理

  • 存在单点故障风险,虽然可以通过RAID这些技术减少磁盘故障的影响,但是整个节点故障时仍然会导致消息处理中断。

  • 单个Broker宕机期间,如果这个节点上未被消费的消息在服务器恢复之前不可订阅,消息实时性会受到影响。

环境准备

软件环境 操作系统:CentOS 7
JDK版本:1.8
RocketMQ版本:4.7.1(以最新版本为准,但步骤类似)

IP地址分配:

服务器服务器IPNameServerbroker部署节点
服务器0192.168.220.134192.168.220.134:9876
服务器1192.168.220.136192.168.220.136:9876broker-a(master),broker-b-s(slave)
服务器2192.168.220.135192.168.220.135:9876broker-b(master),broker-a-s(slave)

这里可能会有小伙伴儿有疑问,为何这样分配broker?

之所以把broker-a(master)和broker-a-s(slave) 分配到不同的服务器上,这是因为当一个服务器挂掉后,另一个服务器上的a或者b节点仍然能够继续工作(a和b两个主节点,其中a-s代表a的从节点,b-s代表b的从节点
)!

2m-2s-async模式集群搭建

首先我们先克隆出来两个服务器,这两个服务器的IP不同,一个IP为192.168.220.136,另一个IP为192.168.220.135

在这里插入图片描述

启动nameserver

然后启动三台服务器的nameserver,nameserver是⼀个轻量级的注册中心,broker把自己的信息注册到nameserver上。而且,nameserver是⽆状态的,直接启动即可。三台nameserver之间不需要通信,而是被请求⽅来关联三台nameserver的地址。

在启动这三台服务器之前,需要修改三台服务器的的runserver.sh⽂件,和上一篇文章一样,修改JVM内存默认的4g为512m。

vim runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

然后在每台服务器的bin⽬录下执⾏如下命令:
服务器0: nohup ./mqnamesrv -n 192.168.220.134:9876 &
服务器1: nohup ./mqnamesrv -n 192.168.220.135:9876 &
服务器2: nohup ./mqnamesrv -n 192.168.220.136:9876 &

配置broker

前提:broker-a,broker-b-s这两台broker是配置在服务器1上,broker-b,broker-a-s这两台broker是配置在服务器2上。这两对主从节点在不同的服务器上,服务器0上没有部署broker。

首先在启动之前,我们需要修改每一台broker的配置⽂件。这里需要注意,同⼀台服务器上的两个broker保存路径不能⼀样。
首先修改broker-a的master节点

在服务器1上,进入到conf/2m-2s-async文件夹内,修改broker-a.properties文件。

broker-a的master节点

# 所属集群名称
brokerClusterName=DefaultCluster
# broker名字
brokerName=broker-a
# broker所在服务器的ip
brokerIP1=192.168.220.136
# broker的id,0表示master,>0表示slave
brokerId=0
# 删除⽂件时间点,默认在凌晨4点
deleteWhen=04
# ⽂件保留时间为48⼩时
fileReservedTime=48
# broker的⻆⾊为master
brokerRole=ASYNC_MASTER
# 使⽤异步刷盘的⽅式
flushDiskType=ASYNC_FLUSH
# 名称服务器的地址列表
namesrvAddr=192.168.220.136:9876; 192.168.220.134:9876; 192.168.220.135:9876
# 在发送消息⾃动创建不存在的topic时,默认创建的队列数为4个
defaultTopicQueueNums=4
# 是否允许 Broker ⾃动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
# 是否允许 Broker ⾃动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true 
# broker对外服务的监听端⼝
listenPort=10911
# abort⽂件存储路径
abortFile=/usr/local/src/rocketmq-all-4.7.1-bin-release/store/abort
# 消息存储路径
storePathRootDir=/usr/local/src/rocketmq-all-4.7.1-bin-release/store
# commitLog存储路径
storePathCommitLog=/usr/local/src/rocketmq-all-4.7.1-bin-release/store/commitlog
# 消费队列存储路径
storePathConsumeQueue=/usr/local/src/rocketmq-all-4.7.1-bin- release/store/consumequeue 
# 消息索引存储路径
storePathIndex= /usr/local/src/rocketmq-all-4.7.1-bin-release/store/index 
# checkpoint⽂件存储路径
storeCheckpoint= /usr/local/src/rocketmq-all-4.7.1-bin-release/store/checkpoint
# 限制的消息⼤⼩
maxMessageSize=65536
# commitLog每个⽂件的⼤⼩默认1G
mapedFileSizeCommitLog=1073741824
# ConsumeQueue每个⽂件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000

同样在服务器2上,进⼊到conf/2m-2s-async⽂件夹内,修改broker-b-s.properties文件。

broker-b-s.properties

brokerClusterName=DefaultCluster
brokerName=broker-b
brokerIP1=192.168.220.136
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
namesrvAddr=192.168.220.136:9876; 192.168.220.134:9876; 192.168.220.135:9876
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
listenPort=11011
abortFile=/usr/local/src/rocketmq-all-4.7.1-bin-release/store-slave/abort
storePathRootDir=/usr/local/src/rocketmq-all-4.7.1-bin-release/store-slave
storePathCommitLog=/usr/local/src/rocketmq-all-4.7.1-bin-release/store-slave/commitlog
storePathConsumeQueue=/usr/local/src/rocketmq-all-4.7.1-bin-release/store-slave/consumequeue
storePathIndex=/usr/local/src/rocketmq-all-4.7.1-bin-release/store-slave/index
storeCheckpoint=/usr/local/src/rocketmq-all-4.7.1-bin-release/store-slave/checkpoint
maxMessageSize=65536

然后在服务器3上,进⼊到conf/2m-2s-async文件夹内,修改broker-a-s.properties文件

brokerClusterName=DefaultCluster
brokerName=broker-a
brokerIP1=192.168.220.135
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
namesrvAddr=192.168.220.135:9876; 192.168.220.136:9876; 192.168.220.134:9876
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
listenPort=11011
abortFile=/usr/local/src/rocketmq-all-4.7.1-bin-release/store-slave/abort
storePathRootDir=/usr/local/src/rocketmq-all-4.7.1-bin-release/store-slave
storePathCommitLog=/usr/local/src/rocketmq-all-4.7.1-bin-release/store-slave/commitlog
storePathConsumeQueue=/usr/local/src/rocketmq-all-4.7.1-bin-release/store-slave/consumequeue
storePathIndex=/usr/local/src/rocketmq-all-4.7.1-bin-release/store-slave/index
storeCheckpoint=/usr/local/src/rocketmq-all-4.7.1-bin-release/store-slave/checkpoint
maxMessageSize=65536

最后在服务器3上,进⼊到conf/2m-2s-async文件夹内,修改broker-b.properties文件

broker-b.properties节点

brokerClusterName=DefaultCluster
brokerName=broker-b
brokerIP1=192.168.220.135
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
namesrvAddr=192.168.220.135:9876; 192.168.220.136:9876; 192.168.220.134:9876
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
listenPort=10911
abortFile=/usr/local/src/rocketmq-all-4.7.1-bin-release/store/abort
storePathRootDir=/usr/local/src/rocketmq-all-4.7.1-bin-release/store
storePathCommitLog=/usr/local/src/rocketmq-all-4.7.1-bin-release/store/commitlog
storePathConsumeQueue=/usr/local/src/rocketmq-all-4.7.1-bin-release/store/consumequeue
storePathIndex=/usr/local/src/rocketmq-all-4.7.1-bin-release/store/index
storeCheckpoint=/usr/local/src/rocketmq-all-4.7.1-bin-release/store/checkpoint
maxMessageSize=65536

这些配置文件修改完成后,还需要修改服务器2和服务器3的runbroker.sh文件(需要cd bin)进入到bin目录:修改JVM内存默认的8g为512m。

cd bin
vim runbroker.sh

将文件上面的配置修改为512m

JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m"

启动broker

在服务器2中启动broker-a(master)和broker-b-s(slave)

nohup./mqbroker -c /usr/local/src/rocketmq-all-4.7.1-bin-release/conf/2m-2s-async/broker-a.properties & autoCreateTopicEnable=true 
nohup./mqbroker -c /usr/local/src/rocketmq-all-4.7.1-bin-release/conf/2m-2s-async/broker-b-s.properties & autoCreateTopicEnable=true 

输入完成后可以使用cat nohup.out命令查看结果:
在这里插入图片描述

在服务器3中启动broker-b(master),broker-a-s(slave)

nohup./mqbroker -c /usr/local/src/rocketmq-all-4.7.1-bin-release/conf/2m-2s-async/broker-b.properties & autoCreateTopicEnable=true 
nohup./mqbroker -c /usr/local/src/rocketmq-all-4.7.1-bin-release/conf/2m-2s-async/broker-a-s.properties & autoCreateTopicEnable=true 

输入完成后同样可以使用cat nohup.out命令查看结果:

在这里插入图片描述

验证RocketMQ集群

我们可以和上一篇文章一样,使用RocketMQ提供的tools⼯具验证集群是否正常工作。
首先,我们在服务器2上配置环境变量,这个用于被tools中的⽣产者和消费者程序读取该变量。

export NAMESRV_ADDR='192.168.220.134:9876;192.168.220.135:9876;192.168.220.136:9876'

然后使用工具启动⽣产者:

./tools.sh org.apache.rocketmq.example.quickstart.Producer

在这里插入图片描述
从图中我们可以看到每一个broker中确实有四个队列在工作,而且消息的发送均为OK状态!

最后使用工具启动消费者:

./tools.sh org.apache.rocketmq.example.quickstart.Consumer

在这里插入图片描述

最后在图里也有看到消息都被消费者消费完成。

本篇文章到这里就结束了,后续会继续分享RocketMQ相关的知识,感谢各位小伙伴们的支持!

在这里插入图片描述

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

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

相关文章

数据结构 - AVL树

文章目录 一、AVL树的介绍二、AVL树的实现1、基本框架2、查找3、插入4、删除5、测试6、总代码 三、AVL树的性能 一、AVL树的介绍 1、概念 AVL树(Adelson-Velsky and Landis Tree)是一种自平衡的二叉搜索树。它得名于其发明者G. M. Adelson-Velsky和E. M…

广东工程职业技术学院财经学院领导一行莅临泰迪智能科技参观交流

7月19日,广东工程职业技术学院财经学院市场调查与统计分析专业主任苏志鹏、专业老师余乐莅临广东泰迪智能科技股份有限公司产教融合实训基地参观交流。泰迪智能科技董事长张良均、副总经理施兴、高校业务部经理孙学镂、校企合作经理吴桂锋进行接待。 仪式伊始&#…

保持形态真实性的大脑生成建模| 文献速递-基于人工智能(AI base)的医学影像研究与疾病诊断

Title 题目 Realistic morphology-preserving generative modelling of the brain 保持形态真实性的大脑生成建模 01 文献速递介绍 医学影像研究通常受到数据稀缺和可用性的限制。治理、隐私问题和获取成本都限制了医学影像数据的访问,加上深度学习算法对数据的…

苍穹外卖(一)之环境搭建篇

Ngnix启动一闪而退 启动之前需要确保ngnix.exe的目录中没有中文字体,在conf目录下的nginx.conf文件查看ngnix的端口号,一般默认为80,若80端口被占用就会出现闪退现象。我们可以通过logs/error.log查看错误信息,错误信息如下&…

k8s+containerd(kvm版)

k8s(Kubernetes)是由Gogle开源的容器编排引擎,可以用来管理容器化的应用程序和服务,k 高可用:系统在长时间内持续正常地运行,并不会因为某一个组件或者服务的故障而导致整个系统不可用可扩展性&#xff1a…

freesql简单使用操作mysql数据库

参考:freesql中文官网指南 | FreeSql 官方文档 这两天准备做一个测试程序,往一个系统的数据表插入一批模拟设备数据,然后还要模拟设备终端发送数据包,看看系统的承压能力。 因为系统使用的第三方框架中用到了freesql&#xff0c…

【数据结构】包装类、初识泛型

🎇🎉🎉🎉点进来你就是我的人了 博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友…

在windows上使用Docker部署一个简易的web程序

使用Docker部署一个python的web服务🚀 由于是从事算法相关工作,之前在项目中,需要将写完的代码服务,部署在docker上,以此是开始接触了Docker这个工具,由于之前也没系统学习过,之后应该可能还会用…

[240724] Meta 发布全新大语言模型 Llama 3.1 | Apple 开源全新 AI 模型,打造高效 AI 生态

目录 Meta 发布全新发语言模型 Llama 3.1Apple 开源全新 AI 模型,挑战 Meta,打造高效 AI 生态 Meta 发布全新发语言模型 Llama 3.1 Llama 3.1 提供 8B、70B 和 405B 三种参数规模,其中 405B 版本在通用知识、可控性、数学、工具使用和多语 言…

Python鲁汶意外莱顿复杂图拓扑分解算法

🎯要点 🎯算法池化和最佳分区搜索:🖊网格搜索 | 🖊发现算法池 | 🖊返回指定图的最佳划分 | 🖊返回指定图的最佳分区 | 🎯适应度和聚类比较功能:🖊图的划分 |…

django电商用户消费数据分析系统-计算机毕业设计源码20891

摘 要 随着电子商务的快速发展,电商平台积累了大量的用户消费数据。为了更好地理解用户行为、优化商品结构和提升用户体验,本文设计并实现了一个基于Django框架的电商用户消费数据分析系统。 该系统包含后台首页、系统用户(管理员&#xf…

探索 GPT-4o mini:成本效益与创新的双重驱动

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

elk日志索引被锁blocks,日志无法写入

现象: kafka积压,logstash无法将日志写入到es logstash报错: [logstash.outputs.elasticsearch][main][] Retrying failed action {:status>403 :error>{“type”>“cluster_block_exception”, “reason”>“index [] blocked …

“微软蓝屏”全球宕机,敲响基础软件自主可控警钟

上周五,“微软蓝屏”“感谢微软 喜提假期”等词条冲上热搜,全球百万打工人受此影响,共同见证这一历史性事件。据微软方面发布消息称,旗下Microsoft 365系列服务出现访问中断。随后在全球范围内,包括企业、政府、个人在…

Spring Boot集成starrocks快速入门Demo

1.什么是starrocks? StarRocks 是新一代极速全场景 MPP (Massively Parallel Processing) 数据库。StarRocks 的愿景是能够让用户的数据分析变得更加简单和敏捷。用户无需经过复杂的预处理,就可以用 StarRocks 来支持多种数据分析场景的极速分析。 Star…

矩阵分析——线性积分方程组的矩阵解法研究

矩阵分析——线性积分方程组的矩阵解法研究 前言线性积分方程组的矩阵解法研究 前言 “矩阵分析”是一门选修课,当时选这门课程的原因是想着图像处理就涉及到很多矩阵运算。但没想到的是这门课程吧虽然是选修,最后的结课要求是让我们写一篇“论文”&…

第19讲EtherNet/IP网络基础

EtherNet/IP网络知识 一、EtherNet/IP概述 二、EtherNet/IP网络的定位 1、最上层-信息层:主要进行上位机网络信号交互或者控制层信号的传递。 比较常见的话是工控机或者说PLC,就像大脑对信息进行发送的这样一个控制。 EtherNet/IP网络属于最高层——信息层,主要负责信号的…

vue3中父子组件通讯

在子组件HelloWorld.vue中&#xff1a; <template><div class"hello">111111</div></template><script lang"ts"> import { Options, Vue } from vue-class-component;Options({props: {msg: String} }) export default cl…

多路复用IO、TCP并发模型

时分复用 CPU单核在同一时刻只能做一件事情&#xff0c;一种解决办法是对CPU进行时分复用(多个事件流将CPU切割成多个时间片&#xff0c;不同事件流的时间片交替进行)。在计算机系统中&#xff0c;我们用线程或者进程来表示一条执行流&#xff0c;通过不同的线程或进程在操作系…

群辉NAS利用AList搭建混合云盘①套件安装及百度云盘挂载

目录 一、群辉NAS准备 二、远程访问 三、安装套件 四、挂载公有云盘 1、挂载百度网盘 ……(未完待续) 公有云盘是由云服务提供商运营,向广大用户提供数据存储和文件共享服务的一种在线存储解决方案。 其优点包括: 1. 方便易用:用户可以通过互联网随时随地访问自己存…