Linux部署RocketMQ集群 事务消息高可用方案

2026-03-09 0 542

还在为你的消息中间件集群只敢在测试环境玩单机发愁?业务量稍微上来点就怕消息堆积把系统搞垮?今天这篇实战干货,就是要用最少的资源(2到4台普通Linux服务器),帮你搭起一套能上生产的、高可用的RocketMQ集群。我们不搞那些花里胡哨的复杂架构,就盯着“双主双从异步复制”这个经典模式,手把手带你落地。让消息稳稳地跑起来,这才是硬道理。

核心组件与部署模式拆解

Linux部署RocketMQ集群 事务消息高可用方案

在动手之前,得先搞明白我们今天要搭的是什么。RocketMQ的核心就俩角色:NameServer和Broker。NameServer是注册中心,负责协调,它本身是无状态的,可以随便部署。Broker才是真正干活的,负责消息的存储和转发。我们今天的方案是部署两个NameServer实例,实现高可用;再部署两个Master和两个Slave,组成异步复制的集群模式。这种2m-2s-async的模式,是资源效率和可靠性之间的黄金平衡点。

为啥选异步复制?因为它对性能影响最小,Master节点写完本地磁盘就返回成功,不用等Slave确认。对于大部分中小业务场景,消息的实时性要求没那么变态,异步复制带来的毫秒级延迟完全可以接受。万一Master挂了,Slave能顶上继续读服务,保证了基本可用性。我们总共会用到4个Broker实例,但可以根据实际服务器数量,灵活分配在两到三台机器上,只要保证Master和它的Slave不在同一台机器上就行。

java -version

环境准备与基础安装

假设你有两台Linux服务器,IP分别是和。每台机器都至少预留12G内存给RocketMQ,因为Broker是内存大户。先装JDK,这是前提,版本建议用JDK 8或11。去RocketMQ官网下载最新的5.3.4版本二进制包,上传到服务器的/app目录下。两台机器都做同样的操作。解压后,就可以开始配置了。

Linux部署RocketMQ集群 事务消息高可用方案

mkdir -p rocketmq
cd rocketmq/

我们先把NameServer跑起来。在两台机器上分别执行nohup sh mqnamesrv &,后台启动NameServer。用jps命令检查一下,能看到NamesrvStartup进程就说明成功了。NameServer很简单,不需要额外配置。接下来重点在Broker,这才是复杂的地方。我们需要为每个Broker实例准备独立的配置文件和数据目录,不能混用。

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

精细化配置双主双从

Linux部署RocketMQ集群 事务消息高可用方案

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

规划好实例分布:在机器上,我们部署一个Master(broker-a)和一个Slave(broker-b-s)。在机器上,部署一个Master(broker-b)和一个Slave(broker-a-s)。注意看,broker-a的Master在10,它的Slave在11;broker-b的Master在11,它的Slave在10。这样交叉配对,任何一台机器宕机,另一台上还有另一个Master和对应的Slave存活,系统依然能正常工作。

在两台机器上都创建数据目录:mkdir -p /app/rocketmq/store/{commitlog,consumequeue,index}。然后修改每个Broker实例的配置文件。关键配置项:brokerClusterName集群名要一致;brokerName决定主从关系,比如broker-a的Master和Slave的brokerName都是”broker-a”;brokerId为0代表Master,大于0代表Slave;namesrvAddr要填两个NameServer的地址,用分号隔开;brokerIP1务必填内网IP地址,避免客户端连不上。每台机器上的两个实例,配置文件要严格区分开,比如叫broker-a.propertiesbroker-b-s.properties

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

启动集群与功能验证

Linux部署RocketMQ集群 事务消息高可用方案

配置文件都准备好后,就可以启动了。在机器上,先启动broker-a Master:nohup sh mqbroker -c broker-a.properties &。再启动broker-b-s Slave:nohup sh mqbroker -c broker-b-s.properties &。机器上的操作类似,启动broker-b Master和broker-a-s Slave。启动顺序没有严格要求,但建议先Master后Slave。启动后,去logs目录下的broker.log文件看看有没有报错,特别是Java heap space的问题,如果遇到就去调整runbroker.sh里的JVM参数。

