RocketMQ集群安装配置完整指南

RocketMQ集群安装配置完整指南

一、RocketMQ简介

1.1 什么是RocketMQ?

RocketMQ是阿里巴巴开源的分布式消息中间件,具有高性能、高可靠、高吞吐的特点。

核心特性:

  • 分布式架构
  • 支持百万级QPS
  • 消息持久化
  • 顺序消息
  • 事务消息
  • 消息回溯

1.2 RocketMQ架构


┌─────────────────────────────────────────────────────────┐
│                      Name Server Cluster                    │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐               │
│  │NameSrv1 │  │NameSrv2 │  │NameSrv3 │               │
│  └─────────┘  └─────────┘  └─────────┘               │
└────────────────────────┬────────────────────────────────┘
                         │
        ┌───────────────┼───────────────┐
        │               │               │
        ▼               ▼               ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│  Broker Master1 │ │  Broker Master2 │ │  Broker Master3 │
│  (Slave1)     │ │  (Slave2)     │ │  (Slave3)     │
└─────────────┘ └─────────────┘ └─────────────┘

二、环境规划

2.1 集群规划

主机名 IP地址 角色 内存
mq-node01 10.0.0.11 NameSrv + Broker Master 8GB
mq-node02 10.0.0.12 NameSrv + Broker Master 8GB
mq-node03 10.0.0.13 NameSrv + Broker Master 8GB

2.2 软件版本

  • RocketMQ: 5.1.3
  • Java: JDK 1.8+
  • 系统: Ubuntu 22.04

三、安装RocketMQ

3.1 安装JDK


# 安装OpenJDK
sudo apt update
sudo apt install -y openjdk-8-jdk

# 验证安装
java -version

# 配置环境变量
cat >> ~/.bashrc << 'EOF'
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
EOF

source ~/.bashrc

3.2 下载RocketMQ


# 创建安装目录
sudo mkdir -p /opt/rocketmq
cd /opt/rocketmq

# 下载RocketMQ (阿里云镜像)
wget https://mirrors.aliyun.com/apache/rocketmq/5.1.3/rocketmq-all-5.1.3-bin-release.zip

# 解压
unzip rocketmq-all-5.1.3-bin-release.zip

# 重命名
mv rocketmq-all-5.1.3-bin-release 5.1.3

3.3 配置环境变量


# 编辑环境变量
cat >> /etc/profile.d/rocketmq.sh << 'EOF'
export ROCKETMQ_HOME=/opt/rocketmq/5.1.3
export PATH=$ROCKETMQ_HOME/bin:$PATH
export NAMESRV_ADDR=10.0.0.11:9876;10.0.0.12:9876
EOF

source /etc/profile.d/rocketmq.sh

# 验证
echo $ROCKETMQ_HOME

四、配置NameServer集群

4.1 创建配置文件


# 创建NameServer配置
cat > /opt/rocketmq/5.1.3/conf/namesrv/namesrv.conf << 'EOF'
# NameServer配置文件
listenPort=9876

# 集群名称
clusterName=DefaultCluster

# 是否允许Broker注册
registerBrokerEnable=true

# 是否开启顺序消息配置
orderMessageEnable=false

# 心跳检测时间间隔
heartbeatInterval=1000

4.2 创建启动脚本


# 创建NameServer启动脚本
cat > /opt/rocketmq/5.1.3/bin/namesrv-start.sh << 'EOF'
#!/bin/bash
nohup sh /opt/rocketmq/5.1.3/bin/mqnamesrv \
  -c /opt/rocketmq/5.1.3/conf/namesrv/namesrv.conf \
  > /opt/rocketmq/5.1.3/logs/namesrv.log 2>&1 &

echo "NameServer started"
EOF

chmod +x /opt/rocketmq/5.1.3/bin/namesrv-start.sh

4.3 创建systemd服务


# 创建NameServer systemd服务
cat > /etc/systemd/system/rocketmq-namesrv.service << 'EOF'
[Unit]
Description=RocketMQ NameServer
After=network.target

