Linux 安装 RocketMQ 单机实例

大纲

前言

本文将介绍如何在 Linux 上安装单机版的 RocketMQ,包括 RocketMQ 服务端和 RocketMQ 控制台,适用于 CentOS / Debian / Ubuntu 等 Linux 发行版。

学习资源

版本说明

组件版本说明
RocketMQ Server4.9.0RocketMQ 服务端(包括 NameServer 和 Broker),运行时依赖 JDK 1.8+,NameServer 默认监听 9876 端口,Broker 默认监听 10911 端口
RocketMQ Console1.0.0RocketMQ 控制台,编译源码时依赖 JDK 1.7,运行时依赖 JDK 1.7+,默认监听 8080 端口

RocketMQ 服务端安装

创建用户

特别注意

本文所有命令默认都是在 rocketmq 用户权限下执行,除了特别说明除外(比如 sudo xxxx 命令)。

  • 创建用户组
1
sudo groupadd rocketmq
  • 创建用户(禁止登录)
1
sudo useradd -g rocketmq -m -s /sbin/nologin rocketmq
  • 切换用户
1
sudo -u rocketmq -s

准备工作

版本说明

RocketMQ 的服务端(4.9.0 版本)包含两个服务,分别是 NameServer 和 Broker 服务,这两个服务都需要单独启动,且运行时都依赖 JDK 1.8+

JDK 手动安装

  • 下载并安装 JDK(1.8 版本)
1
2
3
4
5
6
7
8
# 下载文件(OpenJDK 1.8,Azul Zulu 发行版)
wget https://cdn.azul.com/zulu/bin/zulu8.76.0.17-ca-jdk8.0.402-linux_x64.tar.gz

# 解压文件
tar -zxvf zulu8.76.0.17-ca-jdk8.0.402-linux_x64.tar.gz

# 移动文件
sudo mv zulu8.76.0.17-ca-jdk8.0.402-linux_x64 /usr/local/jdk-1.8.0_402

全局环境变量配置

  • 配置系统环境变量
1
2
# 编辑系统配置文件,在文件末尾添加以下内容
sudo vi /etc/profile
1
2
export JAVA_HOME=/usr/local/jdk-1.8.0_402
export PATH=$JAVA_HOME/bin:$PATH
  • 让系统环境变量生效
1
sudo source /etc/profile

用户环境变量配置

1
2
# 切换至 rocketmq 用户
sudo -u rocketmq -s
1
2
# 编辑用户配置文件,在文件末尾添加以下内容
vi ~/.bashrc
1
2
export JAVA_HOME=/usr/local/jdk-1.8.0_402
export PATH=$JAVA_HOME/bin:$PATH
  • 让用户环境变量生效
1
source ~/.bashrc

验证 JDK 安装

1
java -version

软件下载

RocketMQ 官网 下载对应版本的二进制压缩包(比如 rocketmq-all-4.9.0-bin-release.zip),如下图所示:

  • 安装工具
1
2
3
4
5
# CentOS、Fedora
sudo yum install -y wget unzip

# Debian、Ubuntu
sudo apt install -y wget unzip
  • 下载文件
1
wget https://archive.apache.org/dist/rocketmq/4.9.0/rocketmq-all-4.9.0-bin-release.zip
  • 解压文件
1
2
3
4
5
6
7
8
# 解压文件
unzip rocketmq-all-4.9.0-bin-release.zip

# 解压目录重命名
mv rocketmq-all-4.9.0-bin-release rocketmq-all-4.9.0

# 进入解压目录
cd rocketmq-all-4.9.0

配置步骤

更改 NameServer 的 JVM 配置参数

  • 编辑 runserver.sh 脚本文件,根据物理内存大小修改 NameServer 的 JVM 配置参数
1
2
# 编辑 NameServer 的启动脚本文件,更改以下内容
vi bin/runserver.sh
1
JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

更改 Broker 的 JVM 配置参数

  • 编辑 runbroker.sh 脚本文件,根据物理内存大小修改 Broker 的 JVM 配置参数
1
2
# 编辑 Broker 的启动脚本文件,更改以下内容
vi bin/runbroker.sh
1
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g"

创建 Broker 的数据存储目录

1
2
3
4
# 创建 Broker 的数据存储目录(默认是在用户主目录下)
mkdir -p ~/store/index
mkdir -p ~/store/commitlog
mkdir -p ~/store/consumequeue

