RocketMQ 安装指南
- 适用版本: Apache RocketMQ 5.4.0(2025-12-24 发布)
- 操作系统: CentOS Stream 9 / RHEL 9(x86_64)
- 部署方式: Linux 二进制部署(⭐推荐)/ Docker Compose 部署
- 前置依赖: JDK 1.8+(建议 JDK 17)
- 官方文档: rocketmq.apache.org
一、RocketMQ 概述
Apache RocketMQ 是阿里巴巴开源的分布式消息与流处理平台,具备低延迟、高性能、高可靠、万亿级容量和灵活可扩展等特性。
1.1 核心特性
- 丰富的消息类型: 普通消息、顺序消息、延迟/定时消息、事务消息、批量消息
- 高吞吐低延迟: 万亿级消息容量,毫秒级端到端延迟
- 云原生架构: 5.0 版本原生支持计算存储分离、弹性扩缩容
- 流处理引擎: 内置轻量级流计算引擎 RocketMQ Streams
- 多协议支持: 原生 Remoting/gRPC 协议,兼容 MQTT/AMQP
1.2 5.x 架构组件
| 组件 | 职责 | 默认端口 |
|---|---|---|
| NameServer | 服务发现与路由管理,无状态可集群部署 | 9876 |
| Broker | 消息存储与投递,核心存储引擎 | 10911(主端口)/ 10909(VIP)/ 10912(HA) |
| Proxy | 协议适配层(gRPC/Remoting),5.x 新增 | 8080(gRPC)/ 8081(Remoting) |
| Dashboard | 可视化管理控制台 | 8080 |
1.3 部署模式
| 模式 | 说明 | 适用场景 |
|---|---|---|
| Local 模式(⭐推荐) | Broker 与 Proxy 合并部署在同一进程 | 单机/小规模生产,延迟最低 |
| Cluster 模式 | Broker 与 Proxy 分离独立部署 | 大规模集群,需独立扩展 Proxy |
1.4 版本选择
| 版本 | 发布日期 | 说明 |
|---|---|---|
| 5.4.0(当前最新) | 2025-12-24 | 最新稳定版,本指南基于此版本 |
| 5.3.4 | 2025-11-26 | 上一个稳定版,RocksDB Pop 消费增强 |
| 5.3.2 | 2025-03-11 | 长期维护版本 |
| 4.9.x | Legacy | 4.x 经典版,无 Proxy 组件 |
二、环境准备
2.1 系统要求
- 操作系统: 64 位 Linux(推荐 CentOS Stream 9 / RHEL 9)
- JDK: 1.8+(推荐 JDK 17,生产环境建议 OpenJDK 17)
- 内存: NameServer 最低 1GB / Broker 最低 4GB(建议 8GB+)
- 磁盘: Broker 建议 SSD,预留充足存储空间
- 网络: 所有节点间网络互通
2.2 检查并安装 JDK
# 检查 Java 版本
java -version
# 如未安装,通过 dnf 安装 OpenJDK 17
sudo dnf install -y java-17-openjdk java-17-openjdk-devel
# 验证
java -version
# openjdk version "17.0.x" ...
# 配置 JAVA_HOME(如有需要)
echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk' | sudo tee /etc/profile.d/java.sh
echo 'export PATH=$JAVA_HOME/bin:$PATH' | sudo tee -a /etc/profile.d/java.sh
source /etc/profile.d/java.sh2.3 检查旧版 RocketMQ
# 检查是否有运行中的 RocketMQ 进程
ps -ef | grep -E '(NamesrvStartup|BrokerStartup|ProxyStartup)' | grep -v grep
# 检查是否有 systemd 服务
systemctl list-units --type=service | grep -i rocket
# 检查默认端口占用
ss -tlnp | grep -E '(9876|10911|10909|10912|8080|8081)'
# 如果存在旧版本,先停止并备份
# --- 停止旧进程 ---
sh /path/to/rocketmq/bin/mqshutdown broker
sh /path/to/rocketmq/bin/mqshutdown namesrv2.4 创建系统用户和目录
# 创建 rocketmq 用户(非 root 运行)
# -r 创建系统用户,默认无密码、禁止密码登录
# 切换方式:从 root 用 su - rocketmq(无需密码)
# 如需设置密码(可选):sudo passwd rocketmq
sudo useradd -r -m -s /bin/bash rocketmq
# 创建安装目录和数据目录
sudo mkdir -p /opt/rocketmq
sudo mkdir -p /data/rocketmq/{store,logs}
sudo mkdir -p /data/rocketmq/store/{commitlog,consumequeue,index}
# 设置目录权限
sudo chown -R rocketmq:rocketmq /opt/rocketmq /data/rocketmq2.5 防火墙配置
# 开放 RocketMQ 所需端口
sudo firewall-cmd --permanent --add-port=9876/tcp # NameServer
sudo firewall-cmd --permanent --add-port=10911/tcp # Broker 主端口
sudo firewall-cmd --permanent --add-port=10909/tcp # Broker VIP 通道
sudo firewall-cmd --permanent --add-port=10912/tcp # Broker HA 端口
sudo firewall-cmd --permanent --add-port=8080/tcp # Proxy gRPC
sudo firewall-cmd --permanent --add-port=8081/tcp # Proxy Remoting
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports三、方式一:Linux 二进制部署(推荐)
直接使用官方预编译二进制包,配合 systemd 管理,运维清晰、性能最优、排障方便。生产环境首选方案。
3.1 下载并解压
# 切换到 rocketmq 用户
su - rocketmq
# 下载 RocketMQ 5.4.0 二进制包
cd /opt/rocketmq
wget https://downloads.apache.org/rocketmq/5.4.0/rocketmq-all-5.4.0-bin-release.zip
# 校验 SHA512
wget https://downloads.apache.org/rocketmq/5.4.0/rocketmq-all-5.4.0-bin-release.zip.sha512
# ⚠️ Apache 官方 .sha512 文件格式为 "filename: 大写哈希(空格分隔、多行)"
# 不符合 sha512sum -c 要求的 "小写哈希 文件名" 格式,需转换后校验
# 一行命令自动校验(推荐)
echo "$(sed 's/^.*: //' rocketmq-all-5.4.0-bin-release.zip.sha512 | tr -d ' \n' | tr 'A-Z' 'a-z') rocketmq-all-5.4.0-bin-release.zip" | sha512sum -c -
# 输出 "rocketmq-all-5.4.0-bin-release.zip: OK" 表示校验通过
# 手动对比(备选):计算本地哈希,与官方文件肉眼比对
sha512sum rocketmq-all-5.4.0-bin-release.zip
cat rocketmq-all-5.4.0-bin-release.zip.sha512
# 解压
unzip rocketmq-all-5.4.0-bin-release.zip
# 创建软链接方便版本管理
ln -sf /opt/rocketmq/rocketmq-all-5.4.0-bin-release /opt/rocketmq/current
# 验证目录结构
ls -la /opt/rocketmq/current/
# bin/ conf/ lib/ LICENSE NOTICE README.md3.2 配置环境变量
配置文件取决于当前用户使用的 Shell。先确认 Shell 类型再写入对应文件。
# 确认当前 Shell 类型
echo $SHELL
# /bin/bash → 写入 ~/.bashrc
# /bin/zsh → 写入 ~/.zshrc
# /bin/fish → 写入 ~/.config/fish/config.fish(语法不同)
# 查看 rocketmq 用户的登录 Shell
getent passwd rocketmq | cut -d: -f7Bash(CentOS Stream 9 默认)→ ~/.bashrc:
cat >> ~/.bashrc << 'EOF'
# RocketMQ
export ROCKETMQ_HOME=/opt/rocketmq/current
export PATH=$ROCKETMQ_HOME/bin:$PATH
export NAMESRV_ADDR=localhost:9876
EOF
source ~/.bashrcZsh → ~/.zshrc:
cat >> ~/.zshrc << 'EOF'
# RocketMQ
export ROCKETMQ_HOME=/opt/rocketmq/current
export PATH=$ROCKETMQ_HOME/bin:$PATH
export NAMESRV_ADDR=localhost:9876
EOF
source ~/.zshrc通用方式(所有 Shell 登录时生效)→ /etc/profile.d/:
# 推荐:写入系统级 profile.d,无需关心具体 Shell 类型
sudo cat > /etc/profile.d/rocketmq.sh << 'EOF'
export ROCKETMQ_HOME=/opt/rocketmq/current
export PATH=$ROCKETMQ_HOME/bin:$PATH
export NAMESRV_ADDR=localhost:9876
EOF
sudo chmod +x /etc/profile.d/rocketmq.sh
source /etc/profile.d/rocketmq.sh3.3 调整 JVM 参数
默认 JVM 配置较大(NameServer 4g,Broker 8g)。请根据服务器内存调整,否则可能因内存不足启动失败。
# --- NameServer JVM(编辑 bin/runserver.sh)---
vi $ROCKETMQ_HOME/bin/runserver.sh
# 找到 JAVA_OPT 行,根据实际内存调整:
# 生产环境(内存充足):保持默认 -Xms4g -Xmx4g -Xmn2g
# 测试/小内存环境:调整为
# JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m"
# --- Broker JVM(编辑 bin/runbroker.sh)---
vi $ROCKETMQ_HOME/bin/runbroker.sh
# 找到 JAVA_OPT 行:
# 生产环境(8GB+内存):-Xms8g -Xmx8g -Xmn4g
# 生产环境(4GB内存):-Xms4g -Xmx4g -Xmn2g
# 测试环境:-Xms1g -Xmx1g -Xmn512m生产环境推荐 JVM 配置(Broker):
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC"
JAVA_OPT="${JAVA_OPT} -XX:G1HeapRegionSize=16m"
JAVA_OPT="${JAVA_OPT} -XX:G1ReservePercent=25"
JAVA_OPT="${JAVA_OPT} -XX:InitiatingHeapOccupancyPercent=30"
JAVA_OPT="${JAVA_OPT} -XX:SoftRefLRUPolicyMSPerMB=0"
JAVA_OPT="${JAVA_OPT} -XX:+AlwaysPreTouch"
JAVA_OPT="${JAVA_OPT} -XX:MaxGCPauseMillis=150"
JAVA_OPT="${JAVA_OPT} -XX:-UseBiasedLocking"3.4 启动 NameServer
# 启动 NameServer
nohup sh $ROCKETMQ_HOME/bin/mqnamesrv > /data/rocketmq/logs/namesrv.out 2>&1 &
# 验证启动
tail -f ~/logs/rocketmqlogs/namesrv.log
# 看到 "The Name Server boot success. serializeType=JSON" 表示成功
# 检查端口
ss -tlnp | grep 98763.5 配置 Broker
$ROCKETMQ_HOME/conf/ 目录下有多种预置配置模板:
broker.conf— 单机默认2m-2s-sync/— 2主2从同步复制2m-2s-async/— 2主2从异步复制2m-noslave/— 2主无从dledger/— DLedger 自动主从切换
创建生产配置文件:
cat > /data/rocketmq/broker.conf << 'EOF'
# ========================================
# RocketMQ Broker 生产配置
# 配置文件位置: /data/rocketmq/broker.conf
# ========================================
# --- 集群配置 ---
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
# brokerId=0 表示 Master,>0 表示 Slave
# --- 网络配置 ---
# brokerIP1 必须为本机网卡上的内网 IP(ip addr 查看)
# 云服务器的公网 IP 是 NAT 映射,不在网卡上,不能用作 brokerIP1
brokerIP1=192.xxx.xxx.141
# 如需外部客户端通过公网访问,设置 brokerIP2 为公网 IP
# brokerIP2=180.xxx.xxx.201
namesrvAddr=localhost:9876
listenPort=10911
# --- 存储路径(使用独立数据目录)---
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
# --- 存储策略 ---
# 刷盘方式: ASYNC_FLUSH(异步,高性能) / SYNC_FLUSH(同步,高可靠)
flushDiskType=ASYNC_FLUSH
# 主从复制: ASYNC_MASTER(异步) / SYNC_MASTER(同步)
brokerRole=ASYNC_MASTER
# --- CommitLog 配置 ---
# 单个 CommitLog 文件大小,默认 1GB
mapedFileSizeCommitLog=1073741824
# ConsumeQueue 每个文件存储的条目数
mapedFileSizeConsumeQueue=300000
# --- 消息保留策略 ---
# 文件保留时间(小时),默认 72
fileReservedTime=72
# 删除文件的时间点(凌晨 4 点)
deleteWhen=04
# 磁盘使用率超过此值开始清理,默认 75%
diskMaxUsedSpaceRatio=75
# --- Topic 与消费组 ---
# 自动创建 Topic(生产环境建议关闭)
autoCreateTopicEnable=false
# 自动创建消费组
autoCreateSubscriptionGroup=true
# 默认 Topic 队列数
defaultTopicQueueNums=8
# --- 线程池配置 ---
sendMessageThreadPoolNums=16
pullMessageThreadPoolNums=32
# --- 消息大小限制 ---
# 单条消息最大 4MB
maxMessageSize=4194304
# --- 消息轨迹(可选)---
traceTopicEnable=true
# --- 事务消息 ---
transactionCheckMax=15
transactionCheckInterval=60000
EOF3.6 启动 Broker + Proxy(Local 模式)
# 以 Local 模式启动(Broker + Proxy 合并部署,⭐推荐)
nohup sh $ROCKETMQ_HOME/bin/mqbroker -n localhost:9876 \
-c /data/rocketmq/broker.conf \
--enable-proxy \
> /data/rocketmq/logs/broker.out 2>&1 &
# 验证启动
tail -f ~/logs/rocketmqlogs/broker_default.log
# 看到 "The broker[broker-a, ...] boot success." 表示成功
# 检查端口
ss -tlnp | grep -E '(10911|8080|8081)'3.7 验证部署
# 查看集群信息
sh $ROCKETMQ_HOME/bin/mqadmin clusterList -n localhost:9876
# 创建测试 Topic
sh $ROCKETMQ_HOME/bin/mqadmin updateTopic -n localhost:9876 \
-b localhost:10911 \
-t TestTopic \
-r 8 -w 8
# 发送测试消息
sh $ROCKETMQ_HOME/bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
# 消费测试消息
sh $ROCKETMQ_HOME/bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
# 查看 Topic 列表
sh $ROCKETMQ_HOME/bin/mqadmin topicList -n localhost:98763.8 配置 systemd 服务
systemd 服务文件写入 /etc/systemd/system/ 需要 root 权限。请先退出 rocketmq 用户,切回有 sudo 权限的管理员账号(或 root)再执行以下命令。
exit # 退出 rocketmq 用户
# 或 su - rootNameServer 服务:
sudo tee /etc/systemd/system/rocketmq-namesrv.service > /dev/null << 'EOF'
[Unit]
Description=Apache RocketMQ NameServer
After=network.target
[Service]
Type=simple
User=rocketmq
Group=rocketmq
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk"
Environment="ROCKETMQ_HOME=/opt/rocketmq/current"
ExecStart=/opt/rocketmq/current/bin/mqnamesrv
ExecStop=/opt/rocketmq/current/bin/mqshutdown namesrv
Restart=on-failure
RestartSec=10
LimitNOFILE=65535
LimitNPROC=65535
SuccessExitStatus=143
StandardOutput=append:/data/rocketmq/logs/namesrv.out
StandardError=append:/data/rocketmq/logs/namesrv.err
[Install]
WantedBy=multi-user.target
EOFBroker + Proxy 服务(Local 模式):
sudo tee /etc/systemd/system/rocketmq-broker.service > /dev/null << 'EOF'
[Unit]
Description=Apache RocketMQ Broker (Local Mode with Proxy)
After=network.target rocketmq-namesrv.service
Requires=rocketmq-namesrv.service
[Service]
Type=simple
User=rocketmq
Group=rocketmq
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk"
Environment="ROCKETMQ_HOME=/opt/rocketmq/current"
ExecStart=/opt/rocketmq/current/bin/mqbroker -n 127.0.0.1:9876 -c /data/rocketmq/broker.conf --enable-proxy
ExecStop=/opt/rocketmq/current/bin/mqshutdown broker
Restart=on-failure
RestartSec=15
LimitNOFILE=65535
LimitNPROC=65535
SuccessExitStatus=143
StandardOutput=append:/data/rocketmq/logs/broker.out
StandardError=append:/data/rocketmq/logs/broker.err
[Install]
WantedBy=multi-user.target
EOF# 重载并启用服务
sudo systemctl daemon-reload
sudo systemctl enable rocketmq-namesrv rocketmq-broker
# 先停止手动启动的进程
sh $ROCKETMQ_HOME/bin/mqshutdown broker
sh $ROCKETMQ_HOME/bin/mqshutdown namesrv
# 通过 systemd 启动
sudo systemctl start rocketmq-namesrv
sudo systemctl start rocketmq-broker
# 检查状态
sudo systemctl status rocketmq-namesrv
sudo systemctl status rocketmq-broker四、方式二:Docker Compose 部署
4.1 前置要求
- Docker 20.10+
- Docker Compose v2+
# 验证 Docker 版本
docker --version
docker compose version4.2 创建目录结构
mkdir -p /opt/rocketmq-docker/{conf,data,logs}
mkdir -p /opt/rocketmq-docker/data/{namesrv,broker}
mkdir -p /opt/rocketmq-docker/logs/{namesrv,broker,proxy}
cd /opt/rocketmq-docker4.3 Broker 配置文件
cat > /opt/rocketmq-docker/conf/broker.conf << 'EOF'
brokerClusterName=DockerCluster
brokerName=broker-a
brokerId=0
namesrvAddr=rmqnamesrv:9876
listenPort=10911
# Docker 中必须设置为宿主机 IP(外部客户端访问用)
brokerIP1=192.xxx.xxx.141
storePathRootDir=/home/rocketmq/store
storePathCommitLog=/home/rocketmq/store/commitlog
flushDiskType=ASYNC_FLUSH
brokerRole=ASYNC_MASTER
autoCreateTopicEnable=false
autoCreateSubscriptionGroup=true
defaultTopicQueueNums=8
fileReservedTime=72
deleteWhen=04
EOF4.4 Docker Compose 配置
# /opt/rocketmq-docker/docker-compose.yml
version: '3.8'
services:
# NameServer
rmqnamesrv:
image: apache/rocketmq:5.4.0
container_name: rmqnamesrv
ports:
- "9876:9876"
environment:
JAVA_OPT_EXT: "-server -Xms512m -Xmx512m -Xmn256m"
command: sh mqnamesrv
volumes:
- ./logs/namesrv:/home/rocketmq/logs
- ./data/namesrv:/home/rocketmq/store
networks:
- rocketmq
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "nc -z localhost 9876 || exit 1"]
interval: 10s
timeout: 5s
retries: 5
# Broker + Proxy (Local 模式)
rmqbroker:
image: apache/rocketmq:5.4.0
container_name: rmqbroker
ports:
- "10911:10911"
- "10909:10909"
- "10912:10912"
- "8080:8080"
- "8081:8081"
environment:
NAMESRV_ADDR: rmqnamesrv:9876
JAVA_OPT_EXT: "-server -Xms1g -Xmx1g -Xmn512m"
command: sh mqbroker -c /home/rocketmq/conf/broker.conf --enable-proxy
volumes:
- ./conf/broker.conf:/home/rocketmq/conf/broker.conf:ro
- ./logs/broker:/home/rocketmq/logs
- ./data/broker:/home/rocketmq/store
depends_on:
rmqnamesrv:
condition: service_healthy
networks:
- rocketmq
restart: unless-stopped
# Dashboard 管理控制台
rmqdashboard:
image: apacherocketmq/rocketmq-dashboard:2.1.0
container_name: rmqdashboard
ports:
- "18080:8080"
environment:
JAVA_OPTS: "-Drocketmq.namesrv.addr=rmqnamesrv:9876"
depends_on:
rmqnamesrv:
condition: service_healthy
networks:
- rocketmq
restart: unless-stopped
networks:
rocketmq:
driver: bridge4.5 启动与验证
# 启动全部服务
cd /opt/rocketmq-docker
docker compose up -d
# 查看容器状态
docker compose ps
# 查看 NameServer 日志
docker compose logs -f rmqnamesrv
# 看到 "The Name Server boot success." 即成功
# 查看 Broker 日志
docker compose logs -f rmqbroker
# 看到 "The broker[broker-a, ...] boot success." 即成功
# 查看集群信息
docker exec -it rmqbroker sh -c 'mqadmin clusterList -n rmqnamesrv:9876'
# 访问 Dashboard
# 浏览器打开 http://192.168.1.100:180804.6 Docker 常用运维命令
# 停止全部服务
docker compose down
# 停止并删除数据卷(⚠️ 清除所有消息数据)
docker compose down -v
# 重启单个服务
docker compose restart rmqbroker
# 查看资源使用
docker stats rmqnamesrv rmqbroker rmqdashboard
# 进入 Broker 容器
docker exec -it rmqbroker bash
# 发送测试消息
docker exec -it rmqbroker sh -c '
export NAMESRV_ADDR=rmqnamesrv:9876
tools.sh org.apache.rocketmq.example.quickstart.Producer
'五、Dashboard 管理控制台
5.1 Docker 安装(最简方式)
已在 Docker Compose 中包含。如需单独安装:
docker run -d \
--name rocketmq-dashboard \
--network host \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=127.0.0.1:9876 -Dserver.port=18080" \
--restart unless-stopped \
apacherocketmq/rocketmq-dashboard:2.1.0启动后浏览器访问:
- 内网访问:
http://192.xxx.xxx.141:18080 - 公网访问:
http://180.xxx.xxx.201:18080(需云平台安全组放行 18080 端口)
Dashboard 无需登录,开箱即用。如公网无法访问,检查防火墙和安全组:
# 服务器防火墙放行
sudo firewall-cmd --permanent --add-port=18080/tcp
sudo firewall-cmd --reload
# 云平台安全组:控制台添加入站规则 TCP 180805.2 源码安装
# 下载源码
git clone https://github.com/apache/rocketmq-dashboard.git
cd rocketmq-dashboard
# 修改配置
vi src/main/resources/application.properties
# 设置 rocketmq.config.namesrvAddr=192.xxx.xxx.141:9876
# 编译
mvn clean package -Dmaven.test.skip=true
# 启动
java -jar target/rocketmq-dashboard-*.jar
# 访问 http://localhost:80805.3 Dashboard 功能
| 功能 | 说明 |
|---|---|
| 集群管理 | 查看 NameServer/Broker 节点状态、配置信息 |
| Topic 管理 | 创建/删除/查看 Topic、查看路由信息 |
| 消费者管理 | 查看消费组、消费进度、积压情况 |
| 生产者管理 | 查看生产者连接信息 |
| 消息查询 | 按 Topic/Message ID/Message Key 查询消息内容 |
| 消息轨迹 | 追踪消息全生命周期(需开启 traceTopicEnable) |
六、核心配置详解
- Linux 二进制部署:
/data/rocketmq/broker.conf(自定义)或$ROCKETMQ_HOME/conf/broker.conf - Docker 部署:
/opt/rocketmq-docker/conf/broker.conf(挂载到容器/home/rocketmq/conf/broker.conf) - JVM 配置:
$ROCKETMQ_HOME/bin/runbroker.sh和$ROCKETMQ_HOME/bin/runserver.sh
6.1 Broker 核心参数
| 参数 | 默认值 | 说明 |
|---|---|---|
brokerClusterName | DefaultCluster | 集群名称,同一集群的 Broker 必须一致 |
brokerName | broker-a | Broker 名称,主从 Broker 需同名 |
brokerId | 0 | 0=Master,>0 为 Slave |
brokerIP1 | 自动检测 | 必须设为实际 IP,多网卡/Docker 必配 |
namesrvAddr | — | NameServer 地址,多个用分号分隔 |
listenPort | 10911 | Broker 监听端口 |
storePathRootDir | $HOME/store | 存储根目录 |
storePathCommitLog | $HOME/store/commitlog | CommitLog 存储路径 |
flushDiskType | ASYNC_FLUSH | ASYNC_FLUSH(高性能) / SYNC_FLUSH(高可靠) |
brokerRole | ASYNC_MASTER | ASYNC_MASTER / SYNC_MASTER / SLAVE |
autoCreateTopicEnable | true | 生产环境必须设为 false |
fileReservedTime | 72 | 消息文件保留时间(小时) |
deleteWhen | 04 | 过期文件删除时间(凌晨 4 点) |
maxMessageSize | 4MB | 单条消息最大大小 |
diskMaxUsedSpaceRatio | 75 | 磁盘使用率阈值(%),超过开始清理 |
sendMessageThreadPoolNums | 1 | 发送消息线程池(建议 16-32) |
pullMessageThreadPoolNums | 32 | 拉取消息线程池 |
6.2 集群部署模式对比
| 模式 | 特点 | 配置 | 适用 |
|---|---|---|---|
| 多 Master 无 Slave | 无冗余,Master 宕机消息不可消费 | 每个 Broker brokerId=0 | 测试环境 |
| 多 Master 多 Slave(异步复制) | 高吞吐,Master 宕机可能丢少量消息 | brokerRole=ASYNC_MASTER / SLAVE | 多数生产场景 |
| 多 Master 多 Slave(同步复制) | 零丢失,性能略低 | brokerRole=SYNC_MASTER / SLAVE | 金融级场景 |
| DLedger 模式 | 基于 Raft 自动主从切换 | 使用 conf/dledger/ 模板 | 高可用自动容灾 |
七、生产环境优化
7.1 Linux 内核参数
/etc/sysctl.conf 或 /etc/sysctl.d/99-rocketmq.conf
cat > /etc/sysctl.d/99-rocketmq.conf << 'EOF'
# RocketMQ 生产优化内核参数
# 文件描述符
fs.file-max = 655350
# 内存映射区域数(RocketMQ 大量使用 mmap)
vm.max_map_count = 655360
# 虚拟内存 - 减少 swap 使用
vm.swappiness = 1
# 脏页刷写策略
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
vm.dirty_expire_centisecs = 3000
vm.dirty_writeback_centisecs = 500
# 网络优化
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
# TCP 缓冲区
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
EOF
# 生效
sudo sysctl -p /etc/sysctl.d/99-rocketmq.conf7.2 文件描述符限制
/etc/security/limits.d/99-rocketmq.conf
cat > /etc/security/limits.d/99-rocketmq.conf << 'EOF'
rocketmq soft nofile 655350
rocketmq hard nofile 655350
rocketmq soft nproc 655350
rocketmq hard nproc 655350
EOF7.3 磁盘 I/O 调度器
# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# SSD 推荐 none/noop
echo 'none' | sudo tee /sys/block/sda/queue/scheduler
# 持久化(CentOS Stream 9)
echo 'ACTION=="add|change", KERNEL=="sd*", ATTR{queue/scheduler}="none"' | \
sudo tee /etc/udev/rules.d/60-ioscheduler.rules7.4 禁用 Swap
# 临时禁用
sudo swapoff -a
# 永久禁用
sudo sed -i 's/^.*swap.*$/#&/' /etc/fstab八、多 Master 多 Slave 集群部署示例
以 2 Master + 2 Slave(异步复制)为例,假设 4 台服务器:
| 角色 | IP | brokerName | brokerId |
|---|---|---|---|
| NameServer-1 | 192.xxx.xxx.141 | — | — |
| NameServer-2 | 192.168.112.142 | — | — |
| Broker-a Master | 192.xxx.xxx.141 | broker-a | 0 |
| Broker-a Slave | 192.168.112.142 | broker-a | 1 |
| Broker-b Master | 192.168.112.143 | broker-b | 0 |
| Broker-b Slave | 192.168.112.144 | broker-b | 1 |
broker-a Master 配置 (/data/rocketmq/broker.conf):
brokerClusterName=ProductionCluster
brokerName=broker-a
brokerId=0
brokerIP1=192.xxx.xxx.141
namesrvAddr=192.xxx.xxx.141:9876;192.168.112.142:9876
listenPort=10911
storePathRootDir=/data/rocketmq/store
storePathCommitLog=/data/rocketmq/store/commitlog
flushDiskType=ASYNC_FLUSH
brokerRole=ASYNC_MASTER
autoCreateTopicEnable=false
fileReservedTime=72
deleteWhen=04broker-a Slave 配置:
brokerClusterName=ProductionCluster
brokerName=broker-a
brokerId=1
brokerIP1=192.168.112.142
namesrvAddr=192.xxx.xxx.141:9876;192.168.112.142:9876
listenPort=10911
storePathRootDir=/data/rocketmq/store
storePathCommitLog=/data/rocketmq/store/commitlog
flushDiskType=ASYNC_FLUSH
brokerRole=SLAVE
autoCreateTopicEnable=false
fileReservedTime=72
deleteWhen=04# 每台服务器启动 NameServer
nohup sh $ROCKETMQ_HOME/bin/mqnamesrv &
# 各 Master/Slave 启动 Broker
nohup sh $ROCKETMQ_HOME/bin/mqbroker \
-n '192.xxx.xxx.141:9876;192.168.112.142:9876' \
-c /data/rocketmq/broker.conf \
--enable-proxy &
# 验证集群
sh $ROCKETMQ_HOME/bin/mqadmin clusterList \
-n '192.xxx.xxx.141:9876;192.168.112.142:9876'九、mqadmin 运维工具
9.1 常用命令
# 设置 NameServer 地址
export NAMESRV_ADDR=localhost:9876
# ---------- 集群管理 ----------
mqadmin clusterList # 查看集群信息
mqadmin brokerStatus -b localhost:10911 # Broker 状态详情
# ---------- Topic 管理 ----------
mqadmin updateTopic -b localhost:10911 -t MyTopic -r 8 -w 8 # 创建 Topic
mqadmin topicList # 列出所有 Topic
mqadmin topicStatus -t MyTopic # 查看 Topic 状态
mqadmin topicRoute -t MyTopic # 查看 Topic 路由
mqadmin deleteTopic -c DefaultCluster -t MyTopic # 删除 Topic
# ---------- 消费者管理 ----------
mqadmin consumerProgress -g MyConsumerGroup # 查看消费进度
mqadmin consumerStatus -g MyConsumerGroup # 消费者状态
mqadmin consumerConnection -g MyConsumerGroup # 消费者连接信息
# ---------- 消息查询 ----------
mqadmin queryMsgByKey -t MyTopic -k myKey # 按 Key 查询
mqadmin queryMsgById -i msgId # 按消息 ID 查询
mqadmin printMsg -t MyTopic -c true # 打印 Topic 消息
# ---------- 重置消费位点 ----------
mqadmin resetOffsetByTime -g MyGroup -t MyTopic -s '2026-01-01#00:00:00:000'9.2 配置热更新
# 查看 Broker 配置
mqadmin getBrokerConfig -b localhost:10911
# 动态更新 Broker 配置(无需重启)
mqadmin updateBrokerConfig -b localhost:10911 -k sendMessageThreadPoolNums -v 32十、监控与告警
10.1 RocketMQ Exporter + Prometheus
# 下载 RocketMQ Exporter
git clone https://github.com/apache/rocketmq-exporter.git
cd rocketmq-exporter
# 编译
mvn clean package -Dmaven.test.skip=true
# 启动
java -jar target/rocketmq-exporter-*.jar \
--rocketmq.config.namesrvAddr=localhost:9876
# 默认监听 5557 端口,暴露 /metricsPrometheus 配置:
scrape_configs:
- job_name: 'rocketmq'
static_configs:
- targets: ['192.168.1.100:5557']
scrape_interval: 15s10.2 关键监控指标
| 指标 | 说明 | 告警阈值建议 |
|---|---|---|
rocketmq_broker_tps | Broker TPS | 根据基线设定 |
rocketmq_consumer_message_accum | 消费积压量 | > 10000 告警 |
rocketmq_broker_commitlog_disk_ratio | CommitLog 磁盘使用率 | > 70% 告警 |
rocketmq_producer_fail_total | 生产失败总数 | > 0 告警 |
rocketmq_group_consume_latency | 消费延迟 | > 1000ms 告警 |
十一、常见问题排查
11.1 启动失败
| 问题 | 原因 | 解决 |
|---|---|---|
内存不足 Cannot allocate memory | JVM 堆内存设置过大 | 调小 runbroker.sh 中 -Xms -Xmx |
| 端口被占用 | 其他进程占用 9876/10911 | `ss -tlnp \ |
connect to <ip>:9876 failed | NameServer 未启动或防火墙 | 检查 NameServer 状态及防火墙规则 |
| 权限不足 | 非 rocketmq 用户运行 | 确保数据目录权限正确 |
11.2 消息发送失败
| 问题 | 原因 | 解决 |
|---|---|---|
No route info of this topic | Topic 不存在或路由未同步 | 手动创建 Topic 或等待路由同步 |
SLAVE_NOT_AVAILABLE | Slave 未启动 | 检查 Slave Broker 状态 |
broker busy | Broker 负载过高 | 扩容或优化线程池配置 |
11.3 消费异常
| 问题 | 原因 | 解决 |
|---|---|---|
| 消费积压持续增长 | 消费速度 < 生产速度 | 增加消费者实例 / 增加队列数 |
| 重复消费 | 消费者重启或 Rebalance | 业务层实现幂等 |
| 消费组不存在 | 未自动创建且未手动创建 | mqadmin updateSubGroup 创建 |
11.4 日志位置
- NameServer 日志:
~/logs/rocketmqlogs/namesrv.log - Broker 日志:
~/logs/rocketmqlogs/broker_default.log - 存储相关:
~/logs/rocketmqlogs/store.log - Proxy 日志:
~/logs/rocketmqlogs/proxy.log - GC 日志:
~/logs/rocketmqlogs/broker_gc.log
十二、安全配置
12.1 ACL 访问控制
$ROCKETMQ_HOME/conf/plain_acl.yml
# $ROCKETMQ_HOME/conf/plain_acl.yml
globalWhiteRemoteAddresses:
- 10.10.103.*
- 192.168.0.*
accounts:
- accessKey: RocketMQ_Admin
secretKey: 12345678_CHANGE_ME
whiteRemoteAddress:
admin: true
- accessKey: RocketMQ_Producer
secretKey: ProducerPass_CHANGE_ME
whiteRemoteAddress:
admin: false
defaultTopicPerm: PUB
topicPerms:
- MyTopic=PUB
- accessKey: RocketMQ_Consumer
secretKey: ConsumerPass_CHANGE_ME
whiteRemoteAddress:
admin: false
defaultTopicPerm: SUB
defaultGroupPerm: SUB
groupPerms:
- MyConsumerGroup=SUB在 broker.conf 中启用:
aclEnable=true12.2 TLS 加密传输
# 在 broker.conf 中配置
tlsTestModeEnable=false
tlsEnable=true
tlsConfigFile=/data/rocketmq/tls.properties十三、停止与卸载
13.1 优雅停止
# 先停 Broker,再停 NameServer
sh $ROCKETMQ_HOME/bin/mqshutdown broker
sh $ROCKETMQ_HOME/bin/mqshutdown namesrv
# 或通过 systemd
sudo systemctl stop rocketmq-broker
sudo systemctl stop rocketmq-namesrv
# Docker 停止
docker compose down13.2 完全卸载
# 停止服务
sudo systemctl stop rocketmq-broker rocketmq-namesrv
sudo systemctl disable rocketmq-broker rocketmq-namesrv
# 删除 systemd 服务文件
sudo rm -f /etc/systemd/system/rocketmq-*.service
sudo systemctl daemon-reload
# 删除安装和数据目录
sudo rm -rf /opt/rocketmq
sudo rm -rf /data/rocketmq
# 删除用户日志
sudo rm -rf /home/rocketmq/logs
# 删除系统用户
sudo userdel -r rocketmq
# 清理环境变量
sudo rm -f /etc/profile.d/rocketmq.sh
# 清理内核参数
sudo rm -f /etc/sysctl.d/99-rocketmq.conf
sudo rm -f /etc/security/limits.d/99-rocketmq.conf
sudo sysctl --system十四、快速参考
默认端口
| 端口 | 组件 | 用途 |
|---|---|---|
| 9876 | NameServer | 服务发现 |
| 10911 | Broker | 主端口(客户端连接) |
| 10909 | Broker | VIP 通道 |
| 10912 | Broker | HA 主从复制 |
| 8080 | Proxy | gRPC 协议端口 |
| 8081 | Proxy | Remoting 协议端口 |
| 8080 | Dashboard | Web 管理界面(建议映射到 18080) |
关键路径速查
| 路径 | 说明 |
|---|---|
/opt/rocketmq/current/ | RocketMQ 安装目录(软链接) |
/opt/rocketmq/current/bin/ | 启动脚本、运维工具 |
/opt/rocketmq/current/conf/ | 预置配置模板目录 |
/data/rocketmq/broker.conf | 自定义 Broker 配置 |
/data/rocketmq/store/ | 消息存储数据目录 |
/data/rocketmq/store/commitlog/ | CommitLog 物理消息文件 |
/data/rocketmq/store/consumequeue/ | 逻辑消费队列索引 |
~/logs/rocketmqlogs/ | 运行日志目录 |
常用命令速查
# ===== 启停服务 =====
sudo systemctl start rocketmq-namesrv # 启动 NameServer
sudo systemctl start rocketmq-broker # 启动 Broker+Proxy
sudo systemctl stop rocketmq-broker # 停止 Broker
sudo systemctl status rocketmq-namesrv # 查看状态
# ===== 集群运维 =====
mqadmin clusterList -n localhost:9876 # 查看集群
mqadmin topicList -n localhost:9876 # 查看 Topic
mqadmin consumerProgress -g <group> # 消费进度
# ===== 日志查看 =====
tail -f ~/logs/rocketmqlogs/namesrv.log # NameServer 日志
tail -f ~/logs/rocketmqlogs/broker_default.log # Broker 日志