CentOS7 Docker安装RocketMQ5.2.0(集群版)

CentOS 运维避坑实战

CentOS7.9 安装 Python3.8.16 后 yum 报错,快速修复方案

参考:

【RocketMQ高可用】RocketMQ 双主双从集群搭建_使用docker 部署rocketmq 双主双从同步-CSDN博客

Rocketmq-5.3.0和对应dashboard的最新版本Docker镜像,本人亲自制作,部署十分方便,奉献给大家_rocketmq最新版本-CSDN博客

集群架构

描述
NameServer 集群NameServer 是一个无状态的节点,可集群部署,节点都是各自独立的,无任何信息同步
Broker 集群

① Broker 分为 Master 与 Slave,一个 Master 可以对应多个 Slave,但一个 Slave 只能对应一 个Master

② Master 与 Slave 的对应关系通过制定相同的 BrokerName,不同的 BrokerID 来定义,id 为 0 表示 Master, 非 0 表示 Slave

③ 可以部署多个 Master 实现 Broker 集群,即多组 Master - Slaves 的 Broker 节点

④ Master 通常用于写入数据,Slaves 用于读取数据

⑤ 每个 Broker 与 NameServer 集群中的所有节点建立长连接,定时注册 Topic 信息到所有 NameServer

Producer 集群

① Producer 为消息的生产者,都是各自独立的无状态的节点,可以认为只要向 mq 中推送消息的节点都算作 Producer 节点。

② Producer 节点与 NameServer 集群中的随机一个节点建立长连接,定期从 NameServer 取出 Topic 路由信息,并向提供 Topic 服务的 Master 建立长连接。且定时向 Master 发送心跳。

Customer 集群

① Customer 为消息的消费者,都是各自独立的无状态的节点,可以认为只要向 mq 中获取消息的节点都算Customer 节点。

② Customer 节点与 NameServer 集群中的随机一个节点建立长连接,定期从 NameServer 取出 Topic 路由信息,向提供 Topic 服务的 Master、Slave 建立长连接。且定时向 Master、Slave 发送心跳。

③ Customer 节点既可以从 Master 订阅消息,也可以从 Slave 订阅消息,订阅规则由 Broker 配置决定

四种集群模式

单 Master 模式

部署简单,但风险较大,一旦 Broker 重启或者宕机时,会导致服务不可用,不建议在线上环境使用,可以在本地测试

多 Master 模式

Broker 集群中无 Slave,全是 Master

优点:

配置简单,且单个 Master 宕机或重启维护对应用无影响,在磁盘配置为 RAID10 时,即使机器宕机不可恢复的情况下,由于 RAID10 磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢),性能最高

缺点:

单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅和消费,消费实时性会受到影响

多 Master 多 Slave 模式(异步)

每个 Master 配置一个 Slave,有多对 Master-Slave,HA 采取异步复制方式,主备有短暂消息延迟(毫秒级)。即提供者将消息发送到 Master 后,Master 即刻返回结果给提供者。同时异步复制到 Slave 中

优点:

即使磁盘损坏,丢失的消息非常少,且消息的实时性不会受到影响。且 Master 宕机后,消费者仍然可以从 Slave 消费,而且此过程对应用透明,不需要人工干预,性能同多 Master 模式几乎一样

缺点:

Master 宕机,磁盘损坏的情况下会丢失少量消息

多 Master 多 Slave 模式(同步)

每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,即只有主备都写成功,才向应用返回成功。即提供者将消息发送到 Master后,Master 要将这条消息同步到所有的 Slave 上,同步全部完成后,才会返回结果给提供者。

优点:

数据与服务都无单点故障,在 Master 宕机的情况下消息无延迟,服务可用性与数据可用性都非常高,消息安全高,高可用性

缺点:

性能比异步复制模式略低(约低10%左右),发送单个消息的RT会略高,且在主节点宕机后,备机不能自动切换为主机,需要人为干涉


双主双从集群搭建

部署方案

相关配置端口如下

IP角色端口号
192.168.10.100namesrv-a9876
192.168.10.101namesrv-b9876
192.168.10.100broker-a10911、10912
192.168.10.101broker-a-s11011
192.168.10.101broker-b10911、10912
192.168.10.100broker-b-s11011

根据自己在 Master 文件中设定的 ListenPort 值,计算需要开放的端口:

broker-a 相关端口

listenPort = 10911 

haListenPort 10911 + 1 = 10912 