启动服务

启动 RocketMQ 的 NameServer 服务

  • 启动 NameServer
1
2
3
4
5
# 进入 RocketMQ 的安装目录
cd rocketmq-all-4.9.0

# 后台启动 NameServer,默认监听 9876 端口
nohup sh bin/mqnamesrv &
  • 查看 NameServer 的进程信息
1
ps -aux|grep namesrv
  • 查看 NameServer 的日志信息
1
2
# 查看 NameServer 的日志信息(如下所示)
tail -f ~/logs/rocketmqlogs/namesrv.log
1
2
3
4
5
6
7
8
9
10
11
12
2021-07-05 22:26:29 INFO main - tls.client.keyPassword = null
2021-07-05 22:26:29 INFO main - tls.client.certPath = null
2021-07-05 22:26:29 INFO main - tls.client.authServer = false
2021-07-05 22:26:29 INFO main - tls.client.trustCertPath = null
2021-07-05 22:26:30 INFO main - Using OpenSSL provider
2021-07-05 22:26:30 INFO main - SSLContext created for server
2021-07-05 22:26:30 INFO main - Try to start service thread:FileWatchService started:false lastThread:null
2021-07-05 22:26:30 INFO NettyEventExecutor - NettyEventExecutor service started
2021-07-05 22:26:30 INFO FileWatchService - FileWatchService service started
2021-07-05 22:26:30 INFO main - The Name Server boot success. serializeType=JSON
2021-07-05 22:27:30 INFO NSScheduledThread1 - --------------------------------------------------------
2021-07-05 22:27:30 INFO NSScheduledThread1 - configTable SIZE: 0

启动 RocketMQ 的 Broker 服务

  • 启动 Broker
1
2
3
4
5
# 进入 RocketMQ 的安装目录
cd rocketmq-all-4.9.0

# 后台启动 Broker,其中 127.0.0.1:9876 是 NameServer 的地址
nohup sh bin/mqbroker -n 127.0.0.1:9876 &
  • 查看 Broker 的进程信息
1
ps -aux|grep broker
  • 查看 Broker 的日志信息
1
2
# 查看 Broker 的日志信息(如下所示)
tail -f ~/logs/rocketmqlogs/broker.log
1
2
3
4
5
6
7
8
9
10
11
12
13
2021-07-05 22:29:10 INFO main - Try to start service thread:FlushConsumeQueueService started:false lastThread:null
2021-07-05 22:29:10 INFO main - Try to start service thread:FlushRealTimeService started:false lastThread:null
2021-07-05 22:29:10 INFO main - Try to start service thread:StoreStatsService started:false lastThread:null
2021-07-05 22:29:10 INFO main - Try to start service thread:FileWatchService started:false lastThread:null
2021-07-05 22:29:10 INFO FileWatchService - FileWatchService service started
2021-07-05 22:29:11 INFO main - Try to start service thread:PullRequestHoldService started:false lastThread:null
2021-07-05 22:29:11 INFO PullRequestHoldService - PullRequestHoldService service started
2021-07-05 22:29:11 INFO main - Try to start service thread:TransactionalMessageCheckService started:false lastThread:null
2021-07-05 22:29:11 INFO brokerOutApi_thread_1 - register broker[0]to name server 127.0.0.1:9876 OK
2021-07-05 22:29:11 INFO main - The broker[centos7, 172.17.0.1:10911] boot success. serializeType=JSON and name server is 127.0.0.1:9876
2021-07-05 22:29:20 INFO BrokerControllerScheduledThread1 - dispatch behind commit log 0 bytes
2021-07-05 22:29:20 INFO BrokerControllerScheduledThread1 - Slave fall behind master: 0 bytes
2021-07-05 22:29:21 INFO brokerOutApi_thread_2 - register broker[0]to name server 127.0.0.1:9876 OK

特别提示

  • 在生产环境中,为了系统安全,强烈建议使用普通用户(比如 rocketmq)权限来启动 RocketMQ 的 NameServer 和 Broker 服务
  • 在生产环境中,强烈建议使用 Systemd 或 Supervisor 等进程管理工具来管理 RocketMQ 的 NameServer 和 Broker 服务,以实现进程守护和故障自动重启。

测试服务

  • 发送消息
1
2
3
4
5
# 进入 RocketMQ 的安装目录
cd rocketmq-all-4.9.0

