用于卷迁移的高效卷复制¶
https://blueprints.launchpad.net/cinder/+spec/efficient-volume-copy-for-cinder-assisted-migration
目前,Cinder 支持以下 3 种卷迁移方式。
#
迁移方法
数据复制方法
迁移处理程序
1
存储驱动
依赖于供应商存储
存储阵列内部
2
copy_volume_data()
dd 命令
cinder volume node
3
swap_volume()
libvirt block rebase copy
nova compute node
在卷迁移案例 #2 中,Cinder 使用 dd 命令进行卷数据的复制,但复制始终复制完整块,即使源数据包含许多空块和零块。dd 命令有一个 conv=sparse 选项,可以跳过空块或零块,从而更有效地复制数据。
此请求的目的是引入一种机制,以便正确处理 dd 命令用于卷迁移时的稀疏复制选项。
问题描述¶
如果我们从薄配置池创建卷,则卷块不会预先分配,并且卷块将按需分配。在这种情况下,如果使用 dd 命令迁移分离的卷,dd 将从源卷复制完整块到目标卷,即使源卷包含许多空块或零块。结果,目标卷的使用率始终为 100%。以下是使用薄 LVM 驱动程序的卷迁移示例。
迁移前
LV VG Attr LSize Pool Origin Data%
vg1-pool vg1 twi-a-tz-- 3.80g 10.28
volume-1234 vg1 Vwi-a-tz-- 1.00g vg1-pool 19.53
迁移后,未使用 conv=sparse 选项
LV VG Attr LSize Pool Origin Data%
vg2-pool vg2 twi-a-tz-- 3.80g 31.45
volume-1234 vg2 Vwi-a-tz-- 1.00g vg2-pool 100.00
用例¶
使用稀疏复制可以减少目标存储阵列的卷使用量,与使用完整块复制相比。
提议的变更¶
如果事先确保目标 c-vol 的预初始化(清零),我们可以使用 conv=sparse 选项跳过将空块和零块复制到目标卷。
但是,如果目标卷未事先清零,我们应该禁用稀疏复制并从源卷复制完整块到目标卷,以避免数据损坏问题。
例如,以下情况,我们应该禁用稀疏复制并复制完整块,因为新的厚 LVM 卷可能未初始化,我们不应在类似情况下使用 conv=sparse 选项。
源 c-vol 驱动:Thin LVM
目标 c-vol 驱动:提供未初始化新卷的驱动程序。(例如,Thick LVM)
为了正确处理稀疏选项,需要进行以下更改。
将 cinder_sparse_copy_volume 功能添加到功能列表中,作为明确定义的选项。
'cinder_sparse_copy_volume': {
'default': 'False',
options: {}
},
在开始卷复制之前,使用
get_capabilities方法从“目标 cinder 卷驱动程序”获取功能列表。
get_capabilities 方法如以下 Spec 所示。
更新获取卷驱动程序功能 Spec:https://review.openstack.org/#/c/183947/1
这些是与稀疏复制相关的 migrate_volume 的步骤。
source c-vol driver dest c-vol driver
| |
| ========================================> |
| Ask capability of sparse copy via |
| get_capabilities |
| <======================================== |
| Dest c-vol returns capabilities to |
| source c-vol |
| ========================================> |
| Start volume copy with or without sparse |
| based on the retun from dest c-vol |
| |
备选方案¶
从源卷复制完整块到目标卷。然后,尝试 fstrim 或 blkdiscard 以将未使用的块释放到后端存储。但是,如果后端存储不支持 UNMAP SCSI 命令,我们无法在迁移后释放未使用的块。
数据模型影响¶
无
REST API 影响¶
将 cinder_sparse_copy_volume 参数添加为明确定义的功能。
'cinder_sparse_copy_volume': {
'default': 'False',
options: {}
},
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
此功能改进了在源卷和目标卷之间复制数据所需的时间。
其他部署者影响¶
无
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
mitsuhiro-tanino
工作项¶
将 cinder_sparse_copy_volume 功能添加到功能列表中。
在 migrate_volume 方法中添加 get_capabilities 处理程序。
使用 cinder_sparse_copy_volume 功能更新 LVM 参考实现。
使用 cinder_sparse_copy_volume 功能更新 NFS 驱动程序
NFS 驱动程序已经具有 _sparse_copy_volume_data 选项,但这种方式不会在卷复制之前向目标 cinder 卷请求功能。我们应该使用相同的方式来处理稀疏复制。
依赖项¶
无
测试¶
单元测试
文档影响¶
需要更新 openstack 云管理员指南。 https://docs.openstack.org/admin-guide/blockstorage_volume_migration.html
参考资料¶
相关的 Cinder Spec
更新获取卷驱动程序功能 Spec:https://review.openstack.org/#/c/183947/1
相关的修复