在分布式架构中,RocketMQ 作为核心消息中间件,其稳定性直接影响整个系统的可靠性。我曾经历过一次线上事故:由于 Broker 进程异常退出但端口仍保持监听,导致消息堆积超过 12 小时才被发现。这套 Zabbix 监控方案正是基于这类真实故障场景设计,通过进程+端口的双重检测机制,可以捕捉 99% 以上的异常情况。
不同于常规的端口监控,我们的方案包含三个关键维度:
这种组合式监控能有效避免以下典型问题:
mermaid复制graph TD
A[Zabbix Agent] -->|执行命令| B[UserParameter]
B --> C[进程检测脚本]
B --> D[端口检测模块]
C --> E[返回状态码]
D --> F[返回端口状态]
E --> G[触发器判断]
F --> G
G --> H[告警通知]
注意:实际部署时需要特别注意 Zabbix Agent 的执行权限问题,建议使用 zabbix 用户测试命令执行
在被监控节点上需要配置以下关键项:
bash复制# 编辑配置文件(通常位于)
vim /etc/zabbix/zabbix_agentd.conf
# 添加以下自定义参数(建议放在文件末尾)
UserParameter=rocketmq.namesrv.status,pgrep -f org.apache.rocketmq.namesrv.NamesrvStartup >/dev/null && echo 1 || echo 0
UserParameter=rocketmq.broker.status,pgrep -f org.apache.rocketmq.broker.BrokerStartup >/dev/null && echo 1 || echo 0
# 重启服务生效
systemctl restart zabbix-agent
如果遇到权限问题,需要额外配置:
bash复制# 检查zabbix用户权限
getfacl /usr/bin/pgrep
# 临时解决方案(生产环境需谨慎)
setsebool -P zabbix_can_network=1
| 监控项名称 | 类型 | Key | 采集间隔 | 说明 |
|---|---|---|---|---|
| rocketmq broker process | ZABBIX_ACTIVE | rocketmq.broker.status |
30s | 返回值1表示正常,0表示异常 |
| rocketmq broker tcp port | ZABBIX_ACTIVE | net.tcp.listen[{$ROCKETMQ_BROCKER_TCP}] |
60s | 检测10911端口状态,建议与进程监控错开采集时间 |
| rocketmq HA port | ZABBIX_ACTIVE | net.tcp.listen[{$ROCKETMQ_BROCKER_HA}] |
90s | 主从同步端口检测,间隔可适当延长 |
原始触发器表达式可以进一步优化:
bash复制# 原表达式
(last(/rocketmq/rocketmq.broker.status)=0 or last(/rocketmq/net.tcp.listen[{$ROCKETMQ_BROCKER_TCP}])=0)
# 优化后(增加连续检测机制)
(min(/rocketmq/rocketmq.broker.status,5m)=0 or min(/rocketmq/net.tcp.listen[{$ROCKETMQ_BROCKER_TCP}],5m)=0)
这样修改可以避免网络抖动导致的误报,只有持续5分钟异常才会触发告警。
对于多环境部署,建议采用分层宏配置:
全局宏(模板级别):
yaml复制{$ROCKETMQ_BROCKER_HA} => 10909
{$ROCKETMQ_BROCKER_TCP} => 10911
主机宏(针对特殊节点):
yaml复制# 对于使用非标端口的节点
{$ROCKETMQ_BROCKER_HA} => 11909
这种设计既保证了统一性,又保留了灵活性。
对于多节点集群,推荐采用以下部署模式:
NameServer 监控:
Broker 分组监控:
bash复制# 主从分组监控
UserParameter=rocketmq.broker.master.status,pgrep -f 'BrokerStartup.*-m' && echo 1 || echo 0
UserParameter=rocketmq.broker.slave.status,pgrep -f 'BrokerStartup.*-s' && echo 1 || echo 0
除了基础监控,还可以增加:
bash复制# 消息堆积量监控(需要RocketMQ控制台API支持)
UserParameter=rocketmq.topic.backlog,curl -s http://localhost:8080/topicStats?topic=您的TOPIC | jq '.data[0].backlog'
检查流程:
确认Agent服务状态
bash复制systemctl status zabbix-agent
测试命令执行
bash复制su - zabbix -s /bin/bash -c "pgrep -f BrokerStartup"
检查日志
bash复制tail -f /var/log/zabbix/zabbix_agentd.log
典型场景及解决方案:
| 场景 | 现象 | 解决方案 |
|---|---|---|
| 进程假死 | 端口通但无响应 | 增加HTTP API检测 |
| 主从切换期间 | 短暂端口不可用 | 调整触发器检测时长 |
| 资源不足 | 进程存在但无响应 | 增加内存/CPU监控 |
根据实际使用经验,建议后续优化:
增加趋势预测:
智能基线告警:
bash复制# 动态基线示例
trigger.expression = abs(avg(//item,1h)-last(//item))>3*stddev(//item,7d)
可视化增强:
这套模板在实际生产环境中已经稳定运行超过2年,监控着日均百亿级消息流转的RocketMQ集群。最关键的经验是:对于消息中间件,宁可误报也不要漏报,消息堆积的检测延迟必须控制在5分钟以内。