# 启动消息生产者(测试专用),其中 127.0.0.1:9876 是 NameServer 的地址,输出内容如下
export NAMESRV_ADDR=127.0.0.1:9876 && sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
1
2
3
SendResult [sendStatus=SEND_OK, msgId=FD34DD838CB900000000000000000B3E129C29453F4427E3A8C403E5, offsetMsgId=AC11000100002A9F00000000000A6035, messageQueue=MessageQueue [topic=TopicTest, brokerName=centos7, queueId=2], queueOffset=749]
SendResult [sendStatus=SEND_OK, msgId=FD34DD838CB900000000000000000B3E129C29453F4427E3A8C903E6, offsetMsgId=AC11000100002A9F00000000000A6118, messageQueue=MessageQueue [topic=TopicTest, brokerName=centos7, queueId=3], queueOffset=749]
SendResult [sendStatus=SEND_OK, msgId=FD34DD838CB900000000000000000B3E129C29453F4427E3A8CB03E7, offsetMsgId=AC11000100002A9F00000000000A61FB, messageQueue=MessageQueue [topic=TopicTest, brokerName=centos7, queueId=0], queueOffset=749]
  • 接收消息
1
2
3
4
5
# 进入 RocketMQ 的安装目录
cd rocketmq-all-4.9.0

# 启动消息消费者(测试专用),其中 127.0.0.1:9876 是 NameServer 的地址,输出内容如下
export NAMESRV_ADDR=127.0.0.1:9876 && sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
1
2
3
ConsumeMessageThread_19 Receive New Messages: [MessageExt [brokerName=centos7, queueId=2, storeSize=227, queueOffset=749, sysFlag=0, bornTimestamp=1775642031300, bornHost=/192.168.2.127:55462, storeTimestamp=1775642031304, storeHost=/172.17.0.1:10911, msgId=AC11000100002A9F00000000000A6035, commitLogOffset=679989, bodyCRC=1102156316, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=750, CONSUME_START_TIME=1775642031306, UNIQ_KEY=FD34DD838CB900000000000000000B3E129C29453F4427E3A8C403E5, CLUSTER=DefaultCluster, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 57, 57, 55], transactionId='null'}]] 
ConsumeMessageThread_20 Receive New Messages: [MessageExt [brokerName=centos7, queueId=3, storeSize=227, queueOffset=749, sysFlag=0, bornTimestamp=1775642031305, bornHost=/192.168.2.127:55462, storeTimestamp=1775642031306, storeHost=/172.17.0.1:10911, msgId=AC11000100002A9F00000000000A6118, commitLogOffset=680216, bodyCRC=1359908749, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=750, CONSUME_START_TIME=1775642031308, UNIQ_KEY=FD34DD838CB900000000000000000B3E129C29453F4427E3A8C903E6, CLUSTER=DefaultCluster, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 57, 57, 56], transactionId='null'}]]
ConsumeMessageThread_10 Receive New Messages: [MessageExt [brokerName=centos7, queueId=0, storeSize=227, queueOffset=749, sysFlag=0, bornTimestamp=1775642031307, bornHost=/192.168.2.127:55462, storeTimestamp=1775642031308, storeHost=/172.17.0.1:10911, msgId=AC11000100002A9F00000000000A61FB, commitLogOffset=680443, bodyCRC=638172955, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=750, CONSUME_START_TIME=1775642031309, UNIQ_KEY=FD34DD838CB900000000000000000B3E129C29453F4427E3A8CB03E7, CLUSTER=DefaultCluster, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 57, 57, 57], transactionId='null'}]]

关闭服务

RocketMQ 无论是关闭 NameServer 还是 Broker,都可以使用 bin/mqshutdown 命令。

特别注意

在 RocketMQ 关闭的过程中,通常应该先关闭 Broker,再关闭 NameServer。因为 Broker 的运行依赖向 NameServer 注册路由信息,Producer 和 Consumer 也通过 NameServer 获取 Broker 地址列表;如果先关闭 NameServer,会导致路由获取和更新失败,可能引发生产者发送异常、消费者消费异常以及 Broker 心跳状态不一致等问题,而先关闭 Broker 可以让系统停止接收新消息并完成存量消费,最后再关闭 NameServer 则更安全、规范。

  • 关闭 Broker
1
2
3
4
5
# 进入 RocketMQ 的安装目录
cd rocketmq-all-4.9.0

# 关闭 Broker
sh bin/mqshutdown broker
  • 关闭 NameServer
