Linux RabbitMQ故障排查方法
小樊
36
2025-12-22 14:10:36
Linux 上 RabbitMQ 故障排查方法
一 快速定位流程
服务与进程
检查运行状态:systemctl status rabbitmq-server
重启服务:systemctl restart rabbitmq-server
查看进程:ps -ef | grep rabbitmq
端口与连通性
协议端口:5672 (AMQP)、15672 (管理 UI,启用时)
本机连通:telnet 127.0.0.1 5672 、wget http://localhost:15672
远程连通:在客户端执行 telnet <服务器IP> 5672 ;若不通,排查网络与防火墙
日志与告警
日志目录:/var/log/rabbitmq/ ,重点查看 rabbit@.log 与 rabbit@-sasl.log
关键字:ERROR/WARNING/resource alarm/network partition/failed to resolve
集群与健康
节点状态:rabbitmqctl status
集群状态:rabbitmqctl cluster_status
队列与通道:rabbitmqctl list_queues name messages messages_ready messages_unacknowledged memory consumers 、rabbitmqctl list_channels name consumer_count messages_unacknowledged 、rabbitmqctl list_connections name state
资源与限制
文件描述符:rabbitmqctl status | grep file_descriptors
系统/容器限制:ulimit -n 、systemctl show rabbitmq-server | grep LimitNOFILE
配置与权限
主配置:/etc/rabbitmq/rabbitmq.conf ;环境变量:/etc/rabbitmq/rabbitmq-env.conf
数据目录权限:确保 /var/lib/rabbitmq/ 及子目录属主为 rabbitmq:rabbitmq
二 常见故障与修复要点
远程访问不通
现象:管理页面或客户端连不上 15672/5672
排查:本机可访问而远程不可达,多为 firewalld/iptables 未放行端口
处置(CentOS 7+):firewall-cmd --zone=public --add-port=15672/tcp --permanent && firewall-cmd --reload ;同理放行 5672 ;验证:firewall-cmd --query-port=15672/tcp
节点无法加入集群或启动失败
现象:cluster_status 异常、节点反复离线
排查:.erlang.cookie 不一致、主机名解析失败、残留 Mnesia 数据冲突
处置:统一 .erlang.cookie 权限为 400 ,修正 /etc/hosts 或 DNS,必要时清理冲突的 Mnesia 数据后重启
网络分区与脑裂
现象:管理 UI 出现 Network partition detected ,节点各自为政
排查:未放行 4369(epmd)/25672(Erlang 分发) 、网络高延迟/丢包、节点负载过高
处置:优先恢复网络与心跳;按策略处理分区(如 pause-minority ),再重建一致性
磁盘/内存告警导致生产者阻塞
现象:日志出现 resource alarm ,publish 被拒或阻塞
排查:磁盘空间不足、消息大量堆积、大消息写盘压力
处置:临时扩容/清理无用队列与日志;长期设置 队列长度 x-max-length 、消息 TTL 、采用 lazy queue 、优化磁盘 I/O(如 SSD )
文件描述符耗尽
现象:日志出现 too many open files ,新连接失败
排查:ulimit -n 与 systemd LimitNOFILE 过小
处置:在 systemd 服务中设置 LimitNOFILE=65536 (或更高),并重启服务
消费者未确认导致堆积与内存飙升
现象:messages_unacknowledged 持续增长
排查:消费者处理慢、prefetch 过大、异常退出未 ack
处置:合理设置 QoS/prefetch (如 50),确保消费端正确 ack ,优化消费逻辑与并发度
三 日志与关键命令速查
日志定位
默认路径:/var/log/rabbitmq/rabbit@.log 、rabbit@-sasl.log
实时查看:tail -f /var/log/rabbitmq/rabbit@.log | egrep ‘ERROR|WARNING|resource alarm|partition’
容器日志:docker logs <container_id>
状态与资源
节点与集群:rabbitmqctl status 、rabbitmqctl cluster_status
队列/通道/连接:见“快速定位流程”
文件描述符:rabbitmqctl status | grep file_descriptors
访问控制与诊断
用户与权限:rabbitmqctl list_users 、rabbitmqctl list_vhosts 、rabbitmqctl set_permissions -p / my_vhost “." ". ” “.*”
环境变量:rabbitmqctl environment
异常终止与崩溃转储
检查是否存在 erl_crash.dump ,必要时用 erl -noshell -eval ‘rdump:analyze(“erl_crash.dump”).’ -s init stop 辅助分析
四 预防与最佳实践
版本与兼容
确保 Erlang/OTP 与 RabbitMQ 版本匹配,避免因不兼容导致崩溃或异常终止
网络与集群
同可用区部署,低延迟网络;放行 4369/25672 ;集群规模建议 3 或 5 节点 ,策略采用 pause-minority 降低脑裂风险
资源与容量
系统 ulimit -n ≥ 65535 ,systemd 设置 LimitNOFILE ;磁盘预留 ≥ 30% 空间;对大堆积场景启用 lazy queue 与合理 TTL/长度 策略
监控与告警
接入 Prometheus + Grafana ,监控 磁盘/内存/队列深度/连接数/告警 ,设置阈值与恢复告警
配置与变更
自动化管理 .erlang.cookie 与关键配置;上线前压测与故障演练(宕机、磁盘满、网络分区)