Skip to content

RocketMQ 5.2.0 部署

部署模式

  • 多节点(集群)多副本模式-异步复制
  • Proxy 采用 Local 模式部署

步骤

0、环境初始化

shell
1、关闭 firewalld,关闭开机自启动
systemctl stop firewalld
systemctl disable firewalld

2、关闭 selinux,临时关闭,永久关闭
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

3、配置时间同步
crontab -e
*/2 * * * * /usr/sbin/ntpdate time.windows.com

4、配置 java 环境
yum install -y java-1.8.0-openjdk-devel.x86_64
java -version

1、下载二进制安装包

shell
cd /usr/local/src
wget https://dist.apache.org/repos/dist/release/rocketmq/5.2.0/rocketmq-all-5.2.0-bin-release.zip

# 解压到 /usr/local 目录下
unzip -d /usr/local/ rocketmq-all-5.2.0-bin-release.zip
mv /usr/local/rocketmq-all-5.2.0-bin-release/ /usr/local/rocketmq-5.2.0

2、部署 namesrv

2.1 修改 namesrv JVM 配置(根据服务器配置修改)

shell
vim /usr/local/rocketmq-5.2.0/bin/runserver.sh

![image-20240513171651345](/Users/juncai/Library/Application Support/typora-user-images/image-20240513171651345.png)

![image-20240513172035050](/Users/juncai/Library/Application Support/typora-user-images/image-20240513172035050.png)

2.2 配置 systemd 管理 namesrv

shell
cat > /usr/lib/systemd/system/rmq_namesrv.service << EOF
[Unit]
Description=rmq_namesrv.service
After=network.target

[Service]
Type=simple  
ExecStart=/usr/local/rocketmq-5.2.0/bin/mqnamesrv
ExecStop=/usr/local/rocketmq-5.2.0/bin/mqshutdown namesrv

[Install]
WantedBy=multi-user.target
EOF

2.3 启动 namesrv

shell
systemctl start rmq_namesrv.service

3、部署 Dashboard

shell
vim start.sh

#!/bin/bash

docker run -d \
  --name rocketmq-dashboard \
  -e "JAVA_OPTS=-Drocketmq.namesrv.addr=10.0.0.123:9876;10.0.0.124:9876" \
  -p 8080:8080 \
  apacherocketmq/rocketmq-dashboard:latest
  
# 启动容器
bash start.sh

4、部署 broker

4.1 创建数据存放目录

shell
mkdir -pv /data/rocketmq/store_{m,s}

4.2 修改配置文件

shell
### 配置项含义可参考:
https://rocketmq.apache.org/zh/docs/bestPractice/01bestpractice

cd /usr/local/rocketmq-5.2.0/conf/2m-2s-async

# 节点1 master
vim broker-a.properties

brokerClusterName=Test-rocketmq-cluster
brokerName=broker-a
brokerId=0
listenPort=10911
namesrvAddr=10.0.0.123:9876;10.0.0.124:9876
brokerIP1=10.0.0.123
storePathRootDir=/data/rocketmq/store_m/
storePathCommitLog=/data/rocketmq/store_m/commitlog/
storePathConsumerQueue=/data/rocketmq/store_m/consumequeue/
mapedFileSizeCommitLog=1024 * 1024 * 1024
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH

# 节点1 slave
vim broker-a-s.properties

brokerClusterName=Test-rocketmq-cluster
brokerName=broker-a
brokerId=1
listenPort=10921
namesrvAddr=10.0.0.123:9876;10.0.0.124:9876
brokerIP1=10.0.0.124
storePathRootDir=/data/rocketmq/store_s/
storePathCommitLog=/data/rocketmq/store_s/commitlog/
storePathConsumerQueue=/data/rocketmq/store_s/consumequeue/
mapedFileSizeCommitLog=1024 * 1024 * 1024
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH


# 节点2 master
vim broker-b.properties

