通用卷迁移

https://blueprints.launchpad.net/cinder/+spec/generic-volume-migration

目标是允许不支持 iSCSI 并使用其他方式进行数据传输的卷驱动程序也能参与卷迁移操作。目前,现有代码使用 create_export 创建并通过 iSCSI 附加卷以执行 I/O 操作。通过使其更加通用,我们可以允许其他驱动程序也参与卷迁移。

此更改对于支持 Ceph 驱动程序的卷迁移是必要的。

问题描述

在两个后端之间迁移卷时,源卷驱动程序中的 copy_volume_data 例程会被执行,以将块从一个卷移动到另一个卷。此例程假定源卷和目标卷都可以通过 iSCSI 本地附加,并调用 create_export 来将卷附加到本地 cinder-volume 实例。这在技术上对于本地卷来说不是必需的,并且也阻止了像 Ceph 这样的驱动程序参与卷迁移操作。

用例

提议的变更

通过使用类似于备份卷驱动程序方法的文件类对象抽象,我们可以允许卷驱动程序确定如何最好地本地附加其卷。对于大多数驱动程序,这将继续是 iSCSI。对于 Ceph,将返回支持文件语义的 RBD 对象。在两种情况下,copy_volume_data 例程都以与现在相同的方式对这些文件对象进行操作,而无需显式了解底层传输机制。

具体来说,我想在卷驱动程序 (cinder/volume/driver.py) 中添加一个例程

::

open_volume() close_volume()

这些例程在执行本地卷附加时(如在 copy_volume_data() 中)被调用。我认为这些例程是必要的,因为本地文件 I/O 操作可能需要与标准的 create_export/initialize_connection 方法不同的传输方式。在 Ceph 的情况下,create_export 什么也不做,initialize_connection 返回 Nova 与 Ceph 卷直接通信所需的 RBD 连接信息。我们希望驱动程序作者保留这种灵活性。

open_volume 例程将返回一个支持文件操作(如读取、写入、查找等)的卷文件对象。close_volume 例程将处理卷文件对象的拆卸和清理。

这将允许 Ceph 返回一个与卷直接通信的文件类对象。其他后端,例如 LVM,将继续创建一个 iSCSI 导出,附加它,打开结果块设备,并返回对此文件的句柄。此外,本地 LVM 卷可以跳过 iSCSI 步骤并直接打开本地块设备。此更改稍后可以进行,目前的工作是进行支持该功能的必要的最少更改。

有了这些驱动程序例程,copy_volume_data 被修改为使用这些调用,而不是直接使用 _attach_volume。对于非 Ceph 驱动程序,结果与以前完全相同。RBD 驱动程序现在可以实现这些例程以添加对卷迁移的支持。

备选方案

最明显的替代方案是更改 Ceph 驱动程序以实现导出例程并允许通过 iSCSI 进行卷附加。这将意味着使用 rbd 内核驱动程序,这并不是理想的,因为它将代码引入到 cinder-volume 节点上运行的内核中,并且在功能上比 librbd 滞后一些。我们希望尽可能避免这种情况。

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

如果一切正常,Ceph 与其他后端之间的卷迁移应该按预期工作。双向的。

性能影响

这种额外的抽象仅启用 iSCSI 附加的替代方案,不会对现有功能产生任何影响。

其他部署者影响

开发人员影响

实现

负责人

主要负责人

jbernard

工作项

  1. 引入文件对象抽象,并更改现有代码以使用 iSCSI 进行卷附加——就像现在一样。Ceph 迁移将继续失败。

  2. 实现 Ceph 特定的附加逻辑,应该允许卷迁移在其他后端之间成功。

  3. 添加测试(s)到 tempest 以验证代码路径是否正确执行并产生逐块完全相同的迁移结果。

依赖项

测试

我不认为卷迁移包含在 gate 中,但可以在 tempest 中进行测试。Ceph 卷迁移到非 Ceph 后端应该在两个方向上都成功。如果该测试通过,那么这项工作就成功了。

文档影响

我不认为这里需要任何操作。

参考资料