[Service]
Type=forking
ExecStart=/opt/rocketmq/5.1.3/bin/namesrv-start.sh
Restart=on-failure
User=root
LimitNOFILE=655350

[Install]
WantedBy=multi-user.target
EOF

# 启动服务
sudo systemctl daemon-reload
sudo systemctl enable rocketmq-namesrv
sudo systemctl start rocketmq-namesrv

# 检查状态
sudo systemctl status rocketmq-namesrv

五、配置Broker集群

5.1 Broker配置文件


# 创建Broker主配置
cat > /opt/rocketmq/5.1.3/conf/broker.conf << 'EOF'
# Broker配置文件

# 集群名称
brokerClusterName=DefaultCluster

# Broker名称
brokerName=broker-a

# Broker ID (0为主,大于0为从)
brokerId=0

# 删除文件时间点,默认凌晨4点
deleteWhen=04

# 文件保留时间(小时)
fileReservedTime=48

# Broker角色
brokerRole=ASYNC_MASTER

# 刷盘方式
flushDiskType=ASYNC_FLUSH

# NameServer地址
namesrvAddr=10.0.0.11:9876;10.0.0.12:9876;10.0.0.13:9876

# Broker IP地址
brokerIP1=10.0.0.11

# 监听端口
listenPort=10911

# 是否允许自动创建Topic
autoCreateTopicEnable=true

# 是否允许自动创建SubscriptionGroup
autoCreateSubscriptionGroup=true

# 消息存储路径
storePathRootDir=/opt/rocketmq/store
storePathCommitLog=/opt/rocketmq/store/commitlog

# 队列数量
defaultTopicQueueNums=8

# 消息最大大小(字节)
maxMessageSize=4194304

# 消息体大小阈值
messageSizeLimit=4194304

# 事务消息半消息阈值
tranMaxMessageSize=4194304
EOF

5.2 创建启动脚本


# 创建Broker启动脚本
cat > /opt/rocketmq/5.1.3/bin/broker-start.sh << 'EOF'
#!/bin/bash
nohup sh /opt/rocketmq/5.1.3/bin/mqbroker \
  -c /opt/rocketmq/5.1.3/conf/broker.conf \
  > /opt/rocketmq/5.1.3/logs/broker.log 2>&1 &

echo "Broker started"
EOF

chmod +x /opt/rocketmq/5.1.3/bin/broker-start.sh

5.3 创建systemd服务


# 创建Broker systemd服务
cat > /etc/systemd/system/rocketmq-broker.service << 'EOF'
[Unit]
Description=RocketMQ Broker
After=network.target rocketmq-namesrv.service

[Service]
Type=forking
ExecStart=/opt/rocketmq/5.1.3/bin/broker-start.sh
Restart=on-failure
User=root
LimitNOFILE=655350
Environment="JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64"

[Install]
WantedBy=multi-user.target
EOF

# 启动服务
sudo systemctl daemon-reload
sudo systemctl enable rocketmq-broker
sudo systemctl start rocketmq-broker

# 检查状态
sudo systemctl status rocketmq-broker

六、配置双主双从同步集群

6.1 集群规划

主机 IP Master Slave BrokerName
mq-node01 10.0.0.11 Master1 - broker-a
mq-node02 10.0.0.12 Master2 - broker-b
mq-node03 10.0.0.13 - Slave1 broker-a
mq-node04 10.0.0.14 - Slave2 broker-b

6.2 Master1配置(mq-node01)


cat > /opt/rocketmq/5.1.3/conf/broker-a-master.conf << 'EOF'
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
namesrvAddr=10.0.0.11:9876;10.0.0.12:9876;10.0.0.13:9876
brokerIP1=10.0.0.11
listenPort=10911
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
storePathRootDir=/opt/rocketmq/store
storePathCommitLog=/opt/rocketmq/store/commitlog
defaultTopicQueueNums=8
maxMessageSize=4194304
deleteWhen=04
fileReservedTime=48
EOF

