Manila 数据库清除工具

https://blueprints.launchpad.net/manila/+spec/clean-deleted-row-in-db

此规范添加了能够安全地从 Manila 数据库中清除所有相关表中软删除的行的能力。目前,我们保留所有已删除的行。随着我们朝着更可升级的版本发展,这变得不可维护。今天,大多数操作员依赖于手动数据库查询来删除这些数据,但这容易导致人为错误。

目标是将此功能作为 manila-manage db 命令的扩展。类似的规范正在提交到所有接触数据库的各个项目。

问题描述

长期运行的 OpenStack 安装会携带数据库行数年。这带来了以下问题

  • 如果已删除的数据保留在数据库中,行数可能会变得非常大,占用节点上的磁盘空间。更大的磁盘空间意味着对灾难恢复、长时间运行的非差异备份等方面的更多担忧。

  • 大量已删除的行也意味着管理员或授权所有者查询相应的行时会收到 5xx 响应,数据库超时,最终导致其他查询和 API 性能变慢。

  • 如果旧数据样式与最新格式不一致或不兼容,数据库升级能力将是一个巨大的挑战。例如,图像位置字符串,其中较旧的位置字符串样式与最新样式不同。

到目前为止,没有“机制”可以以编程方式清除已删除的数据。

用例

操作员应该能够清除已删除的行,可能按计划(cron 作业)或按需(升级前、维护前)。预期用途是指定今天之前的删除天数,例如“manila-manage db purge 10”将清除“deleted_at”列大于 10 天前的已删除行

提议的变更

提议是将“purge”命令添加到 manila-manage db 命令集合中。它将接受一个非负数(0 将删除“直到现在”的行)的天数参数,并将其用于数据匹配。例如

DELETE FROM shares

WHERE deleted_at <= NOW() - INTERVAL <specified_days> DAY

注意:具有用作外键的属性的行即使满足 deleted_at 时间要求也不会被删除。

为了实现这一点,我们重新排列表列表以应对外键约束。为了使逻辑简单直接,我们将整个表列表硬编码为变量‘PURGE_TABLE_LIST’,现有表的顺序如下(总共 30 个,‘manila_nodes’ 被排除,因为它不存在于数据库中)

  • availability_zones

  • services

  • quotas

  • project_user_quotas

  • quota_classes

  • reservations

  • quota_usages

  • cgsnapshots

  • cgsnapshot_members

  • share_instance_access_map

  • share_access_map

  • share_snapshot_instances,

  • share_instance_export_locations_metadata,

  • share_instance_export_locations

  • share_snapshots

  • share_instances

  • share_type_projects

  • share_type_extra_specs

  • share_types

  • share_metadata

  • shares

  • consistency_groups

  • consistency_group_share_type_mappings

  • share_network_security_service_association

  • security_services

  • share_server_backend_details

  • network_allocations

  • share_servers

  • share_networks

  • drivers_private_data

当数据库模式发生更改时,应同步此列表。

备选方案

今天,这可以通过 SQL 命令或脚本手动完成。

数据模型影响

REST API 影响

CLI 影响

将添加一个新的 manila-manage 命令

manila-manage db purge <age_in_days>

驱动程序影响

安全影响

低,这仅触及已软删除的行。

通知影响

其他最终用户影响

性能影响

这有可能提高大型数据库的性能。长期运行的安装可能会因大型表上的低效操作而受到影响。在清除运行时,这会对数据库性能产生负面影响。

其他部署者影响

开发人员影响

开发人员应在表关系发生变化时更新表列表。

实现

负责人

主要负责人

工作项

  • 实现“db purge”命令。

  • 添加相关的单元测试。

  • 添加此功能的文档。

依赖项

测试

侧重于算法的单元测试用例

  • ‘deleted_at’时间不同的单表。

  • 具有内部关系且其行在‘deleted_at’时间不同的多个表。

侧重于硬编码列表(PURGE_TABLE_LIST)一致性的单元测试用例

  • Manila 中的所有表都应添加到列表中(也可以在此处有目的性地添加例外情况)。

  • 使用外键的每个子表都应在其父表之前。

文档影响

此功能的文档将添加到管理员指南和开发人员参考中。

参考资料

这已经在其他 OpenStack 组件中讨论并接受,例如 Glance [1] 和 Cinder [2]。

[1] https://specs.openstack.org/openstack/glance-specs/specs/mitaka/database-purge.html [2] https://specs.openstack.org/openstack/cinder-specs/specs/kilo/database-purge.html