目录
[1. 整体架构图(极简版)](#1. 整体架构图(极简版))
[2. 核心组件说明](#2. 核心组件说明)
[步骤 1:下载解压](#步骤 1:下载解压)
[步骤 2:修改 JVM 内存(非常重要)](#步骤 2:修改 JVM 内存(非常重要))
[步骤 3:配置 NameServer 集群(2 台)](#步骤 3:配置 NameServer 集群(2 台))
[步骤 4:配置 Broker 主从集群(核心)](#步骤 4:配置 Broker 主从集群(核心))
[1)配置 broker1-master](#1)配置 broker1-master)
[2)配置 broker1-slave](#2)配置 broker1-slave)
[3)broker2-master 和 broker2-slave](#3)broker2-master 和 broker2-slave)
[四、Java 生产环境客户端配置](#四、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 地址即可自动负载