在数据模型中强制实例 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 列上创建了外键,因此它应该是唯一的。
提议的变更¶
添加一个数据库迁移,检查现有记录,其中 instances.uuid 或相关的 instance_uuid 列为 NULL,如果找到,则在删除这些记录之前,迁移将失败。
将提供一个工具来扫描数据库中的这些记录并列出它们,然后提示用户删除它们。该工具还可以提供一个 –force 选项,以忽略任何提示并直接删除找到的记录。
新的迁移将被阻止,直到删除这些记录。记录删除后,迁移将通过 SQLAlchemy 使这些列变为非空,并在 instances.uuid 列上创建一个 UniqueConstraint。
请注意,fixed_ips 表是例外,因为它可以通过设计包含 NULL instance_uuid 记录,以指示已释放和分离的固定 IP。
备选方案¶
不采取任何措施,让 nova 对象层强制执行唯一的实例 UUID 条目,但这无助于数据模型中的外键问题。
数据模型影响¶
必须删除 NULL instances.uuid/instance_uuid 记录,除了上述描述的 fixed_ips 表中的记录。
instances.uuid 列将被设置为非空。
将在 instances.uuid 列上创建一个 UniqueConstraint。
REST API 影响¶
无。
安全影响¶
无。
通知影响¶
无。
其他最终用户影响¶
无。
性能影响¶
现有部署中唯一的性能影响在于迁移脚本的更改,这些更改将使用 turbo-hipster 进行测试。
其他部署者影响¶
对部署者的主要影响是
最大的影响是新的迁移。迁移可能很慢,并且在运行时需要关闭控制器服务。
希望现有的部署不携带 instances.uuid 或 instance_uuid 为 None 的记录,因此新迁移脚本中的 NULL 查询不会产生大量结果集。但是,对部署者的影响是,他们将被强制手动清理这些记录,然后迁移才能继续。值得注意的是,预计这些情况是例外情况,它们只是不一致数据库的结果。因此,找到这些记录并不预期,但如果存在问题,迁移将明确失败,并提供有关如何解决问题的说明。
开发人员影响¶
无。
实现¶
负责人¶
- 主要负责人
工作项¶
添加一个新的迁移,使 instances.uuid 变为非空,并在该列上放置一个唯一约束。
编写一个工具,供操作员在实际迁移之前检查数据库中的空 instance_uuid 记录。
有关详细信息,请参阅 WIP 补丁:https://review.openstack.org/#/c/97946/
依赖项¶
无。
测试¶
将添加新的数据库迁移的单元测试,以模拟一个包含 NULL instance_uuid 记录的数据库,以确保在找到这些记录时迁移失败,然后测试在删除它们后,迁移成功完成并且创建了唯一约束。同样,降级路径也将进行单元测试。
还将为用于在实际数据库迁移之外运行的扫描工具编写单元测试。这将模拟后端数据库,但将用于测试 CLI 和逻辑。
预计 turbo-hipster 将涵盖使用 MySQL 对新迁移进行规模测试。
文档影响¶
无。
参考资料¶
正在进行中的 nova 补丁:https://review.openstack.org/#/c/97946/
关于使 instances.uuid 变为非空的邮件列表主题:http://lists.openstack.org/pipermail/openstack-dev/2014-March/029467.html