1
2
3
4
5
# 进入 RocketMQ 的安装目录
cd rocketmq-all-4.9.0

# 关闭 NameServer
sh bin/mqshutdown namesrv

管理服务

在上述 NameServer 和 Broker 服务都是通过 nohup 命令实现后台运行的,这种方式无法实现进程守护,也不支持开机自动启动和故障自动重启进程。为了解决这些问题,建议使用 Supervisor 对 NameServer 和 Broker 进程进行统一管理,以提升服务的稳定性和可运维性。首先关闭 RocketMQ 服务端,然后安装并启动 Supervisor 服务(如下所示),最后添加相应的 Supervisor 配置文件来管理 NameServer 和 Broker 进程。

准备工作

关闭 RocketMQ 服务端

  • 关闭 Broker
1
2
3
4
5
# 进入 RocketMQ 的安装目录
cd rocketmq-all-4.9.0

# 关闭 Broker
sh bin/mqshutdown broker
  • 关闭 NameServer
1
2
3
4
5
# 进入 RocketMQ 的安装目录
cd rocketmq-all-4.9.0

# 关闭 NameServer
sh bin/mqshutdown namesrv

Supervisor 安装

  • CentOS、Fedora 安装 Supervisor
1
2
3
4
5
6
7
8
9
10
11
# 安装 Supervisor
sudo yum install -y supervisor

# 开机自动启动 Supervisor
sudo systemctl enable supervisord

# 启动 Supervisor
sudo systemctl start supervisord

# 查看 Supervisor 运行状态
sudo systemctl status supervisord
  • Debian、Ubuntu 安装 Supervisor
1
2
3
4
5
6
7
8
9
10
11
# 安装 Supervisor
sudo apt install -y supervisor

# 开机自动启动 Supervisor
sudo systemctl enable supervisor

# 启动 Supervisor
sudo systemctl start supervisor

# 查看 Supervisor 运行状态
sudo systemctl status supervisor

NameServer 管理

  • 创建 Supervisor 配置文件
1
2
# 创建配置文件,写入以下配置内容
sudo vi /etc/supervisord.d/rocketmq-namesrv.ini
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
; 定义一个被 Supervisor 管理的程序,名称为 rocketmq-namesrv
[program:rocketmq-namesrv]
; 指定使用 rocketmq 用户启动进程(避免使用 root)
user=rocketmq
; 指定程序运行的工作目录
directory=/home/rocketmq/rocketmq-all-4.9.0
; 启动命令(通过 bash 执行 NameServer 启动脚本)
command=/bin/bash -c "sh /home/rocketmq/rocketmq-all-4.9.0/bin/mqnamesrv"
; 停止时向整个进程组(确保子进程如 Java 进程也被停止)
stopasgroup=true
; 强制终止整个进程组(确保子进程如 Java 进程也被杀掉)
killasgroup=true
; Supervisor 启动时自动启动该程序
autostart=true
; 程序异常退出后自动重启
autorestart=true
; 启动成功判定时间(运行超过 5 秒视为启动成功)
startsecs=5
; 启动失败最大重试次数
startretries=10
; 正常退出的状态码(0 表示正常退出)
exitcodes=0
; 停止程序时等待的最大时间(秒)
stopwaitsecs=60
; 标准输出日志的文件路径
stdout_logfile=/var/log/supervisor/rocketmq/logs/namesrv.out.log
; 单个标准输出日志文件的最大大小
stdout_logfile_maxbytes=50MB
; 标准输出日志文件最多保留多少个
stdout_logfile_backups=5
; 错误输出日志文件的路径
stderr_logfile=/var/log/supervisor/rocketmq/logs/namesrv.err.log
; 单个错误输出日志文件的最大大小
stderr_logfile_maxbytes=50MB
; 错误输出日志文件最多保留多少个
stderr_logfile_backups=5
  • 创建 Supervisor 日志目录
1
2
3
4
5
# 创建日志目录
sudo mkdir -p /var/log/supervisor/rocketmq/logs

# 授权日志目录
sudo chown -R rocketmq:rocketmq /var/log/supervisor/rocketmq/logs
  • 重新加载 Supervisor 配置文件
1
2
3
4
5
# 重新读取 Supervisor 配置文件(不会立即生效)
sudo supervisorctl reread

# 根据最新的配置,加载新增或更新的程序(使配置生效)
sudo supervisorctl update
  • NameServer 常用管理命令
