AMQP server on c ontroller:5672 is unreachable: [Errno 113] EHOSTUNREACH. Trying again in 2 seconds.

本文详细记录了解决CentOS 7安装多节点OpenStack时,Nova Compute无法启动的问题,通过在RabbitMQ服务器上启用iptables规则,开放RabbitMQ端口并允许其他主机访问,最终成功使Nova Compute服务恢复正常。

问题描述:

centos7安装多节点opentack时,nova-compute总是起不来,计算节点的nova-compute日志如下:

2015-06-15 07:20:48.565 16036 INFO nova.virt.driver [-] Loading compute driver 'libvirt.LibvirtDriver'
2015-06-15 07:20:48.571 16036 INFO nova.openstack.common.periodic_task [-] Skipping periodic task _periodic_update_dns because its interval i
s negative
2015-06-15 07:20:48.625 16036 INFO oslo_messaging._drivers.impl_rabbit [req-95a14e35-5e44-49d1-af35-baf3e317be72 - - - - -] Connecting to AMQ
P server on controller:5672
2015-06-15 07:20:48.632 16036 ERROR oslo_messaging._drivers.impl_rabbit [req-95a14e35-5e44-49d1-af35-baf3e317be72 - - - - -] AMQP server on c
ontroller:5672 is unreachable: [Errno 113] EHOSTUNREACH. Trying again in 1 seconds.
2015-06-15 07:20:49.646 16036 ERROR oslo_messaging._drivers.impl_rabbit [req-95a14e35-5e44-49d1-af35-baf3e317be72 - - - - -] AMQP server on c
ontroller:5672 is unreachable: [Errno 113] EHOSTUNREACH. Trying again in 2 seconds.
2015-06-15 07:20:50.660 16036 ERROR oslo_messaging._drivers.impl_rabbit [req-95a14e35-5e44-49d1-af35-baf3e317be72 - - - - -] AMQP server on c
ontroller:5672 is unreachable: [Errno 113] EHOSTUNREACH. Trying again in 2 seconds.
2015-06-15 07:20:51.674 16036 ERROR oslo_messaging._drivers.impl_rabbit [req-95a14e35-5e44-49d1-af35-baf3e317be72 - - - - -] AMQP server on c
ontroller:5672 is unreachable: [Errno 113] EHOSTUNREACH. Trying again in 2 seconds.
2015-06-15 07:20:52.688 16036 ERROR oslo_messaging._drivers.impl_rabbit [req-95a14e35-5e44-49d1-af35-baf3e317be72 - - - - -] AMQP server on c
ontroller:5672 is unreachable: [Errno 113] EHOSTUNREACH. Trying again in 2 seconds.

其他地方无异常,配置文档无异常,防火墙都是关着的

问题解决

启用iptables,在rabbitmq server端加入如下规则,开放rabbitmq端口(5672),允许其他主机访问rabbitmq server:

 # iptables -I INPUT -p tcp --dport 5672 -j ACCEPT
 #添加规则
 # service iptables save
 #保存设置
 # service iptables restart
 # 重启iptables,生效规则

现在再次重启nova-compute服务,发现他可以起来了,问题解决

