持久资源声明¶
https://blueprints.launchpad.net/nova/+spec/persistent-resource-claim
此蓝图计划增强计算资源跟踪器,使资源声明在 nova-compute 重启后保持持久化。这将有助于将资源声明过程移动到 conductor。
问题描述¶
资源跟踪器提供了一个接口来为实例声明资源。但是,声明结果仅保存在内存中,而不是持久保存,并向调用者返回一个上下文管理器。
这种实现方式存在一些潜在问题。首先,由于它将声明作为上下文管理器返回,因此很难支持两阶段资源声明。其次,如果没有持久声明,资源跟踪器必须从实例和迁移对象重新计算声明,这需要更多的数据库访问,并且需要锁来创建迁移对象以及设置实例的主机/节点。第三,由于声明不是持久的,无法远程调用,因此很难将 _prep_resize() 移动到 conductor。
提议的变更¶
我们建议更改资源跟踪器以跟踪资源声明并持久化资源声明。
当声明资源时,资源跟踪器将跟踪声明结果。每个声明将由计算节点和节点中的唯一 ID 标识。
资源声明由计算管理器持久保存。
有几种解决方案可以持久化声明,例如将其保存在中央数据库或本地 sqlite 中。在此规范中,我们将仅在本地 sqlite 中持久化声明,并创建一个声明表来跟踪资源声明。我们稍后会将其增强为可配置为本地 sqlite 或中央数据库。使用类似 service_group 的机制使未来的扩展更容易。
有关更多信息,请参阅“替代方案”。
声明持久化代码定义声明格式版本,并在需要新版本时升级声明表,以便我们可以轻松地增强资源声明,例如支持 extra_info。创建一个单独的 sqlite 表来保存当前声明表的版本信息。
当计算服务在升级后重新启动时,它将检查声明表版本。如果声明表版本低于声明持久化代码中的最新版本,它将升级声明表到最新版本,然后更新版本表。升级代码了解每个版本的模式,因此我们不需要在 sqlite 中保留模式信息。
当计算节点从非持久声明升级到持久声明时,升级代码将发现表不存在,因此将根据实例/迁移信息从头开始创建表。
计算管理器的定期任务将清理任何孤立声明。如果节点中没有与实例或迁移对象对应的资源声明,并且它已创建了指定的时间段,则它是孤立声明并将被清理。 “指定”时间是一个配置项。
另外,如果服务器在主机关闭时被撤离,则在计算服务重新启动时,相应的资源声明将被释放。
将来,这种清理应该发生在 conductor 中,它将负责垃圾收集。
备选方案¶
我们进行了一些讨论,关于如何保持声明的持久化。最初建议将声明保存在中央数据库中。中央数据库将提供全局视图并且将更加健壮,但它会影响每个定期任务的性能。后来,建议首先保存在 sqlite 中,这将提供更好的性能,并且将来可以扩展到中央数据库。
数据模型影响¶
创建一个 sqlite 表(声明表)来保存声明。以下是在 sqlite 中要使用的的数据模型。虽然使用 sqlite 类型定义,但它也应该类似于中央数据库
id: INTEGER host: TEXT node: TEXT instance_uuid: TEXT vcpus: INTEGER memory_mb: INTEGER disk_gb: INTEGER pci: TEXT resize_target: INTEGER created_at: TEXT
resize_target 用于区分同一主机上相同实例的资源声明,在同一主机上调整大小时。它实际上是一个布尔值,存储为整数 0(false)和 1(true)。
created_at 是创建声明的时间戳。它是一个 ISO 8601 格式的字符串。
创建另一个表来保存声明格式版本信息。table_name: TEXT version: INTEGER
此表只有一个条目,table_name 为“claims”,version 是声明表中的声明版本。如上所述,升级代码了解每个版本的模式,并了解如何在版本之间升级。
REST API 影响¶
否。
安全影响¶
否。
通知影响¶
否。
其他最终用户影响¶
否。
性能影响¶
不适用于此 BP,因为我们不会涵盖数据库解决方案。
其他部署者影响¶
将添加一个新的配置‘claim_db’来定义 sqlite 数据库存储在磁盘上的方式。它将是 state_path 配置项的相对路径。默认值为 claim.sqlite,这意味着 $state_path/claim.sqlite。
添加一个新的配置‘claim_expiry_time’。声明已创建‘claim_expiry_time’秒,并且未与实例或迁移对象关联,则为孤立声明并将被释放。默认值为 300 秒。
开发人员影响¶
否
实现¶
负责人¶
- 主要负责人
yunhong-jiang
工作项¶
声明持久化代码。
更新资源跟踪器。
依赖项¶
否
测试¶
我们应该有测试代码来检查 sqlite 是否真的正确填充。
文档影响¶
文档应该更新,以描述‘claim_db’配置,现在 sqlite 数据库位于哪里。 此外,文档应该描述如何根据“提议的更改”部分进行升级。
参考资料¶
https://wiki.openstack.org/wiki/Persistent_resource_claim