【RocketMq源码篇-03】dashboard安装搭建和启动详解(集群版)

RocketMq源码核心篇整体栏目


内容 链接地址
【一】环境搭建、基本使用、可视化界面 https://zhenghuisheng.blog.csdn.net/article/details/147481401
【二】rocketmq集群搭建(docker版-2主2从) https://zhenghuisheng.blog.csdn.net/article/details/154921615
【三】dashboard安装搭建和启动详解 https://zhenghuisheng.blog.csdn.net/article/details/155371854

如需转载,请附上链接: https://blog.csdn.net/zhenghuishengq/article/details/155371854

dashboard安装搭建和启动详解

一、dashboard安装搭建和启动详解

上一篇讲解了rocketmq集群的搭建,讲解了一个两主两从的集群,来保证rocketmq的高可用和高性能。在搭建dashboard之前,一定要结合上面这篇集群的搭建来完成,二者结合共同完成dashboard的搭建

接下来这篇文章需要搭建一个rocketmq的可视化界面dashboard ,正所谓磨刀不误砍柴工 ,通过这个可视化界面,可以更方便的学习和排查问题,比如查看集群的情况,看生产者、broker、topic、消费者是否正常,看MQ的消息是否发送、消费、堆积和重试等机制

1,安装和基础配置

1.1,下载安装

首先打开官方推荐的可视化界面的网址:https://github.com/apache/rocketmq-dashboard/tags ,其内容如下,因为目前用的是4.x的版本,所以选择1.0版本即可,并且下载zip的压缩包即可,需要在本地改一些配置,再打包丢到服务器上面运行(当然也可以选择直接再本地运行,如果rocketmq用5.x版本,则必须用--Dashboard2.x的可视化包)

随后用idea将项目打开,如果下载不了,那么可以直接拿本人的源码去用,源码地址, 我将dashbroad也放在了这个源码地址目录中

1.2,项目配置

接下来就是修改application.properties中的配置文件,主要改以下四个即可。其他的选择默认属性即可

shell 复制代码
server.address=0.0.0.0
server.port=8888
rocketmq.config.namesrvAddr=192.168.1.246:9876
rocketmq.config.dataPath=/usr/local/env/rocketmq/cluster/bashboard/data

最终配置可以参考以下,没必要的情况下直接改上面三个即可

shell 复制代码
# Dashboard 自己启动的 Web 服务地址
server.address=0.0.0.0
server.port=8888
spring.application.name=rocketmq-dashboard
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
# 访问集群的地址
rocketmq.config.namesrvAddr=192.168.1.246:9876
rocketmq.config.isVIPChannel=
rocketmq.config.timeoutMillis=
# Dashboard 的本地数据存放路径
rocketmq.config.dataPath=/usr/local/env/rocketmq/cluster/bashboard/data
# 这个开启后,驾驶舱(Dashboard 首页)才能看到 TPS 图表。
rocketmq.config.enableDashBoardCollect=true
# 是否需要登录,如果设置为true,那么就需要创建账号密码
rocketmq.config.loginRequired=false
rocketmq.config.useTLS=false

最后在idea中打成jar包,通过finalshell 传到虚拟机中即可,最后将这个jar包存放在 /usr/local/env/rocketmq/cluster/bashboard 目录下

由于上面设置的 rocketmq.config.dataPath 的路径发生了改变,那么就首先需要递归创建这个目录,随后给这个配置的目录一定的权限

shell 复制代码
mkdir -p /usr/local/env/rocketmq/cluster/bashboard/data
chmod -R 777 /usr/local/env/rocketmq/cluster/bashboard/data

dashboard目录下的路径结构树如下,此次把整个涉及到rocketmq的目录全部放在主/usr/local/env/rocketmq/cluster 目录下,后续的java包和日志文件,启动和暂停脚本,以及上面的本地数据存放路径放data目录下

java 复制代码
zhenghuisheng@zhenghuisheng-server:/usr/local/env/rocketmq/cluster/bashboard$ ls -ll
total 46424
-rw-rw-r-- 1 zhenghuisheng zhenghuisheng   371177 Nov 28 21:35 dashboard.log
-rw-r--r-- 1 root          root                 7 Nov 28 21:20 dashboard.pid
drwxrwxrwx 2 zhenghuisheng zhenghuisheng     4096 Nov 28 17:58 data
-rw------- 1 root          root              6399 Nov 28 19:51 nohup.out
-rw-rw-r-- 1 zhenghuisheng zhenghuisheng 47315993 Nov 28 17:54 rocketmq-dashboard-1.0.0.jar
-rw-r--r-- 1 root          root              1251 Nov 28 20:12 start-dashboard.sh
-rw-r--r-- 1 root          root              1562 Nov 28 21:15 stop-dashboard.sh

