参考:
【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.100 | namesrv-a | 9876 |
| 192.168.10.101 | namesrv-b | 9876 |
| 192.168.10.100 | broker-a | 10911、10912 |
| 192.168.10.101 | broker-a-s | 11011 |
| 192.168.10.101 | broker-b | 10911、10912 |
| 192.168.10.100 | broker-b-s | 11011 |
根据自己在 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 # 避免与主节点冲突
这种架构提供了以下优势:
- NameServer无单点故障
- Broker数据双重备份
- 负载均衡能力
- 自动故障转移能力
工作流程
- 启动NameServer,NameServer起来后监听端口,等待Broker、Producer、Consumer连上来,相当于一个路由控制中心。
- Broker启动,跟所有的NameServer保持长连接,定时发送心跳包。心跳包中包含当前Broker信息(IP+端口等)以及存储所有Topic信息。注册成功后,NameServer集群中就有Topic跟Broker的映射关系。
- 收发消息前,先创建Topic,创建Topic时需要指定该Topic要存储在哪些Broker上,也可以在发送消息时自动创建Topic。
- Producer发送消息,启动时先跟NameServer集群中的其中一台建立长连接,并从NameServer中获取当前发送的Topic存在哪些Broker上,轮询从队列列表中选择一个队列,然后与队列所在的Broker建立长连接从而向Broker发消息。
- 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
- 验证消息收发是否正常,
- 验证备节点是否自动接管
- 通过Dashboard观察状态变化
docker stop broker-a
关键配置说明
| 配置项 | 主节点配置 | 备节点配置 | 说明 |
|---|---|---|---|
| brokerRole | SYNC_MASTER | SLAVE | 定义节点角色 |
| brokerId | 0 | 1 | 主节点必须为0,备节点大于0 |
| namesrvAddr | 两台NameServer地址 | 两台NameServer地址 | 必须包含所有NameServer地址 |
| brokerIP1 | 本机IP | 本机IP | 必须正确配置 |
| flushDiskType | SYNC_FLUSH | SYNC_FLUSH | 建议生产环境使用同步刷盘 |
部署问题
不能正确显示从节点的同步数
RocketMQ5.1.0主从已同步数据


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

这是由于dashboard和rocketmq5.1版本以上存在适配问题,目前不知道如何解决,只能将rocketmq降低版本到5.0.0以下,就可以正确显示了,下面是官方解释
https://github.com/apache/rocketmq-dashboard/issues/227
5.0.0的部署可参考我的另一篇

1981

被折叠的 条评论
为什么被折叠?



