第二章:安装与部署

详细介绍 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 的核心概念和架构。

👉 核心概念与架构