2,启动和日志

2.1,启动和配置

由于我的虚拟机里面主要是用jdk21,所以我另外下载了一个jdk8的版本,并且用jdk8版本来启动rocketmq-dashboard,似乎4.x版本的dashboard只能用jdk8版本,跟内部的netty有关。直接通过以下命令下载压缩包即可

shell 复制代码
wget https://cdn.azul.com/zulu/bin/zulu8.70.0.23-ca-jdk8.0.372-linux_x64.tar.gz

随后解压压缩包,解压完成之后我放在 /usr/local/env/java/ 路径下

shell 复制代码
tar -zxvf zulu8.70.0.23-ca-jdk8.0.372-linux_x64.tar.gz

打包完成之后,将jar包放入到虚拟机中,我这边是放在**/usr/local/env/rocketmq/cluster/dashboard** 路径下面,随后执行启动命令。这里由于是rocketmq-dashboard1.0版本,因此只能选择jdk8的版本来进行项目的启动

shell 复制代码
nohup /usr/local/env/java/zulu8.70.0.23-ca-jdk8.0.372-linux_x64/bin/java \
  -jar rocketmq-dashboard-1.0.0.jar \
  --rocketmq.config.namesrvAddr=192.168.1.246:9876 \
  > dashboard.log 2>&1 &

每次手动启动也可能会过于麻烦,因此可以写一个项目启动的脚本,在 /usr/local/env/rocketmq/cluster/dashboard 路径下,新建一个 dashboard.sh 的脚本,其内容如下

shell 复制代码
#!/bin/bash
nohup /usr/local/env/java/zulu8/bin/java \
  -jar rocketmq-dashboard-1.0.0.jar \
  --rocketmq.config.namesrvAddr=192.168.1.246:9876 \
  >> dashboard.log 2>&1 &
echo "Dashboard started..."

查看 rocketmq-dashboard 进程和快速停止进程

shell 复制代码
# 查看全部的rocketmq-dashboard进程
ps -ef | grep rocketmq-dashboard
# 终止全部的rocketmq-dashboard进程
pkill -f rocketmq-dashboard

上面启动是将日志放在 /usr/local/env/rocketmq/cluster/dashboard 路径下的 dashboard.log 文件中,所以可以直接看启动日志

shell 复制代码
tail -f dashboard.log

随后可以看到整个项目启动成功

这里的报错排查一定要结合上一篇集群的部署搭建,比如说一些目录文件权限问题,rocketmq集群中每个broker的端口映射问题,以及每个broker中的conf配置文件等,这个需要结合 dashboard.log 日志,具体问题具体分析

2.2,脚本启动

上面启动需要每次手动的kill原来的进程,然后需要手动的执行java启动,如果每次都需要这样子启动,就会太麻烦,因此在这里设置一个启动脚本,脚本需要实现的功能如下

  • 查看端口是否被占用,并且释放8888端口

  • 获取正在运行的旧线程,并且杀死旧线程

  • 使用jdk8启动新jar包,配置nameserver地址和日志

  • 配置jvm的初始堆和最大堆,这里设置1g

那么就需要新建一个 start-dashboard.sh 的脚本,可以通过nano命令,也可以直接通过vim命令,根据系统镜像版本自由选择

shell 复制代码
sudo nano start-dashboard.sh

其脚本内容如下,提前设置一些变量,后续引用即可。

shell 复制代码
#!/bin/bash
# ================= RocketMQ Dashboard 启动脚本 =================

DASHBOARD_HOME="/usr/local/env/rocketmq/cluster/bashboard"
JAVA_HOME="/usr/local/env/java/zulu8.70.0.23-ca-jdk8.0.372-linux_x64"
JAR_NAME="rocketmq-dashboard-1.0.0.jar"
PID_FILE="$DASHBOARD_HOME/dashboard.pid"
LOG_FILE="$DASHBOARD_HOME/dashboard.log"
PORT=8888

cd $DASHBOARD_HOME

echo "检查是否有进程占用端口 $PORT ..."
PID_ON_PORT=$(sudo lsof -t -i:$PORT)

if [ -n "$PID_ON_PORT" ]; then
    echo "端口 $PORT 被占用,PID=$PID_ON_PORT,正在杀死..."
    sudo kill -9 $PID_ON_PORT
    echo "端口占用进程已杀死。"
fi

