在数据模型中强制实例 UUID 的唯一性

https://blueprints.launchpad.net/nova/+spec/enforce-unique-instance-uuid-in-db

数据模型中的 instances.uuid 列并非唯一,但从定义上讲,UUID 应该是唯一的,并且考虑到它在 nova 以及其他 openstack 服务(如 glance、neutron、ceilometer 等)中的使用方式,它应该是唯一的。

此外,针对 instances.uuid 创建了外键,因此它应该是唯一的。

问题描述

  • 数据模型中未强制执行 instances.uuid 的唯一性。

  • 在 instances.uuid 列上创建了外键,因此它应该是唯一的。

用例

作为 DB2 用户(部署者),我希望我的 DB2 Nova 模式具有与 MySQL 和 PostgreSQL 相同的外键约束。

项目优先级

没有,但是这对于 Nova 中的 DB2 支持是必需的。

提议的变更

添加一个数据库迁移,检查现有记录,其中 instances.uuid 或相关的 instance_uuid 列为 NULL,如果找到,则迁移失败,直到这些记录被删除为止。

将提供一个工具来扫描数据库中的这些记录并列出它们,然后提示用户删除它们。该工具还可以提供一个 –force 选项,以忽略任何提示并直接删除找到的记录。

新的迁移将被阻止,直到删除这些记录。一旦没有剩余记录,迁移将通过 SQLAlchemy 使这些列变为非空,并在 instances.uuid 列上创建一个 UniqueConstraint。

请注意,fixed_ips 表是例外,因为它可以通过设计包含 NULL instance_uuid 记录,以指示已释放并分离的固定 IP。

备选方案

不采取任何行动,让 nova 对象层强制实例 UUID 条目的唯一性,但这无助于数据模型中的外键问题。

数据模型影响

  1. 必须删除 NULL instances.uuid/instance_uuid 记录,除了上述描述的 fixed_ips 表中的记录。

  2. instances.uuid 列将被设置为非空。

  3. 将在 instances.uuid 列上创建一个 UniqueConstraint。

REST API 影响

无。

安全影响

无。

通知影响

无。

其他最终用户影响

无。

性能影响

现有部署中唯一的性能影响在于迁移脚本的更改,这些更改将使用 turbo-hipster 进行测试。

其他部署者影响

对部署者的主要影响是

  1. 最大的影响是新的迁移。迁移可能很慢,并且在运行时需要关闭控制器服务。

  2. 希望现有的部署不会携带 instances.uuid 或 instance_uuid 为 None 的记录,因此新的迁移脚本中的 NULL 查询不会产生大量结果集。但是,部署者在这里的影响是,他们将被强制手动清理这些记录,然后迁移才能继续。请注意,预计这些情况是例外情况,它们只是不一致数据库的结果。因此,找到这些记录并不预期,但如果存在问题,迁移将明确失败,并提供有关如何解决问题的说明。

开发人员影响

无。

实现

负责人

主要负责人

mriedem@us.ibm.com

工作项

  1. 添加一个新的迁移,使 instances.uuid 变为非空,并在该列上放置一个唯一约束。

  2. 编写一个工具,用于在实际迁移之前检查数据库中的空 instance_uuid 记录,供操作员使用。

有关详细信息,请参阅 WIP 补丁:https://review.openstack.org/#/c/97946/

依赖项

无。

测试

  • 将为新的数据库迁移添加单元测试,以模拟一个包含 NULL instance_uuid 记录的数据库,以确保当找到这些记录时迁移失败,然后测试当删除它们时,迁移成功完成并且创建了唯一约束。同样,降级路径也将进行单元测试。

  • 还将为用于在实际数据库迁移之外运行的扫描工具编写单元测试。这将模拟后端数据库,但将用于测试 CLI 和逻辑。

  • 预计 turbo-hipster 将涵盖 MySQL 的新迁移的规模测试。

文档影响

无。

参考资料