### RabbitMQ 连接超时的重试策略与优化 在连接 RabbitMQ 时出现 `AMQPConnectionError` 或连接超时问题,通常表明客户端无法与 RabbitMQ 节点建立稳定的 AMQP 连接。此类问题可能由网络配置、节点状态、权限设置或客户端配置不当引起。为应对连接失败,应结合重试策略与问题排查机制,确保连接的可靠性。 #### 重试机制与连接参数优化 在客户端代码中,建议配置自动重试机制以应对短暂的网络波动或服务启动延迟。以 Python 的 `pika` 库为例,可使用 `BlockingConnection` 并结合 `ConnectionParameters` 设置重试参数: ```python import pika import time retries = 5 retry_delay = 5 # seconds for attempt in range(retries): try: credentials = pika.PlainCredentials('gpm_mq', 'password') parameters = pika.ConnectionParameters( host='127.0.0.1', port=5672, virtual_host='gpm_vhost', credentials=credentials, heartbeat=600, # 增加心跳间隔 blocked_connection_timeout=300 # 增加连接阻塞超时时间 ) connection = pika.BlockingConnection(parameters) channel = connection.channel() print("Connected to RabbitMQ successfully.") break except pika.exceptions.AMQPConnectionError as e: print(f"Connection attempt {attempt + 1} failed: {e}") if attempt < retries - 1: print(f"Retrying in {retry_delay} seconds...") time.sleep(retry_delay) else: print("Max retries reached. Could not connect to RabbitMQ.") ``` 此策略通过增加 `heartbeat` 和 `blocked_connection_timeout` 来避免连接因短暂阻塞而中断,并在连接失败时自动重试,提高容错能力。 #### 网络与节点状态检查 连接超时可能源于 RabbitMQ 服务未正常运行或网络配置异常。可通过以下方式验证节点状态: ```bash docker exec -it rabbitmq rabbitmqctl status ``` 若返回 `Node rabbit@rabbitmq is not running`,则表明 RabbitMQ 服务未正常启动,需检查日志以排查问题: ```bash docker logs rabbitmq ``` 此外,需确保 RabbitMQ 容器的 AMQP 端口 5672 已正确映射并开放。在 `docker-compose.yml` 中应包含以下配置: ```yaml ports: - "5672:5672" - "15672:15672" ``` 若使用 `expose` 而非 `ports`,则需确保宿主机防火墙未阻断该端口。可使用 `telnet` 或 `nc` 检查端口连通性: ```bash telnet 127.0.0.1 5672 ``` #### 权限与虚拟主机配置验证 若 RabbitMQ 服务运行正常但连接仍失败,可能是由于用户权限或虚拟主机配置问题。可通过以下命令检查用户权限: ```bash docker exec -it rabbitmq rabbitmqctl list_users docker exec -it rabbitmq rabbitmqctl list_vhosts docker exec -it rabbitmq rabbitmqctl list_permissions -p gpm_vhost ``` 确保用户 `gpm_mq` 存在,并具有访问 `gpm_vhost` 的权限。若权限配置缺失,可通过以下命令添加: ```bash docker exec -it rabbitmq rabbitmqctl add_user gpm_mq password docker exec -it rabbitmq rabbitmqctl set_permissions -p gpm_vhost gpm_mq ".*" ".*" ".*" ``` #### 节点配置与 Cookie 一致性 RabbitMQ 节点间通信依赖 Erlang Cookie,若容器重启后 Cookie 不一致,可能导致节点状态异常。应在 `docker-compose.yml` 中指定固定的 `RABBITMQ_ERLANG_COOKIE`: ```yaml environment: RABBITMQ_ERLANG_COOKIE: "secret_cookie" ``` 若节点曾尝试加入集群但未成功退出,残留的集群状态可能导致当前节点无法正常运行。可通过以下命令重置节点状态: ```bash docker exec -it rabbitmq rabbitmqctl stop_app docker exec -it rabbitmq rabbitmqctl reset docker exec -it rabbitmq rabbitmqctl start_app ``` 此外,确保容器的主机名与 `RABBITMQ_NODENAME` 一致,以避免节点通信失败: ```yaml hostname: rabbitmq environment: RABBITMQ_NODENAME: rabbit@rabbitmq ``` #### 日志分析与常见错误排查 RabbitMQ 的日志文件通常位于 `/var/log/rabbitmq/`,可通过以下命令查看日志: ```bash docker exec -it rabbitmq cat /var/log/rabbitmq/rabbit@rabbitmq.log ``` 若日志中出现 `cannot open cookie file` 或 `.erlang.cookie must be accessible by owner only`,则表明 Erlang Cookie 文件权限配置不当。可通过以下命令修复权限: ```bash docker exec -it rabbitmq chmod 600 /var/lib/rabbitmq/.erlang.cookie ``` 若日志中出现 `Connection refused` 或 `Connection reset`,则表明客户端连接被拒绝或连接异常中断,需检查客户端配置、网络连通性及 RabbitMQ 服务状态。 #### 总结 为确保 RabbitMQ 连接的稳定性,应在客户端代码中实现合理的重试机制,并在部署环境中确保网络配置、节点状态、用户权限及 Cookie 一致性。通过日志分析与状态检查,可进一步定位并解决连接失败的根本原因。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值