存储:基于 RBD 的磁盘的写时复制克隆

https://blueprints.launchpad.net/nova/+spec/rbd-clone-image-handler

目前,基于 RBD 的临时磁盘是通过从 Glance 下载镜像到本地文件,然后将该文件上传到 RBD 创建的。即使文件被缓存,上传也可能需要很长时间,因为 ‘rbd import’ 是同步且慢的。如果镜像已经以 RAW 格式存储在 RBD 中,则无需任何本地副本 - 可以将其克隆到新的镜像以用于新的磁盘,而无需复制任何数据。

问题描述

此更改的主要用例是从 Glance 镜像启动实例,其中 Ceph RBD 后端同时为 Glance 和 Nova 启用,并且 Glance 镜像以 RAW 格式存储在 RBD 中。

以下问题将被解决

  • 计算节点上的磁盘空间被浪费,因为缓存了每个运行该镜像实例的计算节点上的额外镜像副本。

  • Ceph 中的磁盘空间被浪费,因为上传了完整的镜像副本,而不是创建写时复制克隆。

  • 网络容量被浪费,因为第一次从该镜像启动实例时将镜像从 RBD 下载到计算节点,以及每次从同一镜像启动新实例时将镜像上传到 RBD。

  • 启动实例所需的时间增加,降低了云环境的弹性,并增加了 Nova 必须维护的待处理操作的数量。

提议的变更

将 RBD 特定的实用程序代码提取到新文件中,使其结构和提供的功能与 Cinder 中的类似代码保持一致。这包括应从 rbd CLI 转换为使用 RBD 库的卷清理代码。

添加实用程序函数以支持克隆,包括检查镜像是否存在以及是否可以克隆。

将 direct_fetch() 方法添加到 nova.virt.libvirt.imagebackend,使其实现尝试在可能的情况下克隆镜像。使用以下标准来确定是否可以克隆镜像

  • 镜像位置使用 rbd:// 模式,并包含对 RBD 快照的有效引用;

  • 镜像位置引用与 Nova 配置相同的 Ceph 集群;

  • 镜像磁盘格式为 ‘raw’;

  • Nova 可以访问镜像位置引用的 RBD 快照。

扩展 nova.virt.images 中的 fetch_to_raw(),以便在传递新的可选后端参数时尝试 direct_fetch()。让 libvirt 驱动程序传递后端参数。

不要直接从 verify_base_size() 调用 disk.get_disk_size(),因为这假定磁盘存储在本地,而是添加一个由 Rbd 子类覆盖的新方法来获取磁盘大小。

备选方案

在 Icehouse 中尝试了一种基于 image-multiple-location 蓝图 (https://blueprints.launchpad.net/glance/+spec/multiple-image-locations) 的替代实现。最终它被回滚,这可以归因于多种原因

此设计具有显著较小的足迹,并且主要隔离在 libvirt 驱动程序中的 RBD 镜像后端。

数据模型影响

无。

REST API 影响

无。

安全影响

无。

通知影响

无。

其他最终用户影响

当为 Glance 和 Nova 启用 Ceph RBD 后端时,从 Glance 镜像启动实例时,RAW 和非 RAW 格式的镜像在时间和资源消耗方面将存在明显的差异。

性能影响

在上述 问题描述 部分中定义的首要用例中,将有显著的性能改进。

在其他用例中,libvirt 驱动程序将在启用 RBD 后端时向 Glance 检索镜像位置列表时引入一个额外的 API 调用。与从 Glance 获取完整镜像所需的时间和资源相比,该调用的性能影响微不足道。

其他部署者影响

无。

开发人员影响

无。

实现

负责人

主要负责人

jdurgin

其他贡献者

angdraug

工作项

当前实现(参见 参考)包括以下更改

  • 将 libvirt RBD 实用程序移动到新文件

  • 使用库而不是 CLI 来清理 RBD 卷

  • 为基于 rbd 的临时磁盘启用克隆

依赖项

无。

测试

这是一个非功能性更改,对需要覆盖的测试用例没有影响。

目前正在进行工作,以使所有 tempest 在 OpenStack CI 环境中使用 Ceph 的环境中运行。第一步是 devstack 的 ceph 支持,你可以在这里看到

还有一个测试 devstack 补丁,强制启用 ceph,导致所有 devstack 作业都使用 ceph 启用运行。你可以在这里找到它

有些测试失败了(前几次运行的 14 和 15)。但是,这也意味着覆盖此代码的大多数测试(任何生成实例的测试)都通过了。因此,我们至少有一种方法可以在需要时针对 master 运行这些测试。一旦 devstack 补丁合并,我们将启用一个可以针对所有项目中的补丁运行的作业(也许从实验性开始)。

Fuel CI 还包括用于使用 Ceph 的 OpenStack 部署的测试套件:https://github.com/stackforge/fuel-main/blob/master/fuelweb_test/tests/test_ceph.py

文档影响

无。

参考资料

邮件列表讨论:http://lists.openstack.org/pipermail/openstack-dev/2014-March/029127.html http://lists.ceph.com/pipermail/ceph-users-ceph.com/2014-March/008659.html

当前实现:https://github.com/angdraug/nova/tree/rbd-ephemeral-clone https://review.openstack.org/#/q/status:open+topic:bp/rbd-clone-image-handler,n,z