mkdir -p /data/rocketmq/{store-a,store-a-s,store-b,store-b-s}

vi /app/rocketmq/conf/broker-a.properties

验证集群状态至关重要。在任意一台机器上执行sh mqadmin clusterList -n :9876;:9876。如果能看到四个Broker实例都在线,并且brokerId为0的Master状态正常,brokerId不为0的Slave也正常同步数据,那就成功了一大半。还可以用sh mqadmin topicRoute -t TestTopic -n 命令,查看某个主题的路由信息,确认消息可以正确发往这些Broker。此时,你的高可用消息中枢已经初具雏形了。

# 所属集群名称
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

外网穿透实现远程调试

vi /app/rocketmq/conf/broker-b-s.properties

集群搭好了,但有时候开发同学在外网,或者想从本地电脑连接测试,怎么办?内网环境是个障碍。这时候就需要一个叫cpolar的内网穿透工具。它能把你内网服务的端口安全地映射到公网,不用去折腾路由器或申请公网IP。安装很简单,用一键安装脚本,几秒钟就搞定。装好后在浏览器访问你服务器IP加9200端口,用官网注册的账号登录,就能看到cpolar的Web管理界面。

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

Linux部署RocketMQ集群 事务消息高可用方案

在Web界面,你可以创建一个隧道,将RocketMQ的Broker端口(比如10911)或NameServer端口(9876)映射到公网。创建成功后,你会获得一个公网地址,比如tcp://xxx.cpolar.io:12345。这样,任何地方的客户端连接这个公网地址,就能穿透到你内网的RocketMQ服务了。如果担心地址变化,可以保留一个固定的TCP地址,绑定到你的隧道上,让远程地址永远不变。这对于分布式系统的远程联调和演示来说,简直是神器。

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

生产级优化与避坑指南

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

集群跑起来只是第一步,想要稳稳地扛住生产流量,还得做几件事。首先是操作系统优化,比如调整内核参数vm.max_map_count,避免文件内存映射不足。其次是JVM调优,根据你的实际内存大小,精确设置-Xms-Xmx,给操作系统留出足够的内存做PageCache。还有磁盘,RocketMQ重度依赖磁盘顺序读写,建议用SSD,并独立挂载,避免和其他服务争抢IO。

Linux部署RocketMQ集群 事务消息高可用方案

另一个常见坑是防火墙和网络策略。确保集群内所有机器之间的10909(Raft端口)、10911(Broker端口)、9876端口互通。如果你的BrokerIP1配置的是内网IP,但客户端在外网通过映射访问,那就要注意在Broker配置里额外设置brokerIP2为公网映射的IP,或者使用云厂商的负载均衡器来处理地址转换。定期监控消息积压量和JVM的GC情况,也是运维的必修课。

轻量集群的价值与落地

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 &

回过头来看我们这套方案,只用了两台机器,就实现了Master节点故障时可自动切换到Slave节点读取消息,虽然写入会短暂中断,但整个系统没有完全瘫痪。对于初创公司或者中小团队,业务增长快但服务器预算有限,这套“轻量但不简陋”的集群方案,能用最小的成本换来最大的系统稳定性。它让你不必一开始就陷入复杂的容器化或云原生架构,专注于业务本身。

Linux部署RocketMQ集群 事务消息高可用方案

这套模式已经在多个实际项目中经受住考验,日处理消息量过亿,运行一年都没出过大问题。它证明了一件事:高可用不一定是昂贵的,关键在于设计的合理性和对细节的把握。当你下次面对“只有几台破机器,却要搭高可用消息系统”的需求时,希望这篇文章能帮你少走弯路,快速落地。

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 &

Linux部署RocketMQ集群 事务消息高可用方案

读完这篇实战指南,你是否已经开始规划在你的环境中动手尝试了?在搭建过程中,你觉得最大的拦路虎会是什么,是JVM参数调优,还是网络穿透的配置?欢迎在评论区分享你的看法,点赞收藏本文,让更多被消息系统困扰的工程师看到这份干货!

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

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

七爪网 行业资讯 Linux部署RocketMQ集群 事务消息高可用方案 https://www.7claw.com/2826616.html

七爪网源码交易平台

相关文章