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]将volumes1/volume-777617f2-e286-44b8-baff-d1e8b792cc52从“volumes1”池复制到“volumes2”池。
root@2C5_19_CG1# time rbd cp volumes1/volume-777617f2-e286-44b8-baff-d1e8b792cc52 volumes2/test1
镜像复制:100% 完成…完成。
real 2m3.513s user 0m9.983s sys 0m25.213s
[解决方案B-步骤1]创建卷777617f2-e286-44b8-baff-d1e8b792cc52的快照并保护它。
root@2C5_19_CG1# time rbd snap create –pool volumes1 –image volume-777617f2-e286-44b8-baff-d1e8b792cc52 –snap snap_test
real 0m0.465s user 0m0.050s sys 0m0.016s
root@2C5_19_CG1# time rbd snap protect volumes1/volume-777617f2-e286-44b8-baff-d1e8b792cc52@snap_test
real 0m0.128s user 0m0.057s sys 0m0.006s
[解决方案B-步骤2]对volumes1/volume-777617f2-e286-44b8-baff-d1e8b792cc52@snap_test执行克隆操作。
root@2C5_19_CG1# time rbd clone volumes1/volume-777617f2-e286-44b8-baff-d1e8b792cc52@snap_test volumes2/snap_test_clone
real 0m0.336s user 0m0.058s sys 0m0.012s
[解决方案B-步骤3]平坦化克隆镜像volumes2/snap_test_clone。
root@2C5_19_CG1# time rbd flatten volumes2/snap_test_clone 镜像平坦化:100% 完成…完成。
real 1m58.469s user 0m4.513s sys 0m17.181s
[解决方案B-步骤4]取消保护快照volumes1/volume-777617f2-e286-44b8-baff-d1e8b792cc52@snap_test并删除它。
root@2C5_19_CG1# time rbd snap unprotect volumes1/volume-777617f2-e286-44b8-baff-d1e8b792cc52@snap_test
real 0m0.150s user 0m0.058s sys 0m0.013s
root@2C5_19_CG1# time rbd snap rm volumes1/volume-777617f2-e286-44b8-baff-d1e8b792cc52@snap_test
real 0m0.418s user 0m0.054s sys 0m0.011s
通过上述解决方案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卷迁移功能时,卷迁移功能能够正常工作。
文档影响¶
无
参考资料¶
无