支持不同 iSCSI 目标端的 iSCSI 实时迁移

包含您的 Launchpad 蓝图的 URL

https://blueprints.launchpad.net/nova/+spec/iscsi-live-migration-different-target

目前,Nova 预设了 iSCSI 目标端在实时迁移前后不会发生变化的情况。因此,如果目标节点具有不同的 iSCSI 目标端,当前的 Nova 规范会导致实时迁移失败。然而,如果每个计算节点使用相同的 iSCSI 目标端,每个计算节点都会识别 iSCSI 目标端中的所有卷,这从安全角度来看是不理想的情况。

因此,本规范建议支持在需要登录到不同的 iSCSI 目标端才能访问卷的计算节点之间,具有 Cinder 卷的实例的实时迁移。

作为参考,如果 iSCSI 存储具有管理单个 iSCSI 目标端内每个发起者的 LUN 可见性的功能,则为每个计算节点使用相同的 iSCSI 目标端不是问题。但通用的 iSCSI 存储通常不具备此类功能,因此它们需要此功能来支持实时迁移。

问题描述

通常,如果多个计算节点使用相同的 iSCSI 目标端导出卷,则每个计算节点都会识别目标端中的所有卷,即使某些卷未附加到计算节点的实例。这可能会导致 SCSI 设备扫描速度变慢,如果计算节点识别了数千个 SCSI 设备,并且从安全角度来看这也是不理想的情况。

另一方面,

  • Cinder LVM 驱动程序通过为每个卷创建唯一的 iSCSI 目标端来避免此问题。

  • 一些企业级 iSCSI 存储具有管理单个 iSCSI 目标端内每个发起者的 LUN 可见性的功能。

但是,通常存储具有 iSCSI 目标端数量的限制,通常少于最大 LU 数量。此外,也存在存储不具备 iSCSI 目标端的多发起者可见性管理功能的情况。

在这种情况下,通过为每个计算节点创建单独的 iSCSI 目标端,并在卷附加到节点上的实例时通过将 LUN 连接到相应的 iSCSI 目标端来管理可见性,我们可以避免此问题并利用存储容量。

然而,Nova 当前预设了 iSCSI 目标端在实时迁移前后不会发生变化的情况。因此,在实时迁移期间,源节点会将从 iSCSI 目标端端口地址、IQN 等创建的主机设备路径传递给目标节点。如果目标节点具有不同的 iSCSI 目标端,这将导致实时迁移失败。

为了解决当前问题,本规范建议支持针对不同 iSCSI 目标端的实时迁移。

用例

使用此建议,每个计算节点可以使用单独的 iSCSI 目标端。因此,每个计算节点仅识别与计算节点相关的卷。这可以减少不必要的 SCSI 设备扫描负载、udev 高工作负载并降低安全风险。

项目优先级

无。

提议的变更

以下更改预设了在实时迁移期间 Cinder 的 initialize_connection() 中每个发起者返回不同的 iSCSI 目标端 IQN 的结果。

在 libvirt 驱动程序中,

  1. 在 pre_live_migration() 期间将目标主机上的块设备设备路径存储到 pre_live_migration_data 中 …..[EX1]

  2. 检查域定义 XML 中每个磁盘的“serial”字段。然后,如果原始“serial”和目标“serial”值相同,则使用来自目标主机的设备路径替换 XML 中的“source dev” …..[EX2]

    QEMU 内置 iSCSI 发起者 (libiscsi) 将在 Kilo 阶段得到支持。此建议需要同时考虑 iscsi-initiator 和 libiscsi 的情况。

    如果发起者是 libiscsi,则使用来自目标主机的 res_data 替换 XML 中的“name”、“host name”和“port”字段 …..[EX3]

  3. 将新的 XML 数据传递给 libvirt migrateToURI2 API。

[EX1]

res_data
 {'device_path': {u'58a84f6d-3f0c-4e19-a0af-eb657b790657':
   u'/dev/disk/by-path/ip-192.168.0.10:3260-iscsi-iqn.abc.org.67890.
   opst-lun-Z'},
  'graphics_listen_addrs': {'vnc': '127.0.0.1', 'spice': '127.0.0.1'}}

[EX2]

对于 iscsi-initiator

[Before]
<disk type='block' device='disk'>
   <driver name='qemu' type='raw' cache='none'/>
   <source dev='/dev/disk/by-path/
               ip-192.168.0.10:3260-iscsi-iqn.abc.org.12345.opst-lun-X'/>
   <target dev='vdb' bus='virtio'/>
     <serial>58a84f6d-3f0c-4e19-a0af-eb657b790657</serial>
     <address type='pci' domain='0x0' bus='0x0' slot='0x04' function='0x0'/>
</disk>


[After]
<disk type='block' device='disk'>
   <driver name='qemu' type='raw' cache='none'/>
   <source dev='/dev/disk/by-path/
               ip-192.168.0.10:3260-iscsi-iqn.abc.org.67890.opst-lun-Z'/>
   <target dev='vdb' bus='virtio'/>
     <serial>58a84f6d-3f0c-4e19-a0af-eb657b790657</serial>
     <address type='pci' domain='0x0' bus='0x0' slot='0x04' function='0x0'/>
 </disk>

[EX3]

对于 libiscsi

[Before]
<disk type='network' device='disk'>
   <driver name='qemu' type='raw'/>
   <source protocol='iscsi' name='iqn.abc.org.12345.opst/X'>
     <host name='192.168.0.10' port='3260'/>
   </source>
   <serial>58a84f6d-3f0c-4e19-a0af-eb657b790657</serial>
   <target dev='vdb' bus='virtio'/>
</disk>


[After]
<disk type='network' device='disk'>
   <driver name='qemu' type='raw'/>
   <source protocol='iscsi' name='iqn.abc.org.67890.opst/Z'>
     <host name='192.168.0.10' port='3260'/>
   </source>
   <serial>58a84f6d-3f0c-4e19-a0af-eb657b790657</serial>
   <target dev='vdb' bus='virtio'/>
</disk>

备选方案

无。

数据模型影响

无。

REST API 影响

无。

安全影响

无。

通知影响

无。

其他最终用户影响

无。

性能影响

无。

其他部署者影响

无。

开发人员影响

无。

实现

负责人

主要负责人

mtanino

工作项

这两个补丁将被发布。

  1. 支持 iscsi-initiator

  2. 支持 QEMU 内置 iSCSI 发起者 (libiscsi)

依赖项

无。

测试

  • 应该添加单元测试。

文档影响

无。

参考资料

无。