brokerClusterName=Test-rocketmq-cluster
brokerName=broker-b
brokerId=0
listenPort=10911
namesrvAddr=10.0.0.123:9876;10.0.0.124:9876
brokerIP1=10.0.0.124
storePathRootDir=/data/rocketmq/store_m/
storePathCommitLog=/data/rocketmq/store_m/commitlog/
storePathConsumerQueue=/data/rocketmq/store_m/consumequeue/
mapedFileSizeCommitLog=1024 * 1024 * 1024
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH

# 节点2 slave
vim broker-b-s.properties

brokerClusterName=Test-rocketmq-cluster
brokerName=broker-b
brokerId=1
listenPort=10921
namesrvAddr=10.0.0.123:9876;10.0.0.124:9876
brokerIP1=10.0.0.123
storePathRootDir=/data/rocketmq/store_s/
storePathCommitLog=/data/rocketmq/store_s/commitlog/
storePathConsumerQueue=/data/rocketmq/store_s/consumequeue/
mapedFileSizeCommitLog=1024 * 1024 * 1024
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH

4.3 修改 broker JVM 配置(根据服务器配置修改)

![image-20240514092158959](/Users/juncai/Library/Application Support/typora-user-images/image-20240514092158959.png)

![image-20240514135137515](/Users/juncai/Library/Application Support/typora-user-images/image-20240514135137515.png)

4.4 配置 systemd 管理 broker

  • 停止服务时有坑,如果是同一台机器部署了多个 broker,会一次性都停掉
shell
# 节点1 master
vim /usr/lib/systemd/system/rmq_broker_m.service

[Unit]
Description=rmq
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/rocketmq-5.2.0//bin/mqbroker -c /usr/local/rocketmq-5.2.0/conf/2m-2s-async/broker-a.properties
ExecStop=/usr/local/rocketmq-5.2.0//bin/mqshutdown broker

[Install]
WantedBy=multi-user.target

# 节点1 slave
vim /usr/lib/systemd/system/rmq_broker_s.service

[Unit]
Description=rmq
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/rocketmq-5.2.0//bin/mqbroker -c /usr/local/rocketmq-5.2.0/conf/2m-2s-async/broker-a-s.properties
ExecStop=/usr/local/rocketmq-5.2.0//bin/mqshutdown broker

[Install]
WantedBy=multi-user.target

# 节点2 master
vim /usr/lib/systemd/system/rmq_broker_m.service

[Unit]
Description=rmq
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/rocketmq-5.2.0//bin/mqbroker -c /usr/local/rocketmq-5.2.0/conf/2m-2s-async/broker-b.properties
ExecStop=/usr/local/rocketmq-5.2.0//bin/mqshutdown broker

[Install]
WantedBy=multi-user.target

# 节点2 slave
vim /usr/lib/systemd/system/rmq_broker_s.service

[Unit]
Description=rmq
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/rocketmq-5.2.0//bin/mqbroker -c /usr/local/rocketmq-5.2.0/conf/2m-2s-async/broker-b-s.properties
ExecStop=/usr/local/rocketmq-5.2.0//bin/mqshutdown broker

[Install]
WantedBy=multi-user.target

4.5 启动 broker

shell
# 节点1
systemctl start rmq_broker_m.service
systemctl start rmq_broker_s.service

# 节点2
systemctl start rmq_broker_m.service
systemctl start rmq_broker_s.service

4.6 broker 配置项解析

shell
# 查看 broker 启动时支持的参数
./bin/mqbroker -h
./bin/mqbroker --help

# 查看 broker 的重要配置参数
./bin/mqbroker -m

# 查看 broker 的所有配置参数
./bin/mqbroker -p
shell
# 集群名称
brokerClusterName=Test-rocketmq-cluster

# 节点名称
brokerName=broker-a

# 节点ID,0 表示 master, 其他的正整数表示 slave
brokerId=0

# 接受客户端连接的监听端口
listenPort=10911

# nameServer 地址
namesrvAddr=10.0.0.123:9876;10.0.0.124:9876

# 当前 broker 监听的 IP
brokerIP1=10.0.0.123

# 数据存储路径
storePathRootDir=/data/rocketmq/store_m/

# CommitLog 存储路径
storePathCommitLog=/data/rocketmq/store_m/commitlog/