fastListenPort 10911 - 2 = 10909

broker-a-s 相关端口

listenPort 11011

相关说明:

listenPort:主服务端口(10911)‌客户端(Producer/Consumer)与Broker通信的核心端口,用于消息发送、拉取等操作‌

haListenPort:HA 高可用端口仅需在主节点配置文件中显式定义,从节点通过主节点的该端口拉取数据 ,若未显式配置haListenPort ,则Broker会自动计算listenPort+1作为同步端口,如listenPort=10911时,同步端口为10912。从节点无需单独配置haListenPort,从节点会自动监听主节点指定的haListenPort进行数据同步

fastListenPort:VIP通道端口(10909,即listenPort-2)‌用于高优先级消息(如事务消息)的快速传输,默认开启但生产环境建议关闭以简化网络策略‌,从节点无需配置
fastListenPort=10909
disableVIPChannel=true  # 推荐关闭

综上所述,主节点配置端口参考

listenPort=10911
haListenPort=10912  # 主从同步端口
fastListenPort=10909  # 可选VIP端口

disableVIPChannel=false  # 默认开启但生产环境建议关闭

从节点配置端口参考

listenPort=11011  # 避免与主节点冲突


这种架构提供了以下优势:

  1. NameServer无单点故障
  2. Broker数据双重备份
  3. 负载均衡能力
  4. 自动故障转移能力

工作流程

  1. 启动NameServer,NameServer起来后监听端口,等待Broker、Producer、Consumer连上来,相当于一个路由控制中心。
  2. Broker启动,跟所有的NameServer保持长连接,定时发送心跳包。心跳包中包含当前Broker信息(IP+端口等)以及存储所有Topic信息。注册成功后,NameServer集群中就有Topic跟Broker的映射关系。
  3. 收发消息前,先创建Topic,创建Topic时需要指定该Topic要存储在哪些Broker上,也可以在发送消息时自动创建Topic。
  4. Producer发送消息,启动时先跟NameServer集群中的其中一台建立长连接,并从NameServer中获取当前发送的Topic存在哪些Broker上,轮询从队列列表中选择一个队列,然后与队列所在的Broker建立长连接从而向Broker发消息。
  5. Consumer跟Producer类似,跟其中一台NameServer建立长连接,获取当前订阅Topic存在哪些Broker上,然后直接跟Broker建立连接通道,开始消费消息。

机器1 namesrv-a

创建在宿主机的日志映射目录,启动

sudo mkdir -p /home/rocketmq/namesrv-a/logs &&
sudo chmod -R 777 /home/rocketmq &&
docker run -d \
  --name namesrv-a \
  --restart=always \
  --network host \
  -p 9876:9876 \
  -v /home/rocketmq/namesrv-a/logs:/home/rocketmq/logs \
  -v /etc/localtime:/etc/localtime:ro \
  -v /etc/timezone:/etc/timezone:ro \
  -e "MAX_POSSIBLE_HEAP=100000000" \
  apache/rocketmq:5.2.0 \
  sh mqnamesrv

验证NameServer启动,The Name Server boot success

docker logs namesrv-a

机器2 namesrv-b

sudo mkdir -p /home/rocketmq/namesrv-b/logs &&
sudo chmod -R 777 /home/rocketmq &&
docker run -d \
  --name namesrv-b \
  --restart=always \
  --network host \
  -p 9876:9876 \
  -v /home/rocketmq/namesrv-b/logs:/home/rocketmq/logs \
  -v /etc/localtime:/etc/localtime:ro \
  -v /etc/timezone:/etc/timezone:ro \
  -e "MAX_POSSIBLE_HEAP=100000000" \
  apache/rocketmq:5.2.0 \
  sh mqnamesrv
docker logs namesrv-b

机器1 broker-a

创建broker配置文件、数据存储路径、日志目录

mkdir -p  /home/rocketmq/broker-a/conf   &&
mkdir -p  /home/rocketmq/broker-a/store  &&
mkdir -p  /home/rocketmq/broker-a/logs   &&
sudo chmod -R 777 /home/rocketmq

修改配置文件

sudo vi /home/rocketmq/broker-a/conf/broker.conf
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = SYNC_MASTER
flushDiskType = SYNC_FLUSH
autoCreateTopicEnable=true
brokerIP1 = 192.168.10.100
namesrvAddr=192.168.10.100:9876;192.168.10.101:9876
listenPort=10911
haListenPort=10912  # 主从同步端口

