Cinder 对象

https://blueprints.launchpad.net/cinder/+spec/cinder-objects

本规范的目标是在 cinder 中引入对象。对象用于将数据与其可以操作的方法捆绑在一起。通过实施本规范,我们将能够通过 RPC 传递丰富的对象,并解耦数据库模式实现与 SQLAlchemy,从而支持 NoSQL 数据库。数据库模式独立性是该提案的最大收益。

问题描述

当前 cinder 中存在一些问题

  • 数据库实现直接绑定到 SQLAlchemy。这限制了对 NoSQL 数据库的支持。这是本提案背后的主要原因。

  • Cinder 通过 RPC 发送 ID(例如卷 ID、快照 ID、一致性组 ID 或备份 ID)。这些 ID 用于查询 SQLAlchemy 对象,导致数据库命中。

  • Cinder 中有多个地方会进行数据库调用,这可能导致竞争条件。

用例

提议的变更

有一个已批准的提案将 nova.objects 放入 oslo 作为 oslo.versionedobjects (https://review.openstack.org/#/c/127532/),这将抽象化可用于 RPC 的可版本化的内部对象。计划是采用 oslo.versionedobjects 并抽象化卷、快照、备份、一致性组和配额。

由于 versionedobjects 进入 oslo 库还需要一些时间,因此计划与 dansmith 同步,以获取 cinder 的早期版本,并在准备就绪时过渡到 oslo.versionedobjects。

拟议的更改是

  • 对象将与数据库模式独立。数据库连接的类型可以从 cinder.conf 中的“connection”值确定,该值可以是 mysql、mongodb、db2 等。根据连接的类型,在调用 objects.register_all() 时将导入适当的对象(例如 cinder.objects.volume 或 cinder.objects.nosql.volume)。

  • 对象将通过 RPC 发送,而不是 ID,从而减少查询 SQLAlchemy 对象的额外数据库命中。

  • 对象将进行版本控制,允许检测较旧的对象,并在对象不兼容时采取适当的操作,即优雅地失败或模拟较旧的行为。

  • 为了处理对象在飞行过程中底层卷、快照、备份、一致性组或配额可能已更改的情况,将在对象保存方法中包含额外的参数(例如 expected_volume_state 和 expected_task_state),这些参数将在更新之前检查数据库中的卷、快照、备份、一致性组或配额,并优雅地失败或适当地同步数据。

这项工作将分阶段逐步完成,如下所示。

  • 获取要在 cinder 中使用的 oslo.versionedobjects 的早期版本。

  • 将卷快照抽象化为 versionedobject。

  • 将卷备份抽象化为 versionedobject。

  • 迭代地将 cinder 内部转换为使用卷快照对象。

目标是在 kilo-2 结束时拥有 oslo.versionedobjects 代码库,并同时抽象化 cinder 内部的一些内容,例如卷快照和备份。

备选方案

Cinder 可以继续紧密绑定到 SQLAlchemy,从而限制对仅 SQL 数据库的支持。此外,可以将现有的通过 RPC 发送 ID 的实现保持不变。

有状态机/状态强制和 RPC 版本控制的提案,这将有助于滚动升级并提高 cinder 的稳定性。但是,当使用卷、快照、备份或一致性组 ID 查询 SQLAlchemy 对象时,仍然会产生额外的数据库命中。

数据模型影响

无。Cinder 对象在 cinder 中提供了一个抽象层,允许数据库模式独立。这些对象是 cinder 内部用于表示服务、卷、卷类型、快照、配额、备份、一致性组和一致性组快照的 SQLAlchemy 对象的替代品。

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

未知。由于 SQLAlchemy 对象被抽象化为 cinder 对象,因此性能可能会略有下降。

其他部署者影响

开发人员影响

如今,直接数据库调用用于创建、读取、更新和删除卷、卷类型、快照、配额、备份、一致性组和一致性组快照等。随着向对象模型的切换,这些调用将针对适当的对象方法进行。将 cinder 内部转换为对象模型需要一些时间,因此在所有对象模型到位之前,应接受直接数据库调用的现有约定。

实现

负责人

主要负责人

thang-pham

其他贡献者

欢迎任何帮助

工作项

  • 获取要在 cinder 中使用的 oslo.versionedobjects 的早期版本。

  • 将卷快照抽象化为 versionedobject。

  • 将卷备份抽象化为 versionedobject。

  • 迭代地将 cinder 内部转换为使用卷快照对象。

依赖项

测试

通过引入对象,我们不会更改面向最终用户的 cinder API 或功能。我们通过 RPC 传递对象而不是 ID。鉴于此,将不会创建新的 tempest 测试。但是,将创建相关的单元测试来测试新的对象代码库。

文档影响

参考资料