# 消费队列存储路径
storePathConsumerQueue=/data/rocketmq/store_m/consumequeue/

# commitLog 映射文件大小,默认为1G,即 1024 * 1024 * 1024
mapedFileSizeCommitLog=1024 * 1024 * 1024

# 在每天的什么时间删除已经超过文件保留时间的 commit log,默认凌晨 4 点
deleteWhen=04

# 以小时计算的文件保留时间
fileReservedTime=48

# Broker 的角色
# - ASYNC_MASTER 异步复制Master
# - SYNC_MASTER 同步双写Master
# - SLAVE
brokerRole=ASYNC_MASTER

# 刷盘方式
# - ASYNC_FLUSH 异步刷盘
# - SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH

# 是否允许 Broker 自动创建 Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true

# 是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true

# 在发送消息时,自动创建服务器不存在的 topic,默认创建的队列数
defaultTopicQueueNums=8

# 发消息线程池数量
sendMessageThreadPoolNums=4

# 拉消息线程池数量
pullMessageThreadPoolNums=24

# 检测物理文件磁盘空间
diskMaxUsedSpaceRatio=75

5、部署rocketmq-exporter

参考链接

cat > /usr/lib/systemd/system/rmq_exporter.service << EOF
[Unit]
Description=rocketmq_exporter
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/bin/java -jar /usr/local/rocketmq-exporter/target/rocketmq-exporter-0.0.2-exec.jar --rocketmq.config.namesrvAddr=10.0.0.123:9876

[Install]
WantedBy=multi-user.target
EOF

6、mqadmin 命令使用

shell
# 查看 mqadmin 帮助信息
./bin/mqadmin

# 查看集群信息
./bin/mqadmin clusterList -n "10.0.0.123:9876;10.0.0.124:9876"

# 查看集群所有 broker 运行状态
./bin/mqadmin brokerStatus -n "10.0.0.123:9876;10.0.0.124:9876" -c Test-rocketmq-cluster

# 查看指定 broker 运行状态(不可添加 -c 参数,报冲突)
./bin/mqadmin brokerStatus -n "10.0.0.123:9876;10.0.0.124:9876" -b 10.0.0.123:10911

# 查看集群所有 broker 的配置
./bin/mqadmin getBrokerConfig -n "10.0.0.123:9876;10.0.0.124:9876"

# 查看指定 broker 的配置
./bin/mqadmin getBrokerConfig -n "10.0.0.123:9876;10.0.0.124:9876" -b 10.0.0.123:10911

#### 不建议使用 updateBrokerConfig 更新配置,5.2.0版本测试会将更新后的配置写入配置文件,导致配置文件增加很多默认配置项,影响阅读 ####
# 更新集群 master broker 的某一配置
./bin/mqadmin updateBrokerConfig -n "10.0.0.123:9876;10.0.0.124:9876" -c Test-rocketmq-cluster -k fileReservedTime -v 72

# 更新集群所有 broker 的某一配置
1、 指定所有节点IP和端口
./bin/mqadmin updateBrokerConfig -n "10.0.0.123:9876;10.0.0.124:9876" -c Test-rocketmq-cluster -k fileReservedTime -v 80 -a "10.0.0.123:10911;10.0.0.123:10921;10.0.0.124:10911;10.0.0.124:10921"
2、指定节点IP,同一台服务器上若有多个 broker 会一并更新
./bin/mqadmin updateBrokerConfig -n "10.0.0.123:9876;10.0.0.124:9876" -c Test-rocketmq-cluster -k fileReservedTime -v 80 -a "10.0.0.123;10.0.0.124
3、使用 all
./bin/mqadmin updateBrokerConfig -n "10.0.0.123:9876;10.0.0.124:9876" -c Test-rocketmq-cluster -k fileReservedTime -v 80 -a all

# 更新指定 broker 的某一配置
./bin/mqadmin updateBrokerConfig -n "10.0.0.123:9876;10.0.0.124:9876" -b 10.0.0.123:10921 -k fileReservedTime -v 66

