如何排查CentOS RabbitMQ的故障
小樊
32
2025-12-09 14:14:34
CentOS 上 RabbitMQ 故障排查手册
一 快速定位流程
- 服务与进程状态
- 查看服务:systemctl status rabbitmq-server;查看最近日志:journalctl -u rabbitmq-server -n 200 --since “5 minutes ago”
- 前台启动观察输出:sudo -u rabbitmq /usr/sbin/rabbitmq-server(便于直接看到启动报错)
- 端口与连通性
- 关键端口:5672(AMQP)、15672(管理)、4369(epmd)、25672(集群分发)
- 检查占用:ss -lntp | egrep ‘:(5672|15672|4369|25672)’
- 本机连通:curl -I http://localhost:15672;远程连通:nc -vz <服务器IP> 5672
- 日志与诊断
- 日志路径:/var/log/rabbitmq/rabbit@*.log、startup_log
- 配置与节点:rabbitmq-diagnostics config_files;rabbitmqctl status;必要时 rabbitmqctl cluster_status
- 常见根因优先级
- 配置错误、端口冲突、Erlang 版本不兼容、磁盘空间不足、数据目录权限/损坏、防火墙/安全组阻断
二 常见故障与修复
- 服务无法启动(Job for rabbitmq-server.service failed)
- 检查配置语法与加载:rabbitmq-diagnostics config_files;核对 /etc/rabbitmq/rabbitmq.conf 与 conf.d/*.conf
- 端口冲突:ss -lntp | egrep ‘:(5672|15672|4369|25672)’,释放或更换端口后重启
- 依赖与版本:确认 Erlang 与 RabbitMQ 版本兼容;不匹配请按官方矩阵重装
- 资源与权限:df -h 检查磁盘;确保 /var/lib/rabbitmq 及子目录属主为 rabbitmq:rabbitmq
- 数据损坏:备份后清理 Mnesia 数据目录(/var/lib/rabbitmq/mnesia),再启动
- 管理界面访问不了
- 本地验证:curl -I http://localhost:15672;失败多为服务未起或插件未启用
- 启用插件:rabbitmq-plugins enable rabbitmq_management
- 远程访问:开放 15672/tcp(firewall-cmd --zone=public --add-port=15672/tcp --permanent && firewall-cmd --reload),并确认云主机安全组放行
- 客户端连接失败
- 现象与对策
- NoRouteToHost/Host unreachable:多为地址错误或网络不通,核对 IP 与 VPC/路由
- Connection refused:多为端口错误或监听未在该端口,核对 5672 与监听地址
- AuthenticationFailureException:用户名/密码错误,或 Vhost 不存在/无权限,核对凭据与 / 或自定义 Vhost 权限
- SocketTimeoutException:公网访问常见,检查 安全组/防火墙 与端口开放
- 建议:在管理控制台确认“内网/公网连接地址”,必要时创建 Vhost 并为用户授予权限
三 网络与防火墙检查
- firewalld(CentOS 7/8)
- 开放管理端口:firewall-cmd --zone=public --add-port=15672/tcp --permanent
- 开放 AMQP 端口:firewall-cmd --zone=public --add-port=5672/tcp --permanent
- 使配置生效:firewall-cmd --reload;验证:firewall-cmd --query-port=15672/tcp
- 云环境安全组
- 入方向放行 5672/15672(以及集群端口 4369/25672 如需跨节点通信)
- 本机回环与监听地址
- 确认监听:ss -lntp | grep :5672 应看到 0.0.0.0:5672 或 :::5672(而非仅 127.0.0.1)
- 远程测试:nc -vz <服务器IP> 5672 与 15672,分别验证 AMQP 与管理通道
四 版本兼容与分布式要点
- 版本兼容
- 启动失败或插件启用异常时,优先核对 Erlang 与 RabbitMQ 的官方兼容矩阵,不匹配请重装对应版本
- 主机名与 /etc/hosts
- 插件启用超时(如 “badrpc timeout”)常与主机名解析有关,确保 hostname 可解析到 127.0.0.1(/etc/hosts 包含 127.0.0.1 与主机名)
- .erlang.cookie 一致性
- 集群节点需保持 相同 .erlang.cookie 且权限为 400
- 常见路径:RPM 安装为 /var/lib/rabbitmq/.erlang.cookie;二进制安装为 $HOME/.erlang.cookie
- 常用命令
- 用户与权限:rabbitmqctl add_user、set_user_tags、set_permissions
- 集群与健康:rabbitmqctl cluster_status、rabbitmqctl status、rabbitmq-diagnostics
五 消息丢失与可靠性检查
- 生产者确认
- 开启 Confirm 模式,处理 ack/nack 并实现重试与幂等
- 持久化
- 队列与交换机设置 durable=true;消息设置 delivery_mode=2
- 死信队列(DLQ)
- 为业务队列配置 x-dead-letter-exchange 与 x-dead-letter-routing-key,处理失败消息
- 高可用
- 使用 镜像队列 提升可用性:rabbitmqctl set_policy ha-all “^myQueue$” ‘{“ha-mode”:“all”,“ha-sync-mode”:“automatic”}’
- 监控与追踪
- 结合 /var/log/rabbitmq/ 日志与管理界面监控,必要时启用 tracing 定位消息流转