启动Broker容器:

docker run -d \
  --name broker-a \
  --restart=always \
  --network host \
  -p 10911:10911 -p 10912:10912 \
  -v /home/rocketmq/broker-a/conf/broker.conf:/home/rocketmq/rocketmq-5.2.0/conf/broker.conf \
  -v /home/rocketmq/broker-a/store:/home/rocketmq/store \
  -v /home/rocketmq/broker-a/logs:/home/rocketmq/logs \
  -v /etc/localtime:/etc/localtime:ro \
  -v /etc/timezone:/etc/timezone:ro \
  -e "MAX_POSSIBLE_HEAP=200000000" \
  apache/rocketmq:5.2.0 \
  sh mqbroker -c /home/rocketmq/rocketmq-5.2.0/conf/broker.conf
docker logs broker-a

如果看到"The broker boot success"的日志,说明启动成功。

机器2 broker-a-s

创建broker配置文件、数据存储路径、日志目录

mkdir -p  /home/rocketmq/broker-a-s/conf  &&
mkdir -p  /home/rocketmq/broker-a-s/store &&
mkdir -p  /home/rocketmq/broker-a-s/logs  &&
sudo chmod -R 777 /home/rocketmq

修改配置文件

sudo vi /home/rocketmq/broker-a-s/conf/broker.conf
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 1
brokerRole = SLAVE
brokerIP1 = 192.168.10.101
namesrvAddr=192.168.10.100:9876;192.168.10.101:9876
autoCreateTopicEnable=true
listenPort=11011

启动Broker容器:

docker run -d \
  --name broker-a-s \
  --restart=always \
  --network host \
  -p 11011:11011 \
  -v /home/rocketmq/broker-a-s/conf/broker.conf:/home/rocketmq/rocketmq-5.2.0/conf/broker.conf \
  -v /home/rocketmq/broker-a-s/store:/home/rocketmq/store \
  -v /home/rocketmq/broker-a-s/logs:/home/rocketmq/logs \
  -v /etc/localtime:/etc/localtime:ro \
  -v /etc/timezone:/etc/timezone:ro \
  -e "MAX_POSSIBLE_HEAP=200000000" \
  apache/rocketmq:5.2.0 \
  sh mqbroker -c /home/rocketmq/rocketmq-5.2.0/conf/broker.conf
docker logs broker-a-s

机器2 broker-b

创建broker配置文件、数据存储路径、日志目录

mkdir -p  /home/rocketmq/broker-b/conf   &&
mkdir -p  /home/rocketmq/broker-b/store  &&
mkdir -p  /home/rocketmq/broker-b/logs   &&
sudo chmod -R 777 /home/rocketmq

修改配置文件

sudo vi /home/rocketmq/broker-b/conf/broker.conf
brokerClusterName = DefaultCluster
brokerName = broker-b
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = SYNC_MASTER
flushDiskType = SYNC_FLUSH
autoCreateTopicEnable=true
brokerIP1 = 192.168.10.101
namesrvAddr=192.168.10.100:9876;192.168.10.101:9876
listenPort=10911
haListenPort=10912  # 主从同步端口

启动Broker容器:

docker run -d \
  --name broker-b \
  --restart=always \
  --network host \
  -p 10911:10911 -p 10912:10912 \
  -v /home/rocketmq/broker-b/conf/broker.conf:/home/rocketmq/rocketmq-5.2.0/conf/broker.conf \
  -v /home/rocketmq/broker-b/store:/home/rocketmq/store \
  -v /home/rocketmq/broker-b/logs:/home/rocketmq/logs \
  -v /etc/localtime:/etc/localtime:ro \
  -v /etc/timezone:/etc/timezone:ro \
  -e "MAX_POSSIBLE_HEAP=200000000" \
  apache/rocketmq:5.2.0 \
  sh mqbroker -c /home/rocketmq/rocketmq-5.2.0/conf/broker.conf
docker logs broker-b

机器1 broker-b-s

创建broker配置文件、数据存储路径、日志目录

mkdir -p  /home/rocketmq/broker-b-s/conf  &&
mkdir -p  /home/rocketmq/broker-b-s/store &&
mkdir -p  /home/rocketmq/broker-b-s/logs  &&
sudo chmod -R 777 /home/rocketmq

修改配置文件