# 查看 Topic 信息
./bin/mqadmin topicStatus -n "10.0.0.123:9876;10.0.0.124:9876" -t TopicTest

7、集群扩容节点

7.1 不扩容nameserver

​ 按照原先的节点配置启动 master 和 slave 类型的 broker 服务,节点即可加入集群;

​ 扩容现有 Topic 的 MessageQueue 到新节点;

7.2 扩容nameserver

​ 启动需新增的 nameserver,修改集群现有 broker 配置增加 nameserver,重启 broker;

​ 启动需新增的 master 和 slave broker 服务,节点自动加入现有集群;

​ 扩容现有 Topic 的 MessageQueue 到新节点;

8、集群缩容节点

8.1 不缩容nameserver

​ a、关闭 broker 写权限

shell
# 6:读写状态,当前队列允许读取消息和写入消息。
# 4:只读状态,当前队列只允许读取消息,不允许写入消息。
# 2:只写状态,当前队列只允许写入消息,不允许读取消息。
# 0:不可读写状态,当前队列不允许读取消息和写入消息。
./bin/mqadmin updateBrokerConfig -n "10.0.0.123:9876;10.0.0.124:9876" -b 10.0.0.191:10911 -k brokerPermission -v 4

​ b、验证broker流量情况

shell
# 对应 Broker 的 InTPS(LOAD) OutTPS(LOAD) 两列的值为 0,表明该节点已无流量
./bin/mqadmin clusterList -n "10.0.0.123:9876;10.0.0.124:9876"

​ c、验证broker积压情况

shell
# 最后一行 Diff Total 等于 0 时表示该节点已经没有积压,即全部消费完毕
./bin/mqadmin brokerConsumeStats -n "10.0.0.123:9876;10.0.0.124:9876" -b 10.0.0.191:10911

​ d、下线节点,关闭对应的 broker 服务即可

8.2 缩容 nameserver

​ a、修改 broker 配置,删除需要缩容的 nameserver,重启 broker 服务;

​ b、关闭需缩容的 nameserve;

​ c、剩余步骤参照不缩容 nameserver 操作即可;

9、Dledger 集群部署

9.1 集群配置

shell
############### 10.0.0.123 ###############

cat /usr/local/rocketmq-5.2.0/conf/dledger/broker-node00-n0.conf 

brokerClusterName = RaftCluster
brokerName=RaftNode00
listenPort=30911
namesrvAddr=10.0.0.123:9876;10.0.0.124:9876
storePathRootDir=/data/rocketmq/dledger/node00
storePathCommitLog=/data/rocketmq/dledger/node00/commitlog
enableDLegerCommitLog=true
dLegerGroup=RaftNode00
# 端口和 listenPort 端口不能一致
dLegerPeers=n0-10.0.0.123:40911;n1-10.0.0.124:40911;n2-10.0.0.191:40911
## must be unique
dLegerSelfId=n0
sendMessageThreadPoolNums=16


cat /usr/local/rocketmq-5.2.0/conf/dledger/broker-node01-n0.conf 

brokerClusterName = RaftCluster
brokerName=RaftNode01
listenPort=30921
namesrvAddr=10.0.0.123:9876;10.0.0.124:9876
storePathRootDir=/data/rocketmq/dledger/node01
storePathCommitLog=/data/rocketmq/dledger/node01/commitlog
enableDLegerCommitLog=true
dLegerGroup=RaftNode01
dLegerPeers=n0-10.0.0.123:40921;n1-10.0.0.124:40921;n2-10.0.0.191:40921
## must be unique
dLegerSelfId=n0
sendMessageThreadPoolNums=16


############### 10.0.0.124 ###############

cat /usr/local/rocketmq-5.2.0/conf/dledger/broker-node00-n1.conf 

brokerClusterName = RaftCluster
brokerName=RaftNode00
listenPort=30911
namesrvAddr=10.0.0.123:9876;10.0.0.124:9876
storePathRootDir=/data/rocketmq/dledger/node00
storePathCommitLog=/data/rocketmq/dledger/node00/commitlog
enableDLegerCommitLog=true
dLegerGroup=RaftNode00
dLegerPeers=n0-10.0.0.123:40911;n1-10.0.0.124:40911;n2-10.0.0.191:40911
## must be unique
dLegerSelfId=n1
sendMessageThreadPoolNums=16


