将 rbd 的 copy_volume_to_image 函数从主机卸载到 Ceph 集群¶
包含您的 Launchpad 蓝图的 URL
https://blueprints.launchpad.net/cinder/+spec/optimze-rbd-copy-volume-to-image
如果 Cinder 卷后端和 Glance 存储后端位于同一个 Ceph 存储集群中,则将 rbd 的 copy_volume_to_image 函数从 cinder-volume 主机卸载到 Ceph 集群。
问题描述¶
假设 Cinder 卷后端和 Glance 存储后端位于同一个 Ceph 存储集群中。假设以下描述中卷的容量和数据大小均为 1GB。假设 Cinder 卷后端使用“volumes”池,而 Glance 存储后端使用“images”池。
当前上传到镜像的流程如下:1. Cinder 使用命令“rbd export”将 rbd 镜像导出为 cinder-volume 主机上的本地文件。读取 1GB,写入 1GB。2. Cinder 调用 Glance upload/update API 将导出的本地文件上传到 Glance 存储后端。读取 1GB,写入 1GB。
因此,当我们上传 1GB 卷到镜像时,我们将读取 2GB 数据并写入 2GB 数据。如果我们将此功能从 cinder-volume 主机卸载到 Ceph 存储集群,我们可能只需要读取 1GB 数据并写入 1GB 数据,这可以减少当前流程相比一半的数据传输量。
优势
减少 rbd 的 copy_volume_to_image 函数的读/写成本,尤其是在卷的容量和数据大小很大的情况下。
在执行 copy_volume_to_image 操作时,减少 cinder-volume 主机的 IO 压力。
用例¶
提议的变更¶
通过将 rbd 的 copy_volume_to_image 函数从主机卸载到 Ceph 集群,我们需要进行以下更改。
检查 Cinder 卷后端和 Glance 存储后端是否位于同一个 Ceph 存储集群中。
如果不是,则保持当前工作流程不变。
如果是,则使用 rbd.Image.copy(dest_ioctx, dest_name) 函数将卷从一个池复制到另一个池,因为 Cinder 卷后端和 Glance 存储后端始终使用不同的 Ceph 池。
备选方案¶
方案 A:使用 rbd.Image.copy(dest_ioctx, dest_name) 函数将 rbd 的 copy_volume_to_image 函数从主机卸载到 Ceph 集群。
方案 B:使用 Ceph 的克隆镜像和展平克隆镜像功能将 rbd 的 copy_volume_to_image 函数从主机卸载到 Ceph 集群。它包含以下步骤。* 创建卷快照 snap_a 并保护快照 snap_a。* 克隆 snap_a 的子镜像 image_a。* 展平子镜像 image_a,并且 snap_a 不再依赖于它。* 取消保护快照 snap_a 并删除它。
使用基于“cirros-0.3.0-x86_64-disk”创建的卷来展示方案 A 和方案 B 之间的时间消耗。* [通用]基于镜像“cirros-0.3.0-x86_64-disk”创建一个卷。
root@devaio:/home# cinder list
+--------------------------------------+-----------+------+------+
| ID | Status | Name | Size |
+--------------------------------------+-----------+------+------+
| 3d6e5781-e3ac-4106-bfed-0aa0dd3af1f8 | available | None | 1 |
+--------------------------------------+-----------+------+------+
[方案 A-步骤 1]将 volumes/volume-3d6e5781-e3ac-4106-bfed-0aa0dd3af1f8 从“volumes”池复制到“images”池。
root@devaio:/home# time rbd cp
volumes/volume-3d6e5781-e3ac-4106-bfed-0aa0dd3af1f8 images/test
Image copy: 100% complete...done.
real 0m3.687s
user 0m1.136s
sys 0m0.557s
[方案 B-步骤 1]创建卷 3d6e5781-e3ac-4106-bfed-0aa0dd3af1f8 的快照并保护它。
root@devaio:/home# time rbd snap create --pool volumes --image
volume-3d6e5781-e3ac-4106-bfed-0aa0dd3af1f8 --snap image_test
real 0m3.152s
user 0m0.018s
sys 0m0.013s
root@devaio:/home# time rbd snap protect
volumes/volume-3d6e5781-e3ac-4106-bfed-0aa0dd3af1f8@image_test
real 0m3.043s
user 0m0.016s
sys 0m0.012s
[方案 B-步骤 2]对 volumes/volume-3d6e5781-e3ac-4106-bfed-0aa0dd3af1f8@image_test 执行克隆操作。
root@devaio:/home# time rbd clone
volumes/volume-3d6e5781-e3ac-4106-bfed-0aa0dd3af1f8@image_test
images/snapshot_clone_image_test
real 0m0.102s
user 0m0.020s
sys 0m0.016s
[方案 B-步骤 3]展平克隆镜像 images/snapshot_clone_image_test。
root@devaio:/home# time rbd flatten images/snapshot_clone_image_test
Image flatten: 100% complete...done.
real 0m10.228s
user 0m1.375s
sys 0m0.443s
[方案 B-步骤 4]取消保护快照 volumes/volume-3d6e5781-e3ac-4106-bfed-0aa0dd3af1f8@image_test。
root@devaio:/home# time rbd snap unprotect
volumes/volume-3d6e5781-e3ac-4106-bfed-0aa0dd3af1f8@image_test
real 0m0.064s
user 0m0.019s
sys 0m0.015s
[方案 B-步骤 5]删除无依赖关系的快照 volumes/volume-3d6e5781-e3ac-4106-bfed-0aa0dd3af1f8@image_test。
root@devaio:/home# time rbd snap rm
volumes/volume-3d6e5781-e3ac-4106-bfed-0aa0dd3af1f8@image_test
real 0m0.235s
user 0m0.017s
sys 0m0.013s
通过方案 A 和方案 B 的上述测试结果,方案 A 需要 (real:0m3.687s, user:0m1.136s, sys:0m0.557s) 完成卷复制操作,而方案 B 需要 (real:0m16.824s, user:0m1.465s, sys:0m0.512s) 完成该操作。因此,使用方案 A 将 rbd 的 copy_volume_to_image 函数从主机卸载到 Ceph 集群。
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
将 rbd 的 copy_volume_to_image 函数从主机卸载到 Ceph 集群可以充分利用 Ceph 内在的数据复制功能和 Ceph 存储集群的硬件容量来加速卷数据复制速度,减少数据传输量并降低 cinder-volume 主机的 IO 负载。
其他部署者影响¶
无
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
ling-yun<zengyunling@huawei.com>
工作项¶
实现“Proposed change”中提到的代码。
依赖项¶
Cinder 卷后端和 Glance 存储后端位于同一个 Ceph 存储集群中。
测试¶
需要创建单元测试和 Tempest 测试来覆盖“Proposed change”中提到的代码更改,并确保在引入将 rbd 的 copy_volume_to_image 函数从主机卸载到 Ceph 集群的功能时,Cinder 卷到镜像的功能正常工作。
文档影响¶
无
参考资料¶
无