1
2
3
4
5
6
7
8
9
10
11
# 启动 NameServer
sudo supervisorctl start rocketmq-namesrv

# 关闭 NameServer
sudo supervisorctl stop rocketmq-namesrv

# 重启 NameServer
sudo supervisorctl restart rocketmq-namesrv

# 查看 NameServer 运行状态
sudo supervisorctl status
  • NameServer 查看日志信息
1
2
3
4
5
# 查看 NameServer 的运行日志信息
tail -f ~/logs/rocketmqlogs/namesrv.log

# 查看 NameServer 的错误日志信息
tail -f /var/log/supervisor/rocketmq/logs/namesrv.err.log

Broker 管理

  • 创建 Supervisor 配置文件
1
2
# 创建配置文件,写入以下配置内容
sudo vi /etc/supervisord.d/rocketmq-broker.ini
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
; 定义一个被 Supervisor 管理的程序,名称为 rocketmq-broker
[program:rocketmq-broker]
; 指定使用 rocketmq 用户启动进程(避免使用 root)
user=rocketmq
; 指定程序运行的工作目录
directory=/home/rocketmq/rocketmq-all-4.9.0
; 启动命令(通过 bash 执行 Broker 启动脚本),其中 127.0.0.1:9876 是 NameServer 的地址
command=/bin/bash -c "sh /home/rocketmq/rocketmq-all-4.9.0/bin/mqbroker -n 127.0.0.1:9876"
; 停止时向整个进程组(确保子进程如 Java 进程也被停止)
stopasgroup=true
; 强制终止整个进程组(确保子进程如 Java 进程也被杀掉)
killasgroup=true
; Supervisor 启动时自动启动该程序
autostart=true
; 程序异常退出后自动重启
autorestart=true
; 启动成功判定时间(运行超过 5 秒视为启动成功)
startsecs=5
; 启动失败最大重试次数
startretries=10
; 正常退出的状态码(0 表示正常退出)
exitcodes=0
; 停止程序时等待的最大时间(秒)
stopwaitsecs=60
; 标准输出日志的文件路径
stdout_logfile=/var/log/supervisor/rocketmq/logs/broker.out.log
; 单个标准输出日志文件的最大大小
stdout_logfile_maxbytes=50MB
; 标准输出日志文件最多保留多少个
stdout_logfile_backups=5
; 错误输出日志文件的路径
stderr_logfile=/var/log/supervisor/rocketmq/logs/broker.err.log
; 单个错误输出日志文件的最大大小
stderr_logfile_maxbytes=50MB
; 错误输出日志文件最多保留多少个
stderr_logfile_backups=5
  • 创建 Supervisor 日志目录
1
2
3
4
5
# 创建日志目录
sudo mkdir -p /var/log/supervisor/rocketmq/logs

# 授权日志目录
sudo chown -R rocketmq:rocketmq /var/log/supervisor/rocketmq/logs
  • 重新加载 Supervisor 配置文件
1
2
3
4
5
# 重新读取 Supervisor 配置文件(不会立即生效)
sudo supervisorctl reread

# 根据最新的配置,加载新增或更新的程序(使配置生效)
sudo supervisorctl update
  • Broker 常用管理命令
1
2
3
4
5
6
7
8
9
10
11
# 启动 Broker
sudo supervisorctl start rocketmq-broker

# 关闭 Broker
sudo supervisorctl stop rocketmq-broker

# 重启 Broker
sudo supervisorctl restart rocketmq-broker

# 查看 Broker 运行状态
sudo supervisorctl status
  • Broker 查看日志信息
1
2
3
4
5
# 查看 Broker 的运行日志信息
tail -f ~/logs/rocketmqlogs/broker.log

# 查看 Broker 的错误日志信息
tail -f /var/log/supervisor/rocketmq/logs/broker.err.log

RocketMQ 控制台安装

RocketMQ Dashboard 是 RocketMQ 官方开发的管控利器,为用户提供客户端和应用程序的各种事件、性能的统计信息,支持以可视化工具代替 Topic 配置、Broker 管理等命令行操作,其核心功能如下表所示:

面板功能
运维修改 NamServer 地址;选用 VIPChannel
驾驶舱查看 Broker、Topic 消息量
集群集群分布,Broker 配置、运行信息
主题搜索、筛选、删除、更新 / 新增主题,消息路由,发送消息,重置消费位点
消费者搜索、删除、新增 / 更新消费者组,终端,消费详情,配置
消息消息记录,死信消息,消息轨迹等消息详情

