故障排除

实例卡在 BUILD 状态

导致此问题的原因

  • 消息队列服务(例如 RabbitMQ)与 Trove 客户实例之间的网络问题。在创建 Trove 实例时,trove-taskmanager 会向消息队列发送消息,该消息应由实例内运行的 trove-guestagent 服务接收并处理。处理完成后,trove-guestagent 服务应更新实例的运行状态。显然,如果 trove-guestagent 无法连接到 RabbitMQ,则实例状态将不会更新。

  • trove-guestagent 中的代码错误。您应该能够在 trove-guestagent 日志文件中看到一些错误日志(默认情况下,/var/log/trove/trove-guestagent.log)。

  • 如果您使用的是开发模式镜像,那么 trove-guestagent 无法连接到 Trove 控制器主机以下载 trove-guestagent 服务代码也是有可能的,这可能是由于网络连接问题,或者 SSH 密钥丢失或不正确所致。

无论哪种情况,您都需要检查 trove guest agent 日志。根据 Trove 控制器和 Trove guest agent 之间的消息队列系统是否正常工作,有两种检查日志的方法。

如果需要帮助,请联系 Trove 团队,加入 #openstack-trove IRC 频道或发送电子邮件至 openstack-discuss@lists.openstack.org

注意

Trove 实例创建时间在不同环境中有所不同,usage_timeout 选项的默认值(3600 秒)可能不适用于所有环境。云管理员应根据测试结果更改该值,以便实例创建能够在合理的时间内失败。

将日志发布到 Swift

如果 trove 任务管理器能够通过消息队列与 guest agent 通信,但 guest 实例内部出现问题,您可以轻松地通过运行 CLI 作为管理员用户 来检索 guest agent 日志。

首先,检查 guest 日志是否可用

$ openstack database log list $dbid
+------------+------+----------+-----------+---------+-----------+--------+
| Name       | Type | Status   | Published | Pending | Container | Prefix |
+------------+------+----------+-----------+---------+-----------+--------+
| general    | USER | Disabled |         0 |       0 | None      | None   |
| slow_query | USER | Disabled |         0 |       0 | None      | None   |
| error      | SYS  | Enabled  |         0 |       0 | None      | None   |
| guest      | SYS  | Ready    |         0 |   25781 | None      | None   |
+------------+------+----------+-----------+---------+-----------+--------+

接下来,将 guest 日志发布到对象存储服务(Swift)

$ openstack database log set $dbid guest --publish
+-----------+-----------------------------------------------------------+
| Field     | Value                                                     |
+-----------+-----------------------------------------------------------+
| container | database_logs                                             |
| metafile  | 1be17492-d163-4b5e-b1a3-ae0ab1d98d3a/mysql-guest_metafile |
| name      | guest                                                     |
| pending   | 0                                                         |
| prefix    | 1be17492-d163-4b5e-b1a3-ae0ab1d98d3a/mysql-guest/         |
| published | 25937                                                     |
| status    | Published                                                 |
| type      | SYS                                                       |
+-----------+-----------------------------------------------------------+

您可以检查日志文件是否已上传到 Swift

$ openstack object list database_logs
+---------------------------------------------------------------------------------+
| Name                                                                            |
+---------------------------------------------------------------------------------+
| 1be17492-d163-4b5e-b1a3-ae0ab1d98d3a/mysql-guest/log-2021-03-24T21:03:50.846243 |
| 1be17492-d163-4b5e-b1a3-ae0ab1d98d3a/mysql-guest_metafile                       |
+---------------------------------------------------------------------------------+

现在,您可以将文件下载到本地

$ openstack database log save $dbid guest --file guestagnet.log
Log "guest" written to guestagnet.log

SSH 进入实例

在某些情况下,当 trove 任务管理器无法通过消息队列与 guest agent 通信时,您必须 SSH 进入实例。

要 SSH 进入 Trove 实例,您需要确保

  • 您拥有管理员凭据以获取 Trove 实例管理端口的 IP 地址。管理端口是从管理网络(由 management_networks 配置选项定义)分配的 Neutron 端口。例如,您需要登录名为“test”的 Trove 实例,并且管理网络名称为“trove-mgmt”,您可以运行

    $ openstack server list | grep test | grep trove-mgmt
    | 810fc014-bd9f-4464-b506-1b78f37c495e | test | ACTIVE | private=10.1.0.57; trove-mgmt=192.168.254.229 | ubuntu-focal-mysql-5.7-dev | ds1G   |
    
  • TCP 22 端口允许通过应用于管理端口的 Neutron 安全组(由 management_security_groups 配置选项定义)。

  • 您拥有 SSH 私钥。Trove 实例应使用由 nova_keypair 配置选项定义的 Nova keypair 创建。

登录到实例后,您可以按以下方式检查 trove-guestagent 日志

sudo journalctl -u guest-agent.service | less # or
sudo vi /var/log/trove/trove-guestagent.log