第二章:安装与部署
详细介绍 RocketMQ 的各种安装方式和部署架构。
最后更新: 2024-01-15
页面目录
RocketMQ 安装与部署
本章介绍 RocketMQ 的各种安装方式和部署架构。
系统要求
硬件要求
| 配置 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU | 2 核 | 4+ 核 |
| 内存 | 4 GB | 8+ GB |
| 磁盘 | 100 GB | 200+ GB SSD |
| 操作系统 | Linux | Linux (推荐) |
软件要求
- JDK:JDK 8 或 JDK 11
- 操作系统:Linux (CentOS/Ubuntu)
- Maven:3.8+ (编译安装)
快速安装
下载二进制包
# 下载 RocketMQ 5.x
wget https://dlcdn.apache.org/rocketmq/5.1.0/rocketmq-all-5.1.0-bin-release.zip
# 或使用 RocketMQ 4.x
wget https://archive.apache.org/dist/rocketmq/4.9.4/rocketmq-4.9.4-bin-release.zip
# 解压
unzip rocketmq-5.1.0-bin-release.zip
cd rocketmq-5.1.0
目录结构
rocketmq-5.1.0/
├── bin/ # 可执行脚本
│ ├── mqnamesrv # NameServer 启动脚本
│ ├── mqbroker # Broker 启动脚本
│ ├── mqadmin # 管理工具
│ └── mqshutdown # 关闭脚本
├── conf/ # 配置文件
│ ├── 2m-2s-async/ # 2主2从异步配置
│ ├── 2m-2s-sync/ # 2主2从同步配置
│ ├── 2m-noslave/ # 2主配置
│ └── dledger/ # DLedger 配置
├── lib/ # 依赖库
└── logs/ # 日志目录
单机部署
1. 配置环境变量
# 编辑环境变量
echo 'export ROCKETMQ_HOME=/opt/rocketmq-5.1.0' >> ~/.bashrc
echo 'export PATH=$PATH:$ROCKETMQ_HOME/bin' >> ~/.bashrc
source ~/.bashrc
2. 启动 NameServer
# 修改 JVM 参数(可选)
export JAVA_OPT="-Xms512m -Xmx512m -Xmn256m"
# 启动 NameServer
nohup sh bin/mqnamesrv &
# 查看日志
tail -f logs/namesrv.log
验证 NameServer 启动成功:
# 检查 NameServer 状态
tail -n 20 logs/namesrv.log
# 应该看到类似输出:
# The Name Server boot success...
3. 启动 Broker
# 创建配置文件 broker.conf
cat > conf/broker.conf << EOF
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
listenPort = 10911
namesrvAddr = 127.0.0.1:9876
defaultTopicQueueNums = 4
autoCreateTopicEnable = true
autoCreateSubscriptionGroup = true
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
EOF
# 启动 Broker
nohup sh bin/mqbroker -n 127.0.0.1:9876 -c conf/broker.conf &
# 查看日志
tail -f logs/broker.log
4. 验证安装
# 使用 tools.sh 发送测试消息
export NAMESRV_ADDR=127.0.0.1:9876
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
# 使用 tools.sh 接收测试消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
Docker 部署
Docker 单机部署
# 拉取镜像
docker pull apache/rocketmq:5.1.0
# 创建网络
docker network create rocketmq-net
# 启动 NameServer
docker run -d \
--name rmqnamesrv \
--network rocketmq-net \
-p 9876:9876 \
apache/rocketmq:5.1.0 \
sh mqnamesrv
# 启动 Broker
docker run -d \
--name rmqbroker \
--network rocketmq-net \
-p 10911:10911 \
-p 10909:10909 \
-e "NAMESRV_ADDR=rmqnamesrv:9876" \
apache/rocketmq:5.1.0 \
sh mqbroker -n rmqnamesrv:9876 -c /home/rocketmq/rocketmq-5.1.0/conf/broker.conf
Docker Compose 部署
# docker-compose.yml
version: '3.8'
services:
namesrv:
image: apache/rocketmq:5.1.0
container_name: rmqnamesrv
ports:
- "9876:9876"
command: sh mqnamesrv
networks:
- rocketmq-net
volumes:
- namesrv-data:/home/rocketmq/logs
environment:
- JAVA_OPT="-Xms512m -Xmx512m"
broker:
image: apache/rocketmq:5.1.0
container_name: rmqbroker
ports:
- "10911:10911"
- "10909:10909"
depends_on:
- namesrv
command: sh mqbroker -n namesrv:9876 -c /home/rocketmq/rocketmq-5.1.0/conf/broker.conf
networks:
- rocketmq-net
volumes:
- broker-data:/home/rocketmq/store
- ./broker.conf:/home/rocketmq/rocketmq-5.1.0/conf/broker.conf
environment:
- NAMESRV_ADDR=namesrv:9876
- JAVA_OPT="-Xms1g -Xmx1g -Xmn512m"
networks:
rocketmq-net:
driver: bridge
volumes:
namesrv-data:
broker-data:
RocketMQ Dashboard
# 启动管理控制台
docker run -d \
--name rocketmq-dashboard \
-p 8080:8080 \
-e "ROCKETMQ_NAMESRV_ADDR=rmqnamesrv:9876" \
apacherocketmq/rocketmq-dashboard:latest
访问控制台:http://localhost:8080
集群部署
主从集群配置
2主2从同步集群
# broker-a 主节点配置
cat > conf/2m-2s-sync/broker-a.properties << EOF
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
listenPort=10911
namesrvAddr=namesrv1:9876;namesrv2:9876
defaultTopicQueueNums=4
storePathRootDir=/home/rocketmq/store-a
storePathCommitLog=/home/rocketmq/store-a/commitlog
brokerRole=SYNC_MASTER
flushDiskType=ASYNC_FLUSH
EOF
# broker-a 从节点配置
cat > conf/2m-2s-sync/broker-a-s.properties << EOF
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=1
listenPort=10921
namesrvAddr=namesrv1:9876;namesrv2:9876
defaultTopicQueueNums=4
storePathRootDir=/home/rocketmq/store-a-s
storePathCommitLog=/home/rocketmq/store-a-s/commitlog
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
EOF
DLedger 集群
RocketMQ 4.5+ 支持基于 DLedger 的自动故障转移。
# 创建 DLedger 配置目录
mkdir -p conf/dledger
# DLedger Broker 配置
cat > conf/dledger/broker.conf << EOF
brokerClusterName = DefaultCluster
brokerName = broker-d
listenPort = 10911
namesrvAddr = namesrv1:9876;namesrv2:9876;namesrv3:9876
storePathRootDir = /home/rocketmq/store/dledger
enableDLegerCommitLog = true
dLegerGroup = broker-d
dLegerPeers = n0=namesrv1:40911;n1=namesrv2:40911;n2=namesrv3:40911
dLegerSelfId = n0
sendMessageThreadPoolNums = 16
EOF
启动集群
#!/bin/bash
# cluster-startup.sh
# 启动 NameServer 集群
ssh namesrv1 "cd /rocketmq && nohup sh bin/mqnamesrv &"
ssh namesrv2 "cd /rocketmq && nohup sh bin/mqnamesrv &"
ssh namesrv3 "cd /rocketmq && nohup sh bin/mqnamesrv &"
sleep 5
# 启动 Broker 节点
ssh broker1 "cd /rocketmq && nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-a.properties &"
ssh broker2 "cd /rocketmq && nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-b.properties &"
ssh broker3 "cd /rocketmq && nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-a-s.properties &"
ssh broker4 "cd /rocketmq && nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-b-s.properties &"
echo "RocketMQ 集群启动完成"
常见问题
1. 内存不足
# 修改 bin/runserver.sh
JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
2. 端口冲突
# 检查端口占用
netstat -tlnp | grep 10911
# 修改 broker.conf 中的端口
listenPort = 10912
3. Broker 无法连接 NameServer
# 检查 NameServer 状态
telnet namesrv1 9876
# 检查防火墙
firewall-cmd --list-ports
卸载
# 停止服务
sh bin/mqshutdown broker
sh bin/mqshutdown namesrv
# 删除数据目录
rm -rf store/
rm -rf logs/
# 删除安装目录
rm -rf /opt/rocketmq-5.1.0
下一步
接下来让我们学习 RocketMQ 的核心概念和架构。
👉 核心概念与架构