RBD 实例快照

https://blueprints.launchpad.net/nova/+spec/rbd-instance-snapshots

在使用 RBD 作为 glance 和 nova 的存储时,实例快照速度慢且效率低,导致用户体验不佳。使用本地磁盘进行上传会增加运营商支持实例快照的成本。

作为背景阅读,以下链接提供了有关 Ceph 中可用的快照功能的概述。

https://docs.ceph.net.cn/docs/master/rbd/rbd-snapshot/

问题描述

RBD 经常用于支持 glance 镜像和 nova 磁盘。当使用 rbd 作为 nova 的磁盘时,nova “快照”速度慢,因为它们通过将数据从 rbd 下载到本地文件、将其上传到 glance 并将其放回 rbd 来创建完整副本。由于通常使用原始镜像与 rbd 配合使用以启用写时复制克隆,因此此过程会删除上传到 glance 的数据中的稀疏性。这对用户体验来说是一个问题,因为这个缓慢、低效的过程需要比必要的更长的时间才能让用户自定义镜像。

对于运营商而言,这也是一个效率和成本问题。对于基于 rbd 的 nova 部署,这是最后一个使用大量本地磁盘空间的部分。

用例

这允许最终用户快速迭代镜像,例如自定义或更新它们,并更快地开始使用快照。

对于运营商而言,这消除了计算节点上大型本地磁盘的任何需求,因为 rbd 中的实例数据保留在 rbd 中。它还防止了大量空间的浪费。

项目优先级

提议的变更

与其将所有数据复制到本地磁盘,不如通过在 Nova 中获取 RBD 快照并将其克隆到 Glance 中将其保留在 RBD 中。与其上传数据,不如告诉 Glance 它在 RBD 中的位置。这样数据就保留在 Ceph 集群中,并且最终用户可以更快地使用快照。

总的来说,工作流程如下

  1. 通过 Nova 在 Ceph 存储池中创建临时磁盘的 RBD 快照,该存储池是 Nova 配置为使用的存储池。

  2. 将 RBD 快照克隆到 Glance 的 RBD 存储池。[7]

  3. 为了避免管理快照和克隆之间的依赖关系,在 Glance 的 RBD 存储池中深度展平 RBD 克隆,并将其与 Ceph 中的 Nova RBD 快照分离。[7]

  1. 删除 Ceph 中创建的 RBD 快照,因为它不再需要。(1)

  2. 使用创建并在(2)和(3)中展平的 RBD 克隆的位置更新 Glance。

这与当两者都在 rbd 上时,镜像克隆到 nova 实例磁盘的方式相反 [0]。

如果这些步骤中的任何一个失败,请清理任何部分状态并回退到当前的全复制方法。RBD 快照方法失败的速度很快,通常是瞬时的。云管理员可以监视这些失败并解决导致 RBD 快照失败的底层 CEPH 问题。

失败将在 nova 计算日志中以堆栈跟踪的形式报告。

有几个原因可以回退到完全复制而不是在高效快照失败时退出

  • 它使升级变得优雅,因为 nova 快照在 glance 具有高效快照权限之前仍然有效(有关 glance 权限详细信息,请参阅安全影响)。

  • 当由于架构选择(例如不使用 rbd 作为 glance 后端,或为 glance 和 nova 使用不同的 ceph 集群)而无法使用高效快照时,nova 快照仍然有效。

  • 这与 nova 和 cinder 中的现有 rbd 行为一致。如果从 glance 镜像克隆失败,这两个项目在创建卷或实例磁盘时都会回退到完全复制。

备选方案

克隆展平步骤可以作为绿色线程中的后台任务处理,或者完全异步地作为定期任务处理。这将提高用户界面性能,因为快照将立即可用,但它也会引入类似于竞争条件的删除依赖镜像的问题。

可以完全省略展平步骤,并让 glance 负责跟踪各种镜像依赖关系。在 rbd 级别,每个磁盘的实例快照将包含以下三项。这对于任何实例都是如此,无论它是从快照本身创建的,还是只是从常规镜像创建的。在 rbd 中,将会有

  1. 实例磁盘的快照

  2. 实例磁盘的克隆

  3. 克隆的快照