cat /usr/local/rocketmq-5.2.0/conf/dledger/broker-node01-n1.conf 

brokerClusterName = RaftCluster
brokerName=RaftNode01
listenPort=30921
namesrvAddr=10.0.0.123:9876;10.0.0.124:9876
storePathRootDir=/data/rocketmq/dledger/node01
storePathCommitLog=/data/rocketmq/dledger/node01/commitlog
enableDLegerCommitLog=true
dLegerGroup=RaftNode01
dLegerPeers=n0-10.0.0.123:40921;n1-10.0.0.124:40921;n2-10.0.0.191:40921
## must be unique
dLegerSelfId=n1
sendMessageThreadPoolNums=16


############### 10.0.0.191 ###############

cat /usr/local/rocketmq-5.2.0/conf/dledger/broker-node00-n2.conf

brokerClusterName = RaftCluster
brokerName=RaftNode00
listenPort=30911
namesrvAddr=10.0.0.123:9876;10.0.0.124:9876
storePathRootDir=/data/rocketmq/dledger/node00
storePathCommitLog=/data/rocketmq/dledger/node00/commitlog
enableDLegerCommitLog=true
dLegerGroup=RaftNode00
dLegerPeers=n0-10.0.0.123:40911;n1-10.0.0.124:40911;n2-10.0.0.191:40911
## must be unique
dLegerSelfId=n2
sendMessageThreadPoolNums=16


cat /usr/local/rocketmq-5.2.0/conf/dledger/broker-node01-n2.conf

brokerClusterName = RaftCluster
brokerName=RaftNode01
listenPort=30921
namesrvAddr=10.0.0.123:9876;10.0.0.124:9876
storePathRootDir=/data/rocketmq/dledger/node01
storePathCommitLog=/data/rocketmq/dledger/node01/commitlog
enableDLegerCommitLog=true
dLegerGroup=RaftNode01
dLegerPeers=n0-10.0.0.123:40921;n1-10.0.0.124:40921;n2-10.0.0.191:40921
## must be unique
dLegerSelfId=n2
sendMessageThreadPoolNums=16

9.2 启动服务

shell
############### 10.0.0.123 ###############
nohup ./bin/mqnamesrv &
nohup sh bin/mqbroker -c conf/dledger/broker-node00-n0.conf &
nohup sh bin/mqbroker -c conf/dledger/broker-node01-n0.conf &

############### 10.0.0.124 ###############
nohup ./bin/mqnamesrv &
nohup sh bin/mqbroker -c conf/dledger/broker-node00-n1.conf &
nohup sh bin/mqbroker -c conf/dledger/broker-node01-n1.conf &

############### 10.0.0.191 ###############
nohup sh bin/mqbroker -c conf/dledger/broker-node00-n2.conf &
nohup sh bin/mqbroker -c conf/dledger/broker-node01-n2.conf &

![image-20240516154447184](/Users/juncai/Library/Application Support/typora-user-images/image-20240516154447184.png)

总结

消息存储时长

  • RocketMQ 按照服务端节点粒度管理存储时长而非队列或主题,消息存储时长由 broker 参数 fileReservedTime 控制,默认 48 小时,设置单位默认为小时,尝试设置 10m 、或者 0.5(30分钟)未生效,猜测默认单位不可修改,设置的值只能为整数;

MessageQueue

  • 若节点关机时上面已有 Topic 的 MessageQueue 在节点重新加入集群时仍可用,即使在节点关机过程中修改了 Topic 的 MessageQueue 数量;

  • 集群节点扩容后,需增加 Topic 的 MessageQueue 到新节点后才会将消息发送到新节点;

  • 在控制台缩减 Topic 的 MessageQueue 数量,即使不选择某一节点,也不会将该节点的 MessageQueue 数量减小为 0,而是会将所有节点上的 MessageQueue 数量设置为你配置的值;