RabbitMQ 监控运维与常见问题
消息中间件上了生产,日常主要盯三件事:节点是否健康、队列有没有积压、告警有没有触发。本章给出常用诊断命令和一张常见问题速查表,覆盖从日常巡检到故障定位的主要场景。
节点健康检查:rabbitmq-diagnostics
RabbitMQ 自带的诊断命令能快速确认"节点起没起、有没有告警":
rabbitmq-diagnostics -q ping # 节点是否可达
# 输出:Ping succeeded
rabbitmq-diagnostics -q check_running # 应用是否在运行
# 输出:Status of node rabbit@myhost ... running
rabbitmq-diagnostics -q check_alarms # 有无内存/磁盘告警
# 输出:No alarms detected
rabbitmq-diagnostics status # 节点完整状态
发现告警或异常先看日志:/var/log/rabbitmq/ 下的 rabbit@主机名.log,重点搜 resource_alarm、memory、disk 等关键字。
监控指标从哪拿
管理台(15672)与 HTTP API 都能看到队列长度、连接数、消息速率:GET /api/overview、/api/nodes、/api/queues 返回 JSON,监控系统定期抓取即可。命令行最常用的是积压相关指标:
rabbitmqctl list_queues name messages messages_unacknowledged consumers
# 输出:q.order 1200 3 2
常见问题速查表
| 现象 | 常见原因 | 处理 |
|---|---|---|
| 生产者被阻塞、发消息超时 | 内存/磁盘告警触发 flow control | check_alarms 定位,清积压、加内存、清理磁盘 |
| 日志报 Memory alarm | 内存水位超限(默认约为物理内存的 0.4) | 调到 0.6/0.8 或扩容,注意给系统留内存 |
| 日志报 Free disk alarm | 磁盘余量低于下限(默认约 50MB) | 清理日志/数据盘、扩容或调 disk_free_limit |
| 连接频繁被关闭 | heartbeat 超时(默认约 60 秒) | 客户端配置合理 heartbeat,避免线程长时间阻塞 |
| 消息不消费、卡在 unacked | 消费端没 ack 或消费逻辑卡死 | 检查 ack 路径,重启消费者触发重新投递 |
| 队列消息持续增长 | 生产者速率高于消费者速率 | 加消费者、调大 prefetch、优化消费耗时 |
| guest 无法远程登录 | guest 账号只允许本机回环使用 | 新建用户授权后用新用户连接 |
| 端口连不通 | 防火墙/安全组未放行 | 放行 5672、15672;集群内另放 25672、4369 |
内存/磁盘告警期间 broker 会暂停接收新消息(flow control),表现就是生产者阻塞——这是自我保护而非故障,水位恢复后自动解除。告警水位都可在 rabbitmq.conf 中调整(vm_memory_high_watermark.relative、disk_free_limit)。
创建可远程登录的管理用户:
rabbitmqctl add_user ops "Ops@123456"
rabbitmqctl set_user_tags ops administrator
rabbitmqctl set_permissions -p / ops ".*" ".*" ".*"
消费者不消费的排查顺序:先看队列的 messages/messages_unacknowledged 是否卡在 unacked(消费端没 ack 或已崩溃),再看连接与信道是否存在,最后检查 consumer 的 prefetch 是否设置异常。
定义备份与恢复
RabbitMQ 的"定义"(交换机、队列、绑定、用户、权限等)可整体导出为 JSON,消息内容本身不在定义文件中:
# 导出定义到 JSON 文件
rabbitmqadmin export /backup/rabbit-defs.json
# 在新环境或故障恢复时导入
rabbitmqadmin import /backup/rabbit-defs.json
消息级容灾要靠队列副本(镜像/仲裁队列)、双写或 shovel 复制,定义备份只是保证"配置可重建"。
小结
日常巡检三板斧:rabbitmq-diagnostics 查健康与告警、list_queues 盯积压、管理 API 出监控数据;遇到生产者阻塞先查内存/磁盘告警,消费者不动先查 unacked 与 ack 逻辑,并定期用 rabbitmqadmin export 备份定义文件。