准备工作

RocketMQ 控制台需要通过编译源码的方式来安装,因此需要提前安装 JDK 和 Maven。值得一提的是,RocketMQ 控制台既可以与 NameServer 和 Broker 部署在同一台机器上,也可以独立部署在其他机器上。

JDK 版本说明

RocketMQ 控制台项目(1.0.0 版本)在编译阶段依赖 JDK 1.7(即使用 Java 7 语法和字节码版本进行编译),但在运行阶段兼容 JDK 1.7 及以上版本,因此可以正常运行在 JDK 1.8+ 环境中。

JDK 安装

JDK 手动安装

  • 下载并安装 JDK(1.7 版本)
1
2
3
4
5
6
7
8
# 下载文件(OpenJDK 1.7,Azul Zulu 发行版)
wget https://cdn.azul.com/zulu/bin/zulu7.56.0.11-ca-jdk7.0.352-linux_x64.tar.gz

# 解压文件
tar -zxvf zulu7.56.0.11-ca-jdk7.0.352-linux_x64.tar.gz

# 移动文件
sudo mv zulu7.56.0.11-ca-jdk7.0.352-linux_x64 /usr/local/jdk-7.0.352

全局环境变量配置

  • 配置系统环境变量
1
2
# 编辑系统配置文件,在文件末尾添加以下内容
sudo vi /etc/profile
1
2
export JAVA_HOME=/usr/local/jdk-7.0.352
export PATH=$JAVA_HOME/bin:$PATH
  • 让系统环境变量生效
1
sudo source /etc/profile

用户环境变量配置

1
2
# 切换至 rocketmq 用户
sudo -u rocketmq -s
1
2
# 编辑用户配置文件,在文件末尾添加以下内容
vi ~/.bashrc
1
2
export JAVA_HOME=/usr/local/jdk-7.0.352
export PATH=$JAVA_HOME/bin:$PATH
  • 让用户环境变量生效
1
source ~/.bashrc

验证 JDK 安装

1
java -version

Maven 安装

Maven 手动安装

  • 下载并安装 Maven
1
2
3
4
5
6
7
8
# 下载文件
wget https://archive.apache.org/dist/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz

# 解压文件
tar -zxvf apache-maven-3.6.0-bin.tar.gz

# 移动文件
sudo mv apache-maven-3.6.0 /usr/local/maven-3.6.0

全局环境变量配置

  • 配置系统环境变量
1
2
# 编辑系统配置文件,在文件末尾添加以下内容
sudo vi /etc/profile
1
2
export MAVEN_HOME=/usr/local/maven-3.6.0
export PATH=$MAVEN_HOME/bin:$PATH
  • 让系统环境变量生效
1
sudo source /etc/profile

用户环境变量配置

1
2
# 切换至 rocketmq 用户
sudo -u rocketmq -s
1
2
# 编辑用户配置文件,在文件末尾添加以下内容
vi ~/.bashrc
1
2
export MAVEN_HOME=/usr/local/maven-3.6.0
export PATH=$MAVEN_HOME/bin:$PATH
  • 让用户环境变量生效
1
source ~/.bashrc

验证 Maven 安装

1
mvn -version

软件下载

从 RocketMQ 官方的 GitHub Tags 下载控制台的源代码压缩包(比如 rocketmq-console-1.0.0.zip),如下图所示:

  • 下载文件
1
wget https://github.com/apache/rocketmq-externals/archive/refs/tags/rocketmq-console-1.0.0.zip
  • 解压文件
1
2
3
4
5
6
7
8
9
10
11
# 解压文件
unzip rocketmq-console-1.0.0.zip

# 移动目录
mv rocketmq-externals-rocketmq-console-1.0.0/rocketmq-console rocketmq-console-1.0.0

# 删除目录
rm -rf rocketmq-externals-rocketmq-console-1.0.0

# 进入解压目录
cd rocketmq-console-1.0.0

打包项目

  • 更改控制台的配置文件
1
2
# 编辑控制台的配置文件,更改以下内容
vi src/main/resources/application.properties
1
2
3
4
5
# 默认的端口号是 8080,将其更改为一个不常用的端口
server.port=7000

# 指定 RocketMQ 的 NameServer 地址列表,多个地址使用分号隔开
rocketmq.config.namesrvAddr=127.0.0.1:9876
  • 添加 Maven 依赖项(JAXB)
