添加 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 表不包含在内,因为安全组可以应用于多个实例。
备选方案¶
什么都不做,让操作员自行处理。
等待 DB 归档框架。
等待我们解决 数据模型中的 SoftDeleteMixin。
等待一个 定期任务来清除已删除的行。
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
nova-manage 命令仅供管理员使用。显然,任何永久删除数据的入口点都是危险的,但此规范假定部署者已经采取了必要的安全预防措施来锁定对 nova-manage 命令的访问。
清除已删除的行还会影响执行审计的能力。
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
在进行大规模清除时可能会产生一些影响,因此作为命令实现的一部分,将有一个 --max-number 选项,类似于 nova-manage db migrate_flavor_data 命令。[4]
其他部署者影响¶
无
开发人员影响¶
如果添加了新的表,这些表具有对实例表的反向引用,并使用数据模型中的 SoftDeleteMixin,则应考虑注册到 nova-manage db purge-delete-instances 命令。
实现¶
负责人¶
主要负责人
Cale Rath <ctrath@us.ibm.com>
其他贡献者
Matt Riedemann <mriedem@us.ibm.com>
Dan Smith <dms@danplanet.com>
工作项¶
将命令添加到 nova.cmd.manage.DbCommands。
?
盈利!
依赖项¶
无
测试¶
nova 代码树中的功能测试就足够了。
测试场景包括
创建一个具有相关反向引用表(元数据、系统元数据、info_cache、tags 等)的实例记录,删除该实例(instances.deleted != 0),运行清除命令,验证该记录是否已从实例表中删除,并且相关的反向引用表记录也已删除。
将 instance.vm_state 设置为“SOFT_DELETED”且 instance.deleted=0,运行清除命令,验证该记录仍然在实例表中。
文档影响¶
发布说明和 nova-manage db 命令
--help文本,如通常所做的那样。
参考资料¶
历史¶
发布名称 |
描述 |
|---|---|
Mitaka |
引入 |