前言
在分布式系统中,消息中间件不仅是解耦与异步通信的桥梁,更是保障系统稳定性与可扩展性的关键基础设施。Apache RocketMQ凭借其金融级可靠性、万亿级消息吞吐能力和成熟的主从架构,已成为众多企业构建核心消息平台的首选。然而,单机部署虽便于测试,却无法满足生产环境对高可用、容灾与负载均衡的基本要求。如何在有限的资源下(如2–4台普通Linux服务器),搭建一个结构清晰、配置合理、易于运维的RocketMQ高可用集群,是许多团队面临的现实挑战。本文聚焦 “轻量但不简陋” 的集群部署理念,摒弃过度复杂的架构,围绕双主双从(2m-2s-sync) 这一兼顾可靠性与资源效率的经典模式,手把手带你完成:
- NameServer集群的部署与发现机制配置
- Broker主从同步(Sync Master/Slave)的搭建与验证
- 关键参数调优(刷盘策略、复制模式、JVM设置)
- 防火墙与端口规划(9876、10911、10921等)
- 集群状态检查与基础运维命令
我们不追求“大而全”,而是提供一套可快速落地、适合中小规模业务、具备生产级健壮性的RocketMQ集群部署方案。无论你是DevOps工程师、后端开发者,还是正在为业务选型消息中间件的技术负责人,本文都将助你迈出构建高可用消息中枢的关键一步。让每一条消息,都稳稳抵达。

1.前期准备
1.1 RocketMQ特点
RocketMQ是一款分布式、队列模型的消息中间件,具有以下特点:
- 能够保证严格的消息顺序
- 提供丰富的消息拉取模式
- 提供丰富的消息拉取模式
- 高效的订阅者水平扩展能力
- 实时的消息订阅机制
- 亿级消息堆积能力
1.2 基础概念
RocketMQ核心组件:
- NameServer:轻量级注册中心,管理Broker元数据(无状态,可集群)。
- Broker:消息存储与转发节点,分Master(可读写)和Slave(只读,用于容灾)。
- Producer/Consumer:生产者和消费者,通过NameServer发现 Broker。
本文采用 2 Master + 2 Slave(异步复制) 模式,共4个Broker实例。
1.3 环境准备
| 节点 | ip地址(示例) | 角色 |
|---|---|---|
| 机器A | 192.168.42.140 | NameServer ×2, Broker-a (Master), Broker-b-s (Slave) |
| 机器B | 192.168.42.145 | NameServer ×2, Broker-b (Master), Broker-a-s (Slave) |
1.4 前提条件:
- JDK 8+
- 两台 Linux 服务器(或虚拟机)
- 开放端口:9876(NameServer)、10911/10921(Broker 主从)
2.安装RocketMQ(每台都安装)
2.1 安装前提
首先需要安装jdk:
java -version

下载RocketMQ的源码包以及运行包:
RocketMQ的官网地址
下载页面地址
下载页面地址中文版
RocketMQ建议的运行环境需要至少12G的内存。
关于RocketMQ的版本: 我们这里采用最新的5.3.4版本

2.2.安装RocketMQ
将下载后的文件上传到/app/rocketmq
mkdir -p rocketmq
cd rocketmq/

解压该文件:
unzip rocketmq-all-5.3.4-bin-release.zip

修改rocketmq文件名:
mv rocketmq-all-5.3.4-bin-release/ rocketmq

3.配置NameServer
NameServer是无状态的注册中心,两台各启动一个即可。
启动命令(后台运行):
cd /app/rocketmq
nohup bin/mqnamesrv > logs/namesrv.log 2>&1 &