1
2
# 编辑控制台的 Maven 配置文件,添加以下内容
vi pom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>

JAXB 是什么

JAXB(Java Architechture for Xml Binding)用于 XML 绑定的 Java 技术,是一个业界标准,是一项可以根据 XML Schema 生成 Java 类的技术。

  • Maven 打包控制台项目
1
2
# 编译打包控制台项目
mvn clean package -Dmaven.test.skip=true

启动服务

  • 启动控制台
1
2
# 后台启动控制台
nohup java -jar target/rocketmq-console-ng-1.0.0.jar &

测试服务

  • 浏览器打开 http://127.0.0.1:7000 访问 RocketMQ 的控制台,请自行更改 IP 地址,默认端口号是 8080,如下图所示:

管理服务

上述部署的 RocketMQ 控制台是通过 nohup 命令实现后台运行的,这种方式无法实现进程守护,也不支持开机自动启动和故障自动重启进程。为了解决这些问题,建议使用 Supervisor 对 RocketMQ 控制台进程进行统一管理,以提升服务的稳定性和可运维性。首先安装并启动 Supervisor 服务(详细的安装步骤可以参考 这里),然后添加相应的 Supervisor 配置文件来管理 RocketMQ 控制台进程。

  • 创建 Supervisor 配置文件
1
2
# 创建配置文件,写入以下配置内容
sudo vi /etc/supervisord.d/rocketmq-console.ini
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
; 定义一个被 Supervisor 管理的程序,名称为 rocketmq-console
[program:rocketmq-console]
; 指定使用 rocketmq 用户启动进程(避免使用 root)
user=rocketmq
; 指定程序运行的工作目录
directory=/home/rocketmq/rocketmq-console-1.0.0
; 启动命令(通过 bash 执行 Broker 启动脚本)
command=java -jar /home/rocketmq/rocketmq-console-1.0.0/target/rocketmq-console-ng-1.0.0.jar
; 停止时向整个进程组(确保子进程如 Java 进程也被停止)
stopasgroup=true
; 强制终止整个进程组(确保子进程如 Java 进程也被杀掉)
killasgroup=true
; Supervisor 启动时自动启动该程序
autostart=true
; 程序异常退出后自动重启
autorestart=true
; 启动成功判定时间(运行超过 5 秒视为启动成功)
startsecs=5
; 启动失败最大重试次数
startretries=10
; 正常退出的状态码(0 表示正常退出)
exitcodes=0
; 停止程序时等待的最大时间(秒)
stopwaitsecs=60
; 标准输出日志的文件路径
stdout_logfile=/var/log/supervisor/rocketmq/logs/console.out.log
; 单个标准输出日志文件的最大大小
stdout_logfile_maxbytes=50MB
; 标准输出日志文件最多保留多少个
stdout_logfile_backups=5
; 错误输出日志文件的路径
stderr_logfile=/var/log/supervisor/rocketmq/logs/console.err.log
; 单个错误输出日志文件的最大大小
stderr_logfile_maxbytes=50MB
; 错误输出日志文件最多保留多少个
stderr_logfile_backups=5
  • 创建 Supervisor 日志目录
1
2
3
4
5
# 创建日志目录
sudo mkdir -p /var/log/supervisor/rocketmq/logs

# 授权日志目录
sudo chown -R rocketmq:rocketmq /var/log/supervisor/rocketmq/logs
  • 重新加载 Supervisor 配置文件
1
2
3
4
5
# 重新读取 Supervisor 配置文件(不会立即生效)
sudo supervisorctl reread

# 根据最新的配置,加载新增或更新的程序(使配置生效)
sudo supervisorctl update
  • RocketMQ 控制台常用管理命令
1
2
3
4
5
6
7
8
9
10
11
# 启动 RocketMQ 控制台
sudo supervisorctl start rocketmq-console

# 关闭 RocketMQ 控制台
sudo supervisorctl stop rocketmq-console

# 重启 RocketMQ 控制台
sudo supervisorctl restart rocketmq-console

# 查看 RocketMQ 控制台的运行状态
sudo supervisorctl status
  • RocketMQ 控制台查看日志信息
1
2
3
4
5
# 查看 RocketMQ 控制台的运行日志信息
tail -f /var/log/supervisor/rocketmq/logs/console.out.log

