当 nova 数据库包含附件但 cinder 不包含附件时,最好的修复方法是什么?

当 nova 数据库包含附件但 cinder 不包含附件时,最好的修复方法是什么?

在我们的 OpenStack 云中,有一台带有 的服务器server_id和一个带有 的卷<volume_id>。我们遇到的情况是,从 Nova 的角度来看,似乎有一个卷已连接,但从 Cinder 的角度来看却没有。nova 数据库中有一条关于此连接的记录:MariaDB [(none)]> select * from block_device_mapping where instance_uuid = "<volume_id>",显示该条目。

Nova 显示附件:

openstack server show <server_id>
+-------------------------------------+----------------------------------------------------------+
| Field                               | Value                                                    |
+-------------------------------------+---------------------------------------------------------
| volumes_attached                    | id='...'                                                 |
|                                     | id='<volume_id'                                          |
+-------------------------------------+----------------------------------------------------------+

Cinder,不知道此附件:

openstack volume show <volume_id>
+--------------------------------+--------------------------------------+
| Field                          | Value                                |
+--------------------------------+--------------------------------------+
| attachments                    | []                                   |

从虚拟机内部来看,该卷似乎已连接并可进行操作。

我尝试将卷设置为availabledetached状态,但在我尝试过的任何状态下都无法将其连接。

它也尝试完全删除附件。当运行openstack server remove volumenova volume-detach命令完成且没有错误时,cinder 日志显示:Roll detaching of volume completed successfully.但是,情况并没有改变。

从这种情况中恢复的最佳方法是什么?对于这个特定的虚拟机,我想我可以从中删除数据库条目block_device_mapping并重建虚拟机?对于未来,我想知道是否也可以修复 OpenStack 中的情况以反映现实世界的情况。这意味着,我有什么方法可以添加附件,以便它也可以在 Cinder 中看到?

答案1

对于任何情况,如果有人仍在寻找解决方案:您需要在表 block_device_mapping(nova DB)中找到记录并将其删除。

select * from nova.block_device_mapping where deleted_at is NULL and volume_id = 'vol_id'\G

用事务删除时要小心,因为错误的操作可能会带来很大的危害:

BEGIN;
UPDATE nova.block_device_mapping SET deleted=id, deleted_at=NOW() WHERE id='vol_id' LIMIT 1;
#select to check that you have made it right and, if all is correct, COMMIT (ROLLBACK if it is wrong)
COMMIT;

之后硬重启虚拟机。

在 cinder DB 中,您可以检查 volume_attachment 表(以确保)

select * from cinder.volume_attachment where volume_id = '' and deleted <> '1'\G

相关内容