echo "检查是否已有 dashboard.pid ..."
if [ -f "$PID_FILE" ]; then
    OLDPID=$(cat $PID_FILE)
    if ps -p $OLDPID > /dev/null 2>&1; then
        echo "Dashboard PID 文件存在,杀死旧进程 PID=$OLDPID ..."
        sudo kill -9 $OLDPID
        echo "旧进程已杀死。"
    fi
fi

JAVA_OPTS="-Xms1g -Xmx1g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"

echo "启动 RocketMQ Dashboard ..."
nohup $JAVA_HOME/bin/java $JAVA_OPTS -jar $JAR_NAME \
    --rocketmq.config.namesrvAddr=192.168.1.246:9876 \
    >> $LOG_FILE 2>&1 &

echo $! > $PID_FILE

echo "启动成功!PID=$(cat $PID_FILE)"
echo "日志文件:$LOG_FILE"

配置文件如下,由于shell脚本的命令规范,所以一定要注意一些脚本的换行,比如杀死进程的内容,启动的内容,根据我的格式就行,尤其是启动jar包命令这行。

随后执行这个脚本,如果是centos系统一般将bash替换成sh即可

shell 复制代码
sudo bash start-dashboard.sh 
# centos版本
sh start-dashboard.sh 

其结果如下,端口号被占用、进程杀死、项目启动成功这些日志都被打印

shell 复制代码
zhenghuisheng@zhenghuisheng-server:/usr/local/env/rocketmq/cluster/bashboard$ sudo bash start-dashboard.sh 
检查是否有进程占用端口 8888 ...
端口 8888 被占用,PID=133094,正在杀死...
端口占用进程已杀死。
检查是否已有 dashboard.pid ...
启动 RocketMQ Dashboard ...
启动成功!PID=226744
日志文件:/usr/local/env/rocketmq/cluster/bashboard/dashboard.log

查看dashboard日志,也可以发现项目成功启动

shell 复制代码
tail -f dashboard.log

其日志结果如下,那么就可以直接通过执行脚本来实现dashboard项目重启

2.3,脚本暂停

上面的脚本是会杀死进程,但是也会重新启动,如果需要一个仅仅暂停的脚本,那么就需要新建一个 stop-dashboard.sh 的脚本,可以通过nano命令,也可以直接通过vim命令,根据系统镜像版本自由选择

shell 复制代码
sudo nano stop-dashboard.sh

脚本需要实现的功能如下

  • 正常杀死进程
  • 杀不掉则kill -9
  • 删除pid文件

其脚本内容如下

shell 复制代码
#!/bin/bash
# ================= RocketMQ Dashboard 停止脚本 =================

DASHBOARD_HOME="/usr/local/env/rocketmq/cluster/bashboard"
PID_FILE="$DASHBOARD_HOME/dashboard.pid"
PORT=8888

echo "================ 停止 RocketMQ Dashboard ================"

# 1. 优先从 PID 文件停止
if [ -f "$PID_FILE" ]; then
    PID=$(cat "$PID_FILE")

    if ps -p $PID > /dev/null 2>&1; then
        echo "找到 PID 文件:$PID_FILE"
        echo "Dashboard 正在运行,PID=$PID,准备停止..."
        kill $PID
        sleep 1

        # 如果还没死则强制 kill -9
        if ps -p $PID > /dev/null 2>&1; then
            echo "进程未退出,执行 kill -9 $PID ..."
            kill -9 $PID
        fi

        echo "Dashboard 已停止。"
    else
        echo "PID 文件存在,但进程不在运行,删除 PID 文件。"
    fi

    rm -f "$PID_FILE"
    exit 0
fi

echo "没有找到 PID 文件,尝试根据端口查找进程..."

# 2. 如果 pid 文件不存在,根据端口查找正在监听 8888 的进程
PID_ON_PORT=$(sudo lsof -t -i:$PORT)

if [ -n "$PID_ON_PORT" ]; then
    echo "端口 $PORT 被进程占用,PID=$PID_ON_PORT,准备停止..."

    kill $PID_ON_PORT
    sleep 1

    # 强制 kill
    if ps -p $PID_ON_PORT > /dev/null 2>&1; then
        echo "进程未退出,执行 kill -9 $PID_ON_PORT ..."
        kill -9 $PID_ON_PORT
    fi

    echo "RocketMQ Dashboard 已停止。"
else
    echo "未找到正在运行的 Dashboard 进程。"
fi

echo "========================================================="

shell配置文件如下,脚本的配置也要符合规范

随后执行脚本即可

shell 复制代码
sudo bash stop-dashboard.sh 

其结果如下,已经将进程停止