sudo vi /home/rocketmq/broker-b-s/conf/broker.conf
brokerClusterName = DefaultCluster
brokerName = broker-b
brokerId = 1
brokerRole = SLAVE
brokerIP1 = 192.168.10.100
namesrvAddr=192.168.10.100:9876;192.168.10.101:9876
autoCreateTopicEnable=true
listenPort=11011

启动Broker容器(注意使用不同的端口):

docker run -d \
  --name broker-b-s \
  --restart=always \
  --network host \
  -p 11011:11011 \
  -v /home/rocketmq/broker-b-s/conf/broker.conf:/home/rocketmq/rocketmq-5.2.0/conf/broker.conf \
  -v /home/rocketmq/broker-b-s/store:/home/rocketmq/store \
  -v /home/rocketmq/broker-b-s/logs:/home/rocketmq/logs \
  -v /etc/localtime:/etc/localtime:ro \
  -v /etc/timezone:/etc/timezone:ro \
  -e "MAX_POSSIBLE_HEAP=200000000" \
  apache/rocketmq:5.2.0 \
  sh mqbroker -c /home/rocketmq/rocketmq-5.2.0/conf/broker.conf
docker logs broker-b-s

Dashboard部署

在任意一台机器上启动Dashboard:

docker run -d --name rmqconsole \
--restart=always \
--network host \
-p 8080:8080 \
-v /home/rocketmq/rmqconsole/data:/tmp/rocketmq-console/data \
-v /etc/localtime:/etc/localtime:ro \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.10.100:9876;192.168.10.101:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false -Drocketmq.config.loginRequired=false" \
apacherocketmq/rocketmq-dashboard:latest

集群验证

查看日志

docker logs -f namesrv-a
docker logs -f namesrv-b
docker logs -f broker-a
docker logs -f broker-a-s
docker logs -f rmqconsole

Dashboard验证

访问http://机器IP:8080 检查集群状态页面应显示:

2个NameServer节点

2个Broker主节点和2个Broker备节点

命令行验证

查看集群状态

docker exec -it namesrv-a sh mqadmin clusterList -n 192.168.10.100:9876

‌查看Broker状态

docker exec -it namesrv-a sh mqadmin brokerStatus -n 192.168.10.100:9876 -b 192.168.10.100:10911

消息测试

机器1生产、消费消息

docker exec -it namesrv-a sh mqadmin sendMessage -n "192.168.10.100:9876;192.168.10.101:9876" -t TestTopic -p "Test message"
docker exec -it namesrv-a sh mqadmin consumeMessage -n "192.168.10.100:9876;192.168.10.101:9876" -t TestTopic -g TestGroup

机器2生产、消费消息

docker exec -it namesrv-b sh mqadmin sendMessage -n "192.168.10.100:9876;192.168.10.101:9876" -t TestTopic -p "Test message"
docker exec -it namesrv-b sh mqadmin consumeMessage -n "192.168.10.100:9876;192.168.10.101:9876" -t TestTopic -g TestGroup

NameServer故障测试‌:

docker stop namesrv-a

Broker主节点故障测试‌:

停止一个主Broker

  1. 验证消息收发是否正常,
  2. 验证备节点是否自动接管
  3. 通过Dashboard观察状态变化
docker stop broker-a

关键配置说明

配置项主节点配置备节点配置说明
brokerRoleSYNC_MASTERSLAVE定义节点角色
brokerId01主节点必须为0,备节点大于0
namesrvAddr两台NameServer地址两台NameServer地址必须包含所有NameServer地址
brokerIP1本机IP本机IP必须正确配置
flushDiskTypeSYNC_FLUSHSYNC_FLUSH建议生产环境使用同步刷盘

部署问题

不能正确显示从节点的同步数

RocketMQ5.1.0主从已同步数据

RocketMQ Dashboard集群界面从节点今日生产数不显示

这是由于dashboard和rocketmq5.1版本以上存在适配问题,目前不知道如何解决,只能将rocketmq降低版本到5.0.0以下,就可以正确显示了,下面是官方解释

https://github.com/apache/rocketmq-dashboard/issues/227

5.0.0的部署可参考我的另一篇

CentOS7 Docker安装RocketMQ5.0.0(集群版)-CSDN博客

CentOS 运维避坑实战

CentOS7.9 安装 Python3.8.16 后 yum 报错,快速修复方案