4.配置Broker集群
目录准备(两台都执行):
mkdir -p /data/rocketmq/{store-a,store-a-s,store-b,store-b-s}
4.1 在192.168.42.140上配置
conf/broker-a.properties(Master):
vi /app/rocketmq/conf/broker-a.properties
# 所属集群名称
brokerClusterName=MyRocketMQCluster
# Broker 名称(同一组主从必须相同)
brokerName=broker-a
# 0 表示 Master,>0 表示 Slave
brokerId=0
# NameServer 地址列表(用分号隔开)
namesrvAddr=192.168.42.140:9876;192.168.42.145:9876
# 监听端口
listenPort=10911
# 删除文件时间(凌晨4点)
deleteWhen=04
# 文件保留时间(小时)
fileReservedTime=48
# Broker 角色:ASYNC_MASTER / SYNC_MASTER / SLAVE
brokerRole=ASYNC_MASTER
# 刷盘方式:ASYNC_FLUSH(异步) / SYNC_FLUSH(同步)
flushDiskType=ASYNC_FLUSH
# 存储路径
storePathRootDir=/data/rocketmq/store-a
storePathCommitLog=/data/rocketmq/store-a/commitlog
conf/broker-b-s.properties(Slave of broker-b):
vi /app/rocketmq/conf/broker-b-s.properties
brokerClusterName=MyRocketMQCluster
brokerName=broker-b
brokerId=1
namesrvAddr=192.168.42.140:9876;192.168.42.145:9876
listenPort=10921
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
storePathRootDir=/data/rocketmq/store-b-s
storePathCommitLog=/data/rocketmq/store-b-s/commitlog

4.2 在192.168.42.145上配置
conf/broker-b.properties(Master):
vi /app/rocketmq/conf/broker-b.properties
brokerClusterName=MyRocketMQCluster
brokerName=broker-b
brokerId=0
namesrvAddr=192.168.42.140:9876;192.168.42.145:9876
listenPort=10911
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
storePathRootDir=/data/rocketmq/store-b
storePathCommitLog=/data/rocketmq/store-b/commitlog
conf/broker-a-s.properties(Slave of broker-a):
vi /app/rocketmq/conf/broker-b.properties
brokerClusterName=MyRocketMQCluster
brokerName=broker-a
brokerId=1
namesrvAddr=192.168.42.140:9876;192.168.42.145:9876
listenPort=10921
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
storePathRootDir=/data/rocketmq/store-a-s
storePathCommitLog=/data/rocketmq/store-a-s/commitlog

5.启动Broker(两台分别执行)
关键原则:同一brokerName的Master和Slave必须配对(如 broker-a 主在 10,从在 11)
brokerId=0是Master,brokerId=1是Slave
所有Broker都注册到全部NameServer
在192.168.42.140:
cd /opt/rocketmq
nohup bin/mqbroker -c conf/broker-a.properties > logs/broker-a.log 2>&1 &
nohup bin/mqbroker -c conf/broker-b-s.properties > logs/broker-b-s.log 2>&1 &

在192.168.42.145:
cd /opt/rocketmq
nohup bin/mqbroker -c conf/broker-b.properties > logs/broker-b.log 2>&1 &
nohup bin/mqbroker -c conf/broker-a-s.properties > logs/broker-a-s.log 2>&1 &

6.验证集群状态
在任意一台机器执行:
export NAMESRV_ADDR=192.168.42.140:9876
bin/mqadmin clusterList -n $NAMESRV_ADDR

还可查看Topic路由:
bin/mqadmin topicRoute -t TBW102 -n $NAMESRV_ADDR

7.测试消息收发
发送消息:
bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
消费消息:
bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

8.常见问题与优化
问题1:启动Broker报 Java heap space
解决:调整JVM内存(编辑 bin/runbroker.sh):

