清理悬挂卷块设备映射

https://blueprints.launchpad.net/nova/+spec/cleanup-dangling-volume-attachments

查找 Nova 和 Cinder 数据库中是否存在任何悬挂/未附加的卷,如果存在则删除它们。

问题描述

在某些卷相关操作之后,卷可能从实例分离,但 Nova 未收到通知,并且仍然认为卷已附加到实例,因为卷附加 ID 仍然列在 Nova 的 BDM 表中。

这可能导致功能出现不同的问题,这些功能需要从 block_device_mapping 表中获取卷详细信息,例如实时迁移和实例调整大小。

类似地,Cinder 侧的附件存在于实例,但在 Nova 数据库中不存在。

用例

  • 作为操作员,我希望从我的实例中安全地删除所有悬挂卷附件,因为在实例启动时,这些附件可能导致实例进入错误状态。

  • 作为操作员,我希望从我的实例中安全地删除所有悬挂卷附件,以便任何卷相关操作都不会受到影响。

  • 作为管理员,我希望列在 Cinder 上的所有悬挂附件,从 Cinder 数据库中安全地删除,这些附件声称属于该实例。

提议的变更

说明

要启动新实例,Nova 从 Glance 获取基本 OS 镜像的副本,现在此镜像是一种实例存储,这意味着如果我们创建任何文件,它将持久保存在此存储中。Nova 在 block_device_mapping 数据库中为其创建一个 BDM,source_type 为 image,destination_type 为 local。

类似地,当我们要求 Nova 将卷附加到实例时,Nova 在 block_device_mapping 数据库中为其创建一个 BDM,并将 source_type 和 destination_type 设置为 volume。

变更

在重新启动实例时,根据 source_type 和 volume_type,验证附加的 BDM 是否为卷。如果是卷,则验证它是否存在于 Cinder 中。如果存在,验证其状态是否为“in-use”(使用中)或“available”(可用)。如果状态为“in-use”,则表示卷附件正确,Nova 和 Cinder 都知道此附件。如果状态为“available”,则表示卷未正确附加到实例,因此从 block_device_mapping 数据库中删除或软删除 BDM。

同时记录更新信息,以便操作员可以了解数据库中此修改的原因。

代码变更

要从数据库中删除 BDM,我们首先需要关闭实例,以便在 virt 级别重新定义实例域。我们需要确保在生成新的 XML 之前更新 BDM。

因此,此功能应添加到实例重新启动过程中。在重新启动时,通过 Cinder API 调用更新 Nova 侧的 block_device_mapping DB 和 Cinder 侧的 volume_attachment DB。实例正确关闭后,在再次启动时,在 virt 级别(例如 libvirt),驱动程序模块将生成一个包含更新的 BDM 的新 XML 域。

应在 ComputeManager 内部添加函数 _delete_dangling_bdms(),并从 ComputeManager.reboot_instance 调用。它应验证目标卷 BDM source 和 destination type 是否不是 image 和 local,而是 volume,然后如果目标卷未列在 Cinder 中,或者 Cinder 中卷的状态为“available”而不是“in-use”,则从 block_device_mapping 表中删除 BDM 映射。

找到悬挂卷后,记录一条消息,说明正在删除过时的卷附件。

备选方案

  • 为 Nova-manage 实用程序添加一个清理功能,该功能接受实例并删除实例中的所有悬挂卷。

    $ nova-manage volume_attachment cleanup <server-id>
    
  • 一个 cron 作业,该作业检查 Nova BDM 和 Cinder volume_attachment 表中的每个实例,如果实例具有悬挂卷,则从表中删除卷条目。在此作业中不需要实例 UUID。

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

由于将向 Cinder 服务发出 GET 和 DELETE API 调用,服务器可能需要更长的时间才能重新启动。

这主要取决于要删除的附件数量。

其他部署者影响

开发人员影响

升级影响

实现

负责人

主要负责人

auniyal

功能联络人

功能联络人

工作项

  • 创建一个清理功能并将其添加到实例重新启动过程中。

  • 添加清理的单元和功能测试。

依赖项

测试

将添加单元和功能测试。

文档影响

  • 将添加服务器重启时清理悬挂卷的发布说明。

  • 更新管理卷文档。

参考资料

历史

修订版

发布名称

描述

2023.2 Bobcat

引入