用于卷迁移的高效卷复制

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)

为了正确处理稀疏选项,需要进行以下更改。

  1. 将 cinder_sparse_copy_volume 功能添加到功能列表中,作为明确定义的选项。

'cinder_sparse_copy_volume': {
   'default': 'False',
   options: {}
},
  1. 在开始卷复制之前,使用 get_capabilities 方法从“目标 cinder 卷驱动程序”获取功能列表。

get_capabilities 方法如以下 Spec 所示。

这些是与稀疏复制相关的 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 卷请求功能。我们应该使用相同的方式来处理稀疏复制。

依赖项

测试

  • 单元测试

文档影响

参考资料