RocketMQ Dashboard自动化运维实战:Shell脚本实现进程守护与智能告警
1. 企业级RocketMQ Dashboard运维挑战
在分布式消息中间件的运维体系中,RocketMQ Dashboard作为可视化管控平台扮演着至关重要的角色。然而在实际生产环境中,运维人员常常面临以下痛点:
- 进程稳定性问题:Dashboard服务因JVM内存溢出、端口冲突等问题意外终止
- 日志管理混乱:日志文件无限增长导致磁盘空间告急,历史日志难以追溯
- 监控盲区:缺乏对Dashboard自身资源占用的实时监控
- 响应滞后:异常情况依赖人工发现,故障恢复周期长
- 多环境管理:测试、预发、生产环境需要差异化配置
某电商平台在2023年双十一大促期间,就曾因Dashboard进程异常导致消息堆积未能及时发现,造成超过200万元的订单处理延迟。这凸显了自动化运维方案的必要性。
2. 智能启停控制脚本设计
2.1 基础环境配置
#!/bin/bash
# 环境变量配置
DASHBOARD_HOME="/opt/rocketmq-dashboard"
JAVA_HOME="/usr/lib/jvm/jdk1.8.0_301"
JAR_NAME="rocketmq-dashboard-1.0.0.jar"
CONFIG_FILE="application.properties"
LOG_DIR="${DASHBOARD_HOME}/logs"
PID_FILE="${DASHBOARD_HOME}/dashboard.pid"
LOG_FILE="${LOG_DIR}/dashboard_$(date +%Y%m%d).log"
2.2 启动脚本核心逻辑
start_dashboard() {
# 检查旧进程
if [ -f "$PID_FILE" ]; then
old_pid=$(cat "$PID_FILE")
if ps -p $old_pid > /dev/null; then
echo "Dashboard is already running (PID: $old_pid)"
return 1
fi
fi
# JVM参数优化(根据机器配置调整)
JAVA_OPTS="-server -Xms2g -Xmx2g -XX:+UseG1GC"
JAVA_OPTS+=" -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=4"
# 启动服务
nohup $JAVA_HOME/bin/java $JAVA_OPTS -jar $DASHBOARD_HOME/$JAR_NAME \
--spring.config.location=$DASHBOARD_HOME/$CONFIG_FILE \
>> $LOG_FILE 2>&1 &
echo $! > $PID_FILE
echo "Dashboard started successfully (PID: $!)"
}
2.3 停止脚本安全设计
stop_dashboard() {
if [ ! -f "$PID_FILE" ]; then
echo "PID file not found, trying to find process by name..."
pid=$(pgrep -f $JAR_NAME)
[ -z "$pid" ] && echo "Dashboard is not running" && return 1
else
pid=$(cat "$PID_FILE")
fi
# 优雅停止
kill $pid
for i in {1..10}; do
if ! ps -p $pid > /dev/null; then
rm -f "$PID_FILE"
echo "Dashboard stopped gracefully"
return 0
fi
sleep 1
done
# 强制终止
kill -9 $pid
rm -f "$PID_FILE"
echo "Dashboard was force stopped"
}
3. 高级运维功能实现
3.1 日志轮转机制
# 日志轮转配置(加入crontab每天执行)
rotate_logs() {
# 保留最近7天日志
find $LOG_DIR -name "dashboard_*.log" -mtime +7 -exec rm {} \;
# 压缩历史日志
for log in $(ls $LOG_DIR/dashboard_*.log 2>/dev/null | head -n -1); do
gzip $log
done
# 重新打开日志文件(需配合logrotate或重启服务)
kill -USR1 $(cat $PID_FILE)
}
3.2 资源监控告警
monitor_dashboard() {
local pid=$(cat $PID_FILE)
local cpu_threshold=80
local mem_threshold=90
# 获取资源使用情况
local cpu_usage=$(ps -p $pid -o %cpu --no-headers)
local mem_usage=$(ps -p $pid -o %mem --no-headers)
# CPU检查
if (( $(echo "$cpu_usage > $cpu_threshold" | bc -l) )); then
send_alert "CPU usage exceeds threshold: ${cpu_usage}%"
fi
# 内存检查
if (( $(echo "$mem_usage > $mem_threshold" | bc -l) )); then
send_alert "Memory usage exceeds threshold: ${mem_usage}%"
fi
# 端口健康检查
if ! nc -z localhost 8080; then
send_alert "Dashboard service is not responding on port 8080"
fi
}
4. 企业级告警集成方案
4.1 邮件告警配置
send_alert() {
local subject="[RocketMQ Alert] $(hostname) - $1"
local body="Time: $(date)\nHost: $(hostname)\nDetail: $1\n\nCurrent status:\n$(ps aux | grep $JAR_NAME)"
echo -e "$body" | mailx -s "$subject" \
-S smtp="smtp.example.com:587" \
-S smtp-use-starttls \
-S smtp-auth=login \
-S smtp-auth-user="alert@example.com" \
-S smtp-auth-password="your_password" \
-S from="RocketMQ Alert <alert@example.com>" \
ops-team@example.com
}
4.2 钉钉机器人集成
dingding_alert() {
local message="## RocketMQ告警\n**主机**: $(hostname)\n**时间**: $(date)\n**内容**: $1"
local webhook="https://oapi.dingtalk.com/robot/send?access_token=your_token"
curl -s "$webhook" \
-H "Content-Type: application/json" \
-d "{
\"msgtype\": \"markdown\",
\"markdown\": {
\"title\": \"RocketMQ告警\",
\"text\": \"$message\"
},
\"at\": {
\"atMobiles\": [\"138xxxx1234\"],
\"isAtAll\": false
}
}"
}
5. 全自动运维系统搭建
5.1 定时任务配置
# 加入crontab -e
*/5 * * * * /opt/scripts/monitor_dashboard.sh >> /var/log/dashboard_monitor.log 2>&1
0 0 * * * /opt/scripts/rotate_logs.sh >> /var/log/log_rotation.log 2>&1
5.2 系统服务化封装
# /etc/systemd/system/rocketmq-dashboard.service
[Unit]
Description=RocketMQ Dashboard Service
After=network.target
[Service]
Type=forking
ExecStart=/opt/scripts/start_dashboard.sh
ExecStop=/opt/scripts/stop_dashboard.sh
Restart=on-failure
RestartSec=30s
[Install]
WantedBy=multi-user.target
6. 安全增强措施
6.1 权限控制
# 设置目录权限
chown -R rocketmq:rocketmq /opt/rocketmq-dashboard
chmod 750 /opt/rocketmq-dashboard/scripts/*.sh
# 配置sudo权限(visudo)
rocketmq ALL=(root) NOPASSWD: /bin/systemctl start rocketmq-dashboard
rocketmq ALL=(root) NOPASSWD: /bin/systemctl stop rocketmq-dashboard
6.2 网络隔离
# iptables规则示例
iptables -A INPUT -p tcp --dport 8080 -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j DROP
7. 异常处理与故障排查
7.1 常见问题处理指南
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 端口冲突 | 已有进程占用端口 | 使用netstat -tunlp查找并终止冲突进程 |
| JDK版本不兼容 | 使用了不支持的JDK版本 | 切换至JDK 8或官方推荐版本 |
| 内存溢出 | JVM堆内存不足 | 调整Xmx参数,增加内存分配 |
| 连接失败 | Namesrv地址配置错误 | 检查rocketmq.config.namesrvAddr配置 |
7.2 诊断命令速查
# 查看进程状态
ps aux | grep rocketmq-dashboard
# 检查端口监听
ss -tulnp | grep 8080
# 实时日志监控
tail -f /opt/rocketmq-dashboard/logs/dashboard_$(date +%Y%m%d).log
# JVM内存分析
jstat -gcutil $(cat /opt/rocketmq-dashboard/dashboard.pid) 1000 5


被折叠的 条评论
为什么被折叠?



