存储:基于 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) 的替代实现。最终它被回滚,这可以归因于多种原因
在 https://review.openstack.org/33409 中的实现花费了很长时间才能稳定下来,并且在 Icehouse 功能冻结前的几个小时才着陆。
https://review.openstack.org/33409 的影响比构建在其之上的临时 RBD 克隆更改要大得多。
该影响包括将依赖于 Glance API v2 的 nova.image.glance._get_locations() 方法暴露给假定 Glance API v1 的代码路径,这导致了 LP bug #1291014 (https://bugs.launchpad.net/nova/+bug/1291014)。
此设计具有显著较小的足迹,并且主要隔离在 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