浩辰CAD看图王(电脑)集快速看图、DWG画图、CAD批注、CAD测量、画图制图于一身,由30年CAD开发背景的浩辰CAD出品的轻量级dwg/dxf图纸览图及编辑的电脑端CAD看图软件。告别为查看CAD图纸安装几百兆的繁杂CAD软件,无需dwg格式转换,矢量图显示放大不失真,完美查看AutoCAD、浩辰CAD、天正建筑等各本的dwg二维和三维CAD图纸,超快速开图、显示准确、操作流畅。 内嵌天正实体解析器,完美显示天正建筑、天正暖通、天正给排水等各专业CAD图纸,不再为丢实体而烦恼,并可对天正各本CAD图纸进行转换,专业的fonts字体解析支持不同字体的正确显示,无需安装font字体,不再显示文字乱码,还可查看外部参照中的对象。 可实现CAD快速看图、PDF转CAD图纸,DWG图纸编辑、DWG批注、DWG测量标注、CAD测量、CAD图块统计、CAD文字查找、导出PDF/JPG、CAD图纸比较、CAD图层管理、裁剪延伸、Excel表格等功能,无水印打印、随时共享设计进度,无需发送DWG图纸,可分享链接给他人查看,不担心图纸安全和侵权。提供CAD测量工具,适用于工程建筑、施工、现场勘测、家居装饰装修、机械制图、测量、测绘等行业;全面兼容天正各本,天正专业图纸显示更完整、更精准,助力CAD自学、工地建筑建设、工程测量员、设计师画图绘图等。 浩辰CAD云图的云端文件存储,能够支持从手机、电脑、网页浏览器登陆后多端查看图纸,微信扫码注册、登录、绑定全流程,一个账号多方快捷登录,告别U盘拷贝本,并可同时查看批注内容,可实现在手机、平板和PC端同步文件,协同编辑DWG图纸,实现随时随地看图,享受云端存储的安全与便利,。 浩辰CAD看图王支持CAD图纸多人协作办公。通过即时通讯、共享聊图与图纸管理功能,可在软件内多人共享CAD图纸、即时交流沟通、实时同步操作,无需在看图工具与微信、QQ等通讯软件间切换交流;看图交流、即时共享,协作提高办公效率,随时随地享受设计。 浩辰CAD看图王在建筑(暖通、给排水、电力、电气、结构、预算、园林、测量等专业)、机械(加工、机床、钢格板等)、装饰装修(平面图、建筑龙骨等)、施工等行业得到了广泛应用。浩辰CAD看图王移动、网页和电脑打造设计领域的OFFICE,改变CAD传统工作方式,摆脱CAD纸质图纸,非专业人员也可以轻松查看DWG格式的CAD图纸。 特色功能: 1、CAD快速看图,顺畅打开AutoCAD、浩辰CAD、天正等各本CAD图纸,天正全专业图纸解析与本转换; 2、CAD多种格式转换,支持浏览DWG、DXF等格式图纸,同时可将PDF格式文档转为DWG格式CAD图纸,以及 CAD转PDF文档或PNG等格式图片; 3、多种CAD图纸操作,提供CAD图纸比较、CAD块统计、外部参照、表格、批量打印,输出PDF等功能。 4、CAD图纸完美显示,真矢量CAD图纸显示,云字体提供CAD字库,告别乱码困扰; 5、标注测量,长度、面积、角度、坐标等多种测量与标注,同时可对测量标注的单位以及比例进行调整; 6、CAD云批注,支持文字、引线、箭头、手绘线等多种批注,并可分享好友协同工作,手机与电脑可共享批注内容; 7、一键同步,微信扫码注册、登录、绑定全流程,一个账号多方快捷登录,云存储空间图纸随身,在手机、平板或电脑上随时同步您的CAD图纸; 8、我的云图,云图空间存储与分享,CAD图纸安全不丢失。 9、绘图工具,CAD图纸绘制、修剪、延伸、测量、标注、文字查找、视口操作等功能; 10、DWG安全分享,图纸上传云图分享可设置有效天数以及批注是否可见,保护图纸安全; 11、协作功能,支持多人在线沟通与图纸实时同步,实现图纸即时交流、共享管理。 浩辰CAD看图王电脑5.2.0本更新内容: 1、优化登录、注册界面,登录注册更方便。 2、新增微信扫码注册、登录、绑定全流程,一个账号多方快捷登录。 3、新增块统计功能,图块数量一键统计。 4、新增修剪功能,制图修改更精准。 5、新增延伸功能,快速制图更方便。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值