shell 复制代码
zhenghuisheng@zhenghuisheng-server:/usr/local/env/rocketmq/cluster/bashboard$ sudo bash stop-dashboard.sh 
================ 停止 RocketMQ Dashboard ================
找到 PID 文件:/usr/local/env/rocketmq/cluster/bashboard/dashboard.pid
Dashboard 正在运行,PID=226744,准备停止...
Dashboard 已停止。

可以查看这个完整的流程,先杀死进程,然后查看dashboard进程状态,然后再开启进程,再查看dashboard进程状态

// 停止进程

sudo bash stop-dashboard.sh

// 查看rocketmq-dashboard状态

ps -ef | grep rocketmq-dashboard

// 启动进程

sudo bash start-dashboard.sh

// 查看rocketmq-dashboard状态

ps -ef | grep rocketmq-dashboard

3,浏览器访问

上面已经将整个项目启动成功,接下来继续通过浏览器将 dashboard 面板打开,在浏览器中访问ip + port即可

java 复制代码
http://192.168.1.246:8888/#/cluster

在这个页面下,可以看到整个集群的可视化面板可以成功访问,并且整个集群也加载在里面,那么此时的dashboard可视化页面就算是完整的搭建成功了。如下面的这个集群列表,此时所有的集群列表都加载如下

topic的主题如下,之前测试的一些topic也都加载了进来

消费者页面如下,此时一些默认的消费者组也被加了进来

4,报错与排查

4.1,dataPath路径问题

在项目解压后的application.properties文件中,如果不设置dataPath会用默认的 /tmp/rocketmq-console/data , 那么就可能会出现没权限的问题,在日志文件中就会报这个错

/tmp/rocketmq-console/data 权限不够,写入失败

dashboard 无法写入本地数据

解决方案就是重新设置dataPath路径,并且需要创建目录,并且给予权限

shell 复制代码
rocketmq.config.dataPath=/usr/local/env/rocketmq/cluster/bashboard/data
mkdir -p /usr/local/env/rocketmq/cluster/bashboard/data
chmod -R 777 /usr/local/env/rocketmq/cluster/bashboard/data

4.2,JDK 版本不兼容类报错

一开始我的虚拟机中只有jdk21版本,但是遇到启动失败的问题,说是Netty的版本不兼容,因此换成了jdk8的版本启动

Netty 报错 / 启动失败 / ClassNotFound

RocketMQLog:WARN No appenders could be found

据查Rocketmq4.x版本只能它通过JDK8启动

4.3,listenPort端口映射问题

在前面的集群搭建中,在这发现前面集群配置的端口映射出现问题,因此需要修改前面的docker-compose.yml文件,修改里面的port映射

shell 复制代码
brokerA-master:
	- "11911:10911"
	- "11909:10909"
brokerA-slave:
	- "20911:20911"
	- "20909:20909"
brokerB-master:
	- "11911:11911"
	- "11909:11909"
brokerB-slave:
	- "21911:21911"
	- "21909:21909"

4.4,端口占用,启动麻烦

这个就是属于优化的问题,因为启动失败端口被占用等问题,进程杀死复杂问题,每次都要一个个输入命令会特别麻烦,因此手动的设置启动脚本和停止脚本,方便于开发和维护

shell 复制代码
start-dashbroad.sh
stop-dashbroad.sh
相关推荐
雨中飘荡的记忆10 小时前
布式事务详解:从理论到实践(RocketMQ + Seata)
java·rocketmq
galaxyffang6 天前
RocketMQ 为什么性能不如 Kafka?
分布式·kafka·rocketmq
一叶飘零_sweeeet6 天前
从 Kafka 到 RocketMQ:迁移实战全攻略
分布式·kafka·rocketmq
一叶飘零_sweeeet9 天前
Spring Cloud Alibaba RocketMQ 实战:从底层原理到微服务落地全攻略
微服务·架构·rocketmq
一叶飘零_sweeeet9 天前
RocketMQ 核心解密:NameServer 路由发现与负载均衡的底层逻辑全解析
负载均衡·rocketmq
无心水10 天前
【分布式利器:事务】5、本地消息表vs事务消息:异步方案怎么选?
分布式·rocketmq·分布式事务·saga·事务消息·分布式利器·2pc3pc
huisheng_qaq10 天前
【RocketMq源码篇-02】rocketmq集群搭建详细过程(docker版-2主2从)
docker·rocketmq·rocketmq集群·rocketmq源码·2主2从
无心水10 天前
【分布式利器:RocketMQ】RocketMQ基本原理详解:架构、流程与核心特性(附实战场景)
中间件·架构·rocketmq·topic·rocketmq基本原理·电商金融mq·nameserver
小虾米 ~12 天前
RocketMQ DefaultMQPushConsumer vs DefaultLitePullConsumer
java·rocketmq·java-rocketmq