问题2:Slave无法同步Master数据
检查:
- 网络是否通(telnet 10911)
- brokerName和brokerId是否配对
- Master是否先启动
生产建议:
-
使用Dledger模式(基于Raft)替代主从复制,支持自动主从切换。
- NameServer至少部署 2 个,避免单点。
- 监控磁盘使用:CommitLog不会自动删除旧文件,需靠fileReservedTime控制。
- 开启ACL防止未授权访问(conf/plain_acl.yml)
9.安装cpolar内网穿透工具
你已在内网Linux服务器上成功部署并启动了Apache RocketMQ(包括NameServer和Broker),但由于网络隔离,外网客户端无法连接。此时,借助cpolar内网穿透工具,可快速、安全地将RocketMQ的关键端口暴露到公网,无需申请公网 IP 或配置路由器端口映射。
9.1 什么是cpolar?
cpolar是一款安全高效的内网穿透工具,无需公网IP或复杂配置,只需一条命令,即可将本地服务器、Web服务或任意端口映射到公网,让你随时随地远程访问内网应用,特别适合开发调试、远程运维和应急部署等场景。
9.2 部署cpolar
cpolar可以将你本地电脑中的服务(如 SSH、Web、数据库)映射到公网。即使你在家里或外出时,也可以通过公网地址连接回本地运行的开发环境。
❤️以下是安装cpolar步骤:
使用一键脚本安装命令:
sudo curl https://get.cpolar.sh | sh

安装完成后,执行下方命令查看cpolar服务状态:(如图所示即为正常启动)
sudo systemctl status cpolar

Cpolar安装和成功启动服务后,在浏览器上输入虚拟机主机IP加9200端口即:【ip:9200】访问Cpolar管理界面,使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可:
打开浏览器访问本地9200端口,使用cpolar账户密码登录即可,登录后即可对隧道进行管理。

10.配置公网地址
通过配置,你可以在本地 WSL 或 Linux 系统上运行 SSH 服务,并通过 Cpolar 将其映射到公网,从而实现从任意设备远程连接开发环境的目的。
- 隧道名称:可自定义,本例使用了:rocketmq,注意不要与已有的隧道名称重复
- 协议:tcp
- 本地地址:9876
- 端口类型:随机临时TCP端口
- 地区:China Top

创建成功后,打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址,接下来就可以在其他电脑或者移动端设备(异地)上,使用任意一个地址在终端中访问即可。
- tcp 表示使用的协议类型
- 2.tcp.cpolar.top是 Cpolar 提供的域名
- 11242是随机分配的公网端口号

现在我们用另一台虚拟机启动一下我们的rocketmq:
nohup sh /app/rocketmq/rocketmq/bin/mqbroker -n 2.tcp.cpolar.top:11242 autoCreateTopicEnable=true > /data/logs/rocketmq/broker.log &
如图可见 启动成功:

11.保留固定TCP公网地址
使用cpolar为其配置TCP地址,该地址为固定地址,不会随机变化。

选择区域和描述:有一个下拉菜单,当前选择的是“China Top”。
右侧输入框,用于填写描述信息。
保留按钮:在右侧有一个橙色的“保留”按钮,点击该按钮可以保留所选的TCP地址。
列表中显示了一条已保留的TCP地址记录。

登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到所要配置的隧道rocketmq,点击右侧的编辑。

修改隧道信息,将保留成功的TCP端口配置到隧道中。
- 端口类型:选择固定TCP端口
- 预留的TCP地址:填写保留成功的TCP地址
点击更新。

创建完成后,打开在线隧道列表,此时可以看到随机的公网地址已经发生变化,地址名称也变成了保留和固定的TCP地址。

这样我们的地址就永远不会发生变化啦!
总结
在实际生产环境中,很多团队受限于服务器资源,往往只有2~3台Linux机器,却仍需搭建一个稳定可用的RocketMQ集群。本文结合真实运维经验,推荐采用“双主双从异步复制”模式,在每台机器上部署一个Master和一个Slave Broker,既避免单点故障,又充分利用有限硬件。同时,务必检查brokerIP配置为内网可访问地址,避免客户端连不上。这套方案已在多个中小项目中验证,成本低、维护简单,真正做到了“轻量但不脆弱”,适合大多数企业落地使用。
感谢您对本篇文章的喜爱,有任何问题欢迎留言交流。cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站