# 查看 RocketMQ 控制台的错误日志信息
tail -f /var/log/supervisor/rocketmq/logs/namesrv.err.log

RocketMQ 的管理工具

在 RocketMQ 的 bin 目录下有一个 mqadmin 管理工具,它是一个运维命令,用于对 RocketMQ 的集群、Topic、Broker 等信息进行管理。

更改 Shell 脚本文件

在运行 mqadmin 命令前,需要先更改 RocketMQ 脚本(bin/tools.sh)中 JDK 的 ext 目录配置,这样可以确保 mqadmin 工具在运行时能够正确加载 JDK 的扩展类库,否则可能导致命令执行异常。可以按如下方式操作:

  • (1) 编辑 RocketMQ 安装目录下的 bin/tools.sh 脚本;
  • (2) 找到 JAVA_OPT 中的 -Djava.ext.dirs 配置项;
  • (3) 在配置项的后面追加本机 JDK 的 ext 目录路径(例如:/usr/local/jdk-1.8.0_402/jre/lib/ext);
  • (4) 保存文件并退出后

编辑 RocketMQ 的 bin/tools.sh 脚本文件,并在 JAVA_OPT 配置的 -Djava.ext.dirs 这一行的后面添加本机 JDK 的 ext 目录路径

1
2
3
4
5
# 进入 RocketMQ 的安装目录
cd rocketmq-all-4.9.0

# 编辑脚本文件,更改以下内容
vi bin/tools.sh
1
JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${BASE_DIR}/lib:${JAVA_HOME}/jre/lib/ext:${JAVA_HOME}/lib/ext:/usr/local/jdk-1.8.0_402/jre/lib/ext"

运行 mqadmin 命令

  • 直接运行 mqadmin 命令后,可以看到其可以添加的 Commands,通过这些 Commands 可以完成很多的功能
1
2
3
4
5
# 进入 RocketMQ 的安装目录
cd rocketmq-all-4.9.0

# 执行管理命令,输出结果如下
sh bin/mqadmin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
The most commonly used mqadmin commands are:
updateTopic Update or create topic
deleteTopic Delete topic from broker and NameServer.
updateSubGroup Update or create subscription group
deleteSubGroup Delete subscription group from broker.
updateBrokerConfig Update broker's config
updateTopicPerm Update topic perm
topicRoute Examine topic route info
topicStatus Examine topic Status info
topicClusterList get cluster info for topic
brokerStatus Fetch broker runtime status data
queryMsgById Query Message by Id
queryMsgByKey Query Message by Key
queryMsgByUniqueKey Query Message by Unique key
queryMsgByOffset Query Message by offset
QueryMsgTraceById query a message trace
printMsg Print Message Detail
printMsgByQueue Print Message Detail
sendMsgStatus send msg to broker.
brokerConsumeStats Fetch broker consume stats data
producerConnection Query producer's socket connection and client version
consumerConnection Query consumer's socket connection, client version and subscription
consumerProgress Query consumers's progress, speed
consumerStatus Query consumer's internal data structure
cloneGroupOffset clone offset from other group.
clusterList List all of clusters
topicList Fetch all topic list from name server
updateKvConfig Create or update KV config.
deleteKvConfig Delete KV config.
wipeWritePerm Wipe write perm of broker in all name server
resetOffsetByTime Reset consumer offset by timestamp(without client restart).
updateOrderConf Create or update or delete order conf
cleanExpiredCQ Clean expired ConsumeQueue on broker.
cleanUnusedTopic Clean unused topic on broker.
startMonitoring Start Monitoring
statsAll Topic and Consumer tps stats
allocateMQ Allocate MQ
checkMsgSendRT check message send response time
clusterRT List All clusters Message Send RT
getNamesrvConfig Get configs of name server.
updateNamesrvConfig Update configs of name server.
getBrokerConfig Get broker config by cluster or special broker!
queryCq Query cq command.
sendMessage Send a message
consumeMessage Consume message
updateAclConfig Update acl config yaml file in broker
deleteAccessConfig Delete Acl Config Account in broker
clusterAclConfigVersion List all of acl config version information in cluster
updateGlobalWhiteAddr Update global white address for acl Config File in broker
getAccessConfigSubCommand List all of acl config information in cluster

See 'mqadmin help <command>' for more information on a specific command.

mqadmin 命令的使用教程

  • mqadmin 命令在 RocketMQ 官方文档 中有详细的用法介绍。