添加 nova-manage db purge-deleted-instances

https://blueprints.launchpad.net/nova/+spec/purge-deleted-instances-cmd

在拥有自动化的 DB 归档清除软删除行 之前,我们应该有一种从数据库中清除软删除实例及其相关元表(如 instance_metadata、instance_system_metadata、instance_info_cache、instance_extra、tags 等)的方法。基本上,任何在 nova.objects.Instance.INSTANCE_OPTIONAL_ATTRS 中显示,并且数据模型中存在对实例的反向引用(backref)的表。

问题描述

许多部署已经有一套工具/脚本可以执行类似的操作,但它们必须直接进入 nova 数据库才能做到。通过 nova-manage db 命令,我们至少可以将其与代码一起发布并进行测试,直到实现更好的解决方案,例如上述归档或不再使用软删除规范。

用例

作为云操作员,我希望通过清除软删除实例来管理数据库的大小——我不在乎将其归档到影子表。

提议的变更

编写一个类似于 nova-manage db null-instance-uuid-scan 命令 [1] 的命令,该命令查找所有 deleted != 0 的实例记录,以及那些相关的反向引用表记录(外键返回到实例表),并删除所有这些记录(清除)。表列表将通过白名单进行管理。

注意

该命令正在扫描 instances.deleted != 0,而不是实际的 SOFT_DELETED vm_state,后者通过 _reclaim_queued_deletes 定期任务中的 reclaim_instance_interval 配置选项进行检查。[2]

将有一个 --dry 选项,用于仅转储找到的内容,但不实际删除任何内容。

将有一个 --older-than 选项,用于限制删除实例的删除时间(基于 deleted_at 列),单位为天。默认情况下,这将是 90 天。

该命令的帮助文本将包含一个警告,说明运行该命令和实际删除数据的风险,以便人们了解他们正在做什么。

在拥有更好的归档能力选项(包括硬删除)和/或 我们从数据模型中删除对 SoftDeleteMixin 的支持,以便删除实际执行硬删除之前,这应该是一个临时命令。话虽如此,取决于此命令的实用性以及未来的发展,它可能会在代码库中存在很长时间。

受影响表的白名单

  • block_device_mapping

  • consoles

  • instances

  • instance_actions_events

  • instance_actions

  • instance_extra

  • instance_faults

  • instance_info_cache

  • instance_metadata

  • instance_system_metadata

  • migrations

  • pci_devices

  • security_group_instance_association

  • tags

  • virtual_interfaces

注意

  • fixed_ips 表不包含在内,因为实例是通过 nova-network 的租借/释放操作与 fixed_ips 关联的,并且 ForeignKeyConstraint 应该仅在实例未(软)删除时才保持有效。[3]

  • security_groups 表不包含在内,因为安全组可以应用于多个实例。

备选方案

数据模型影响

REST API 影响

安全影响

nova-manage 命令仅供管理员使用。显然,任何永久删除数据的入口点都是危险的,但此规范假定部署者已经采取了必要的安全预防措施来锁定对 nova-manage 命令的访问。

清除已删除的行还会影响执行审计的能力。

通知影响

其他最终用户影响

性能影响

在进行大规模清除时可能会产生一些影响,因此作为命令实现的一部分,将有一个 --max-number 选项,类似于 nova-manage db migrate_flavor_data 命令。[4]

其他部署者影响

开发人员影响

如果添加了新的表,这些表具有对实例表的反向引用,并使用数据模型中的 SoftDeleteMixin,则应考虑注册到 nova-manage db purge-delete-instances 命令。

实现

负责人

主要负责人

其他贡献者

工作项

  • 将命令添加到 nova.cmd.manage.DbCommands。

  • ?

  • 盈利!

依赖项

测试

  • nova 代码树中的功能测试就足够了。

  • 测试场景包括

    • 创建一个具有相关反向引用表(元数据、系统元数据、info_cache、tags 等)的实例记录,删除该实例(instances.deleted != 0),运行清除命令,验证该记录是否已从实例表中删除,并且相关的反向引用表记录也已删除。

    • 将 instance.vm_state 设置为“SOFT_DELETED”且 instance.deleted=0,运行清除命令,验证该记录仍然在实例表中。

文档影响

  • 发布说明和 nova-manage db 命令 --help 文本,如通常所做的那样。

参考资料

历史

修订版

发布名称

描述

Mitaka

引入