6.3 Slave1配置(mq-node03)


cat > /opt/rocketmq/5.1.3/conf/broker-a-slave.conf << 'EOF'
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=1
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
namesrvAddr=10.0.0.11:9876;10.0.0.12:9876;10.0.0.13:9876
brokerIP1=10.0.0.13
listenPort=10911
autoCreateTopicEnable=true
storePathRootDir=/opt/rocketmq/store
storePathCommitLog=/opt/rocketmq/store/commitlog
EOF

七、验证集群

7.1 检查进程


# 在所有节点执行
jps

# 预期输出
# NameServer
# Broker

# 检查NameServer集群
sh mqadmin clusterList -n 10.0.0.11:9876

# 检查Broker状态
sh mqadmin brokerStatus -n 10.0.0.11:9876

7.2 测试消息


# 在任意节点执行

# 发送测试消息
sh tools.sh org.apache.rocketmq.example.quickstart.Producer

# 消费测试消息
sh tools.sh org.apache.rocketmq.example.quickstart.Consumer

7.3 使用控制台


# 安装rocketmq-console
# 下载地址: https://github.com/apache/rocketmq-externals

# 配置控制台
cat > application.properties << 'EOF'
server.port=8080
rocketmq.config.namesrvAddr=10.0.0.11:9876;10.0.0.12:9876;10.0.0.13:9876
rocketmq.config.isVIPChannel=false
EOF

# 启动控制台
java -jar rocketmq-console-ng-2.0.0.jar

八、常见问题

8.1 NameServer无法启动


# 检查端口是否被占用
netstat -tlnp | grep 9876

# 检查日志
tail -f /opt/rocketmq/5.1.3/logs/namesrv.log

# 解决方案
# 1. 杀掉占用端口的进程
# 2. 修改端口配置

8.2 Broker无法连接NameServer


# 检查NameServer是否正常
telnet 10.0.0.11 9876

# 检查配置文件中的NameServer地址
cat /opt/rocketmq/5.1.3/conf/broker.conf | grep namesrvAddr

# 防火墙放行
sudo ufw allow 9876
sudo ufw allow 10911

8.3 消息积压


# 查看压情况
sh mqadmin consumerProgress消息积 -n 10.0.0.11:9876

# 解决方案
# 1. 增加消费者数量
# 2. 增加队列数量
# 3. 优化消费者逻辑

九、性能优化

9.1 JVM参数优化


# 编辑runbroker.sh
cat >> /opt/rocketmq/5.1.3/bin/runbroker.sh << 'EOF'
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g"
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC"
JAVA_OPT="${JAVA_OPT} -XX:G1HeapRegionSize=16m"
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC"
JAVA_OPT="${JAVA_OPT} -XX:MaxGCPauseMillis=150"
JAVA_OPT="${JAVA_OPT} -XX:+ParallelRefProcEnabled"
JAVA_OPT="${JAVA_OPT} -XX:+UseLargePagesInMetaspace"
EOF

9.2 Linux内核参数优化


# 编辑/etc/sysctl.conf
cat >> /etc/sysctl.conf << 'EOF'
# RocketMQ优化
fs.file-max = 655350
vm.overcommit_memory = 1
vm.max_map_count = 262144
EOF

# 应用配置
sysctl -p

十、总结

本文介绍了RocketMQ集群的完整安装配置,包括:

✅ 单Master集群安装 ✅ NameServer集群配置 ✅ Broker主从同步配置 ✅ 双主双从集群规划 ✅ 集群验证和测试 ✅ 常见问题排查 ✅ 性能优化配置

生产环境建议:

  • 至少部署3个NameServer节点
  • Broker采用主从同步模式
  • 配置消息持久化
  • 开启消息重试机制
  • 部署RocketMQ Console控制台
  • 参考文档:

  • RocketMQ官方文档: https://rocketmq.apache.org/
  • RocketMQ GitHub: https://github.com/apache/rocketmq

发表回复

后才能评论