轻量级高可用消息中枢:在Linux服务器部署RocketMQ集群的最佳实践

前言

在分布式系统中,消息中间件不仅是解耦与异步通信的桥梁,更是保障系统稳定性与可扩展性的关键基础设施。Apache RocketMQ凭借其金融级可靠性、万亿级消息吞吐能力和成熟的主从架构,已成为众多企业构建核心消息平台的首选。然而,单机部署虽便于测试,却无法满足生产环境对高可用、容灾与负载均衡的基本要求。如何在有限的资源下(如2–4台普通Linux服务器),搭建一个结构清晰、配置合理、易于运维的RocketMQ高可用集群,是许多团队面临的现实挑战。本文聚焦 “轻量但不简陋” 的集群部署理念,摒弃过度复杂的架构,围绕双主双从(2m-2s-sync) 这一兼顾可靠性与资源效率的经典模式,手把手带你完成:

  • NameServer集群的部署与发现机制配置
  • Broker主从同步(Sync Master/Slave)的搭建与验证
  • 关键参数调优(刷盘策略、复制模式、JVM设置)
  • 防火墙与端口规划(9876、10911、10921等)
  • 集群状态检查与基础运维命令

我们不追求“大而全”,而是提供一套可快速落地、适合中小规模业务、具备生产级健壮性的RocketMQ集群部署方案。无论你是DevOps工程师、后端开发者,还是正在为业务选型消息中间件的技术负责人,本文都将助你迈出构建高可用消息中枢的关键一步。让每一条消息,都稳稳抵达。

fKT1E0QN8

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

image-20251229151957506

下载RocketMQ的源码包以及运行包

RocketMQ的官网地址
下载页面地址
下载页面地址中文版

RocketMQ建议的运行环境需要至少12G的内存

关于RocketMQ的版本: 我们这里采用最新的5.3.4版本

image-20251229152351264

2.2.安装RocketMQ

将下载后的文件上传到/app/rocketmq

mkdir -p rocketmq
cd rocketmq/

image-20251229160346183

解压该文件:

 unzip rocketmq-all-5.3.4-bin-release.zip

image-20251229160719226

修改rocketmq文件名:

mv rocketmq-all-5.3.4-bin-release/ rocketmq

image-20251229160943531

3.配置NameServer

NameServer是无状态的注册中心,两台各启动一个即可。

启动命令(后台运行):

cd /app/rocketmq
nohup bin/mqnamesrv > logs/namesrv.log 2>&1 &

44fee069e8e687bbc9b5297b1c102e60

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

7cbc80eb489820fe9e68aa0aa155ea5a

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

115f8a443f6164fa0c0ba9fccabbcfb7

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 &

009080f895cc881ad967180b9c810f70

在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 &

ac1cdbacae194a8aa9ad55882c0a771d

6.验证集群状态

在任意一台机器执行:

export NAMESRV_ADDR=192.168.42.140:9876
bin/mqadmin clusterList -n $NAMESRV_ADDR

image-20260204162714859

还可查看Topic路由:

bin/mqadmin topicRoute -t TBW102 -n $NAMESRV_ADDR

image-20260204162734189

7.测试消息收发

发送消息:

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

消费消息:

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

5d2eb2ac75f26bd8d34125ba7bcd98c5

8.常见问题与优化

问题1:启动Broker报 Java heap space

解决:调整JVM内存(编辑 bin/runbroker.sh):

image-20260204162822445

问题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步骤:

官网在此:https://www.cpolar.com

使用一键脚本安装命令:

sudo curl https://get.cpolar.sh | sh

image-20250814101639846

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

sudo systemctl status cpolar

22e5adfaf290a17fc3384bb296055259

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

打开浏览器访问本地9200端口,使用cpolar账户密码登录即可,登录后即可对隧道进行管理。

8a6698b1bf26d64ba3645827fbfb1c29

10.配置公网地址

通过配置,你可以在本地 WSL 或 Linux 系统上运行 SSH 服务,并通过 Cpolar 将其映射到公网,从而实现从任意设备远程连接开发环境的目的。

  • 隧道名称:可自定义,本例使用了:rocketmq,注意不要与已有的隧道名称重复
  • 协议:tcp
  • 本地地址:9876
  • 端口类型:随机临时TCP端口
  • 地区:China Top

image-20251230153622707

创建成功后,打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址,接下来就可以在其他电脑或者移动端设备(异地)上,使用任意一个地址在终端中访问即可。

  • tcp 表示使用的协议类型
  • 2.tcp.cpolar.top是 Cpolar 提供的域名
  • 11242是随机分配的公网端口号

image-20251230153725059

现在我们用另一台虚拟机启动一下我们的rocketmq:

nohup sh /app/rocketmq/rocketmq/bin/mqbroker -n 2.tcp.cpolar.top:11242 autoCreateTopicEnable=true > /data/logs/rocketmq/broker.log &

如图可见 启动成功:

image-20251230155141996

11.保留固定TCP公网地址

使用cpolar为其配置TCP地址,该地址为固定地址,不会随机变化。

image-20251230155719242

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

image-20251230155658169

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

image-20251230155748257

修改隧道信息,将保留成功的TCP端口配置到隧道中。

  • 端口类型:选择固定TCP端口
  • 预留的TCP地址:填写保留成功的TCP地址

点击更新

image-20251230155819333

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

image-20251230155851314

这样我们的地址就永远不会发生变化啦!

总结

在实际生产环境中,很多团队受限于服务器资源,往往只有2~3台Linux机器,却仍需搭建一个稳定可用的RocketMQ集群。本文结合真实运维经验,推荐采用“双主双从异步复制”模式,在每台机器上部署一个Master和一个Slave Broker,既避免单点故障,又充分利用有限硬件。同时,务必检查brokerIP配置为内网可访问地址,避免客户端连不上。这套方案已在多个中小项目中验证,成本低、维护简单,真正做到了“轻量但不脆弱”,适合大多数企业落地使用。

感谢您对本篇文章的喜爱,有任何问题欢迎留言交流。cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站

Share:

发表回复

目录

On Key

推荐文章