Ceph驱动程序中支持卷迁移

https://blueprints.launchpad.net/cinder/+spec/ceph-volume-migrate

目前Cinder支持具有后端协助的卷迁移。一些后端,如IPSAN,支持在后端级别迁移卷,但Ceph不支持。虽然Ceph卷迁移已经在Liberty中通过Cinder通用迁移流程得到支持,但迁移效率并不高。支持Ceph驱动程序中的卷迁移对于提高迁移效率是必要的。

问题描述

假设有两个Cinder卷后端,它们位于同一个Ceph存储集群中。

现在,两个Ceph卷后端之间的卷迁移是通过通用的迁移逻辑实现的。迁移操作可以通过从os-brick连接器返回的句柄上的文件操作来执行,但迁移效率受到文件I/O速度的限制。如果我们将迁移操作从cinder-volume主机卸载到Ceph存储集群,我们将获得以下好处

  • 提高两个Ceph存储池之间的卷迁移效率,尤其是在卷的容量和数据大小很大的情况下。

  • 在进行卷迁移时,减少cinder-volume主机上的IO压力。

用例

卷迁移有三种情况。本规范的范围仅限于可用卷,并旨在解决以下迁移情况1中的问题

在本规范的范围内

1. 同一个Ceph集群中两个池之间的可用卷迁移。

超出本规范的范围

2. Ceph与其他厂商驱动程序之间的可用卷迁移。

3. 使用Cinder通用迁移的正在使用(已挂载)的卷迁移。

提议的变更

解决方案A:使用rbd.Image.copy(dest_ioctx, dest_name)函数将卷从一个池迁移到另一个池。

为了将迁移操作从cinder-volume主机卸载到ceph集群,我们需要在RBD驱动程序中的migrate_volume例程中进行以下更改:

  • 检查源卷后端和目标卷后端是否位于同一个ceph存储集群中。

  • 如果不是,则返回(False, None)。

  • 如果是,则使用rbd.Image.copy(dest_ioctx, dest_name)函数将卷从一个池复制到另一个池。

  • 删除旧卷。

备选方案

解决方案B:使用ceph的克隆镜像和平坦化克隆镜像函数将卷从一个池迁移到另一个池。

解决方案B包含以下步骤:* 创建源卷快照snap_a并保护快照snap_a。* 将snap_a的子镜像image_a克隆到目标池。* 平坦化子镜像image_a,从而snap_a不再依赖于它。* 取消保护快照snap_a并删除它。

使用容量和数据大小为12GB的卷来显示解决方案A和解决方案B之间的时间消耗比较。

通过上述解决方案A和解决方案B的测试结果,解决方案A需要(real:2m3.513s,user:0m9.983s,sys:0m25.213s)来完成卷复制操作,而解决方案B需要(real:1m59.966s,user:0m4.790s,sys:0m17.239s)来完成。这两个解决方案的时间消耗差别不大,但解决方案A比解决方案B更简单。因此,我们打算使用解决方案A将卷迁移从cinder-volume主机卸载到ceph集群。

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

在同一个Ceph集群中,两个Ceph存储池之间的卷迁移性能将得到极大的提高。

其他部署者影响

开发人员影响

实现

负责人

主要负责人

chen-xueying1<chen.xueying1@zte.com.cn>

其他贡献者

ji-xuepeng<ji.xuepeng@zte.com.cn>

工作项

  • 添加后端位置信息

    在Ceph卷服务的状态中添加location_info,它应包括Ceph集群名称(或ID)和存储池名称。

  • 实现卷迁移

    1. 检查是否满足卷迁移的要求。如果源后端和目标后端位于同一个Ceph集群中并且卷状态不是“in-use”状态,则可以迁移该卷。

    2. 将卷从一个池复制到另一个池,并保留其原始镜像名称。

    3. 删除旧卷。

依赖项

测试

将添加单元测试。将添加卷迁移测试用例。

需要创建单元测试和Tempest测试,以涵盖“Proposed change”中提到的代码更改,并确保在引入RBD卷迁移功能时,卷迁移功能能够正常工作。

文档影响

参考资料