(3)通过 glance 的后端位置公开。(2)是 glance 的内部细节。(1)是 nova 和 glance 处理的内部细节。

在 rbd 级别,带有快照的磁盘无法删除。如果用户删除带有快照的实例,请通过让 glance 负责最终删除它们(在删除其依赖快照后)来隐藏此信息。Nova 通过在 rbd 中重命名它删除的实例磁盘来做到这一点,以便 glance 知道它们可以被删除。

当删除 glance 快照时,它会删除(3),然后是(2),然后是(1)。如果 nova 已经重命名了其父磁盘在 rbd 中的预设后缀,则该实例已经销毁,因此 glance 会尝试删除原始实例磁盘。当删除最后一个快照时,原始实例磁盘将被成功删除。

如果在销毁实例之前创建 glance 快照并删除它们,nova 将像往常一样删除实例磁盘。

Nova 用于让 glance 知道它需要清理原始磁盘的机制可能不同。它可以使用具有某些限制的镜像属性,这些限制在当前的 glance api 中是不可能的

  • 它必须只能写入一次

  • 为了避免暴露后端细节,它需要对最终用户隐藏

将此状态存储在 ceph 中比存储在可能不同步的外部数据库中更容易保持一致。它也会在 glance_store api 中造成奇怪的抽象泄漏,而上层不需要了解它。

数据模型影响

REST API 影响

安全影响

Glance 需要配置为启用 direct_url 支持,以便 Nova 确定要从哪里克隆镜像,具体取决于系统配置,这可能会泄漏后端凭据 [5]。Devstack 已经更新为在请求 Ceph 支持时切换行为 [6]。

文档通常建议为 glance 和 nova 使用不同的 ceph 存储池,并为每个存储池提供不同的访问权限。由于 nova 需要能够在 glance 使用的存储池中创建快照,因此它也需要对该存储池具有写入访问权限。

通知影响

性能影响

基于 RBD 的实例的快照速度将大大提高。

其他最终用户影响

基于 RBD 的实例的快照速度将大大提高。

其他部署者影响

要在具有 authx 的现有安装中使用此功能,需要将“allow rwx pool=images”添加到 nova 的 ceph 用户功能中。可以使用“ceph auth caps”命令来执行此操作 [1]。如果未更新这些权限,nova 将继续使用现有的完全复制机制进行实例快照,因为快速快照将失败,nova 计算将回退到完全复制方法。

开发人员影响

实现

负责人

主要负责人

nic

其他贡献者

jdurgin pbrady nagyz cfb-n/cburgess

工作项

实现:[4]

libvirt imagebackend 目前由于某种原因无法将 AMI 镜像识别为原始镜像(因此可克隆),因此此提议的更改对非常流行的镜像格式的效用有限。应在单独的更改中解决此问题。

依赖项

您需要 Havana 或更高版本的 glance,因为 direct URL 是在 Havana 中添加的。

测试

网关中的带有 ceph 的现有 tempest 测试会泛泛地覆盖实例快照。由于高效快照会自动启用,因此无需更改 tempest 测试。此外,nova 中的单元测试将验证错误处理(如果该过程失败则回退到完全复制),并确保在正确配置的情况下使用 rbd 快照和克隆而不是完全复制。

文档影响

请参阅上面的安全性和其他部署者影响部分。

参考资料

[0] https://specs.openstack.org/openstack/nova-specs/specs/juno/implemented/rbd-clone-image-handler.html

[1] Ceph 身份验证文档:https://ceph.net.cn/docs/master/rados/operations/user-management/#modify-user-capabilities

[2] 替代方案:Glance 清理补丁:https://review.openstack.org/127397

[3] 替代方案:Nova 补丁:https://review.openstack.org/125963

[4] Nova 补丁:https://review.openstack.org/205282

[5] https://bugs.launchpad.net/glance/+bug/880910

[6] https://review.openstack.org/206039

[7] https://docs.ceph.net.cn/docs/master/dev/rbd-layering/