Java 生产环境 RocketMQ 架构与部署指南
目录
一、生产环境标准架构(必用)
1. 整体架构图(极简版)
2. 核心组件说明
二、生产环境推荐部署规格
最小高可用集群(最常用)
中型集群(业务量较大)
三、部署步骤(生产可直接照做)
环境准备
步骤 1:下载解压
步骤 2:修改 JVM 内存(非常重要)
步骤 3:配置 NameServer 集群(2 台)
步骤 4:配置 Broker 主从集群(核心)
机器规划
1)配置 broker1-master
2)配置 broker1-slave
3)broker2-master 和 broker2-slave
四、Java 生产环境客户端配置
生产者
消费者
五、生产环境关键配置(必看)
六、集群检查命令
七、高可用保障机制
总结
RocketMQ 是阿里开源的分布式消息队列,生产环境必须用分布式高可用架构,绝对不能单节点部署。本文会用最清晰、生产可直接落地的方式,给你讲透架构和部署步骤。
一、生产环境标准架构(必用)
生产环境核心目标:高可用、无单点故障、可水平扩容。
1. 整体架构图(极简版)
生产者集群 → NameServer 集群(2~3台) → Broker 主从集群 → 消费者集群2. 核心组件说明
NameServer(注册中心)
- 轻量级无状态服务,必须集群部署(2~3 台)
- 作用:Broker 注册、路由发现、心跳检测
- 无主从、无选举,随便挂一台不影响整体
Broker(消息存储核心)
- 真正负责消息收发、持久化、高可用
- 生产必须:主从架构(Master-Slave)
- 支持异步刷盘 + 异步复制(性能最高)
- 支持同步双写(金融级可靠性)
生产者 / 消费者
- 都是客户端集群,无状态,可随意扩容
- 通过 NameServer 自动发现 Broker
二、生产环境推荐部署规格
最小高可用集群(最常用)
- NameServer:2 台(2C4G)
- Broker:2 主 2 从(4 台,4C8G+SSD)
- broker1-master + broker1-slave
- broker2-master + broker2-slave
中型集群(业务量较大)
- NameServer:3 台
- Broker:3 主 3 从(6 台)
磁盘必须用SSD,机械盘会导致严重性能瓶颈。
三、部署步骤(生产可直接照做)
环境准备
- Linux(CentOS 7+/Ubuntu 20+)
- JDK 8+(必须)
- 关闭防火墙 / 开放端口:9876 (NameServer)、10911/10912 (Broker)
- 磁盘:SSD,预留 50GB+
步骤 1:下载解压
# 下载稳定版 4.9.5 / 5.1.0(生产推荐 4.9.x) wget https://archive.apache.org/dist/rocketmq/4.9.5/rocketmq-all-4.9.5-bin-release.zip unzip rocketmq-all-4.9.5-bin-release.zip mv rocketmq-4.9.5 /usr/local/rocketmq cd /usr/local/rocketmq步骤 2:修改 JVM 内存(非常重要)
默认内存太大,服务器会直接挂!
- 修改 NameServer 启动内存
vim bin/runserver.sh找到:
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g"改为:
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m"- 修改 Broker 启动内存
vim bin/runbroker.sh找到:
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g"改为:
JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g"步骤 3:配置 NameServer 集群(2 台)
每台 NameServer 都执行:
nohup sh bin/mqnamesrv & # 查看日志 tail -f ~/logs/rocketmqlogs/namesrv.log看到:
The Name Server boot success即启动成功。
步骤 4:配置 Broker 主从集群(核心)
我们以2 主 2 从为例:
机器规划
- 192.168.1.10:broker1-master
- 192.168.1.11:broker1-slave
- 192.168.1.12:broker2-master
- 192.168.1.13:broker2-slave
- NameServer:192.168.1.20, 192.168.1.21
1)配置 broker1-master
mkdir -p /data/rocketmq/store mkdir -p /data/rocketmq/logs vim conf/broker.conf写入:
properties
brokerClusterName = DefaultCluster brokerName = broker1 brokerId = 0 # 0=master deleteWhen = 04 fileReservedTime = 48 brokerRole = ASYNC_MASTER # 异步主(高性能) flushDiskType = ASYNC_FLUSH # 异步刷盘 listenPort=10911 namesrvAddr=192.168.1.20:9876;192.168.1.21:9876 storePathRootDir=/data/rocketmq/store storePathCommitLog=/data/rocketmq/store/commitlog storePathConsumeQueue=/data/rocketmq/store/consumequeue storePathIndex=/data/rocketmq/store/index storeCheckpoint=/data/rocketmq/store/checkpoint abortFile=/data/rocketmq/store/abort启动:
nohup sh bin/mqbroker -c conf/broker.conf &2)配置 broker1-slave
properties
brokerClusterName = DefaultCluster brokerName = broker1 brokerId = 1 # 非0=slave deleteWhen = 04 fileReservedTime = 48 brokerRole = SLAVE # 从节点 flushDiskType = ASYNC_FLUSH listenPort=10911 namesrvAddr=192.168.1.20:9876;192.168.1.21:9876 storePathRootDir=/data/rocketmq/store ...3)broker2-master 和 broker2-slave
- brokerName = broker2
- brokerId=0/master,brokerId=1/slave
- 其他完全一样
四、Java 生产环境客户端配置
生产者
@Bean public DefaultMQProducer producer() { DefaultMQProducer producer = new DefaultMQProducer("ProducerGroup"); // 填所有 NameServer producer.setNamesrvAddr("192.168.1.20:9876;192.168.1.21:9876"); producer.setRetryTimesWhenSendFailed(2); producer.setSendMsgTimeout(3000); return producer; }消费者
@Bean public DefaultMQPushConsumer consumer() throws MQClientException { DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroup"); consumer.setNamesrvAddr("192.168.1.20:9876;192.168.1.21:9876"); consumer.subscribe("TOPIC_TEST", "*"); consumer.setMessageListener(new MessageListenerConcurrently() { @Override public ConsumeConcurrentlyStatus consumeMessage(...) { return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } }); return consumer; }五、生产环境关键配置(必看)
- brokerRole = ASYNC_MASTER(高性能)
- flushDiskType = ASYNC_FLUSH(高性能)
- 金融级可用:
- brokerRole = SYNC_MASTER
- flushDiskType = SYNC_FLUSH
- 磁盘保留 48 小时
- 开启自动删除过期文件
六、集群检查命令
# 查看集群状态 sh bin/mqadmin clusterList -n 192.168.1.20:9876 # 查看 Topic 路由 sh bin/mqadmin topicRoute -n 192.168.1.20:9876 -t TOPIC_TEST七、高可用保障机制
- NameServer 集群 → 无单点
- Broker 主从 → Master 挂了,Slave 自动升主(RocketMQ 4.x 需要手动切换;5.x 自动切换)
- 生产者 / 消费者自动重试、自动发现
- 消息持久化到磁盘
总结
- 生产架构:NameServer 集群(2~3 台) + Broker 主从集群(2 主 2 从起步)
- 部署核心:修改 JVM 内存 + 配置 broker.conf 主从 + 用 SSD
- 高可用:无单点、主从自动切换、消息不丢失
- Java 客户端:配置所有 NameServer 地址即可自动负载
