NVMeoF 多路径

https://blueprints.launchpad.net/cinder/+spec/nvmeof-multipath

扩展 NVMeoF 连接器以支持两种类型的多路径

  • 原生 NVMeoF 多路径

  • 基于 DeviceMapper 的多路径

在撰写本文时,仅支持 TCP 和 RDMA 协议,并且规范也仅考虑了这些协议(因此不考虑其他传输协议,例如 FC 的情况)。

问题描述

目前 NVMeoF 连接器仅支持单路径连接。

问题描述可以概括为:单路径连接是单点故障。

为了提高可靠性,并赶上行业标准,需要支持多路径连接,从而缓解单点故障。

另一个潜在的好处是在保持复制的同时提高性能,例如在后端进行同步复制的情况下,多路径机制可以在发生故障时切换。

可以通过以下两种方式实现

NVMeoF ANA(异步命名空间访问)是 NVMeoF 原生实现多路径的方式,它提供了一组有趣的功能。可以在此处找到更多底层细节的规范 [1]

使用 DeviceMapper 进行多路径是行业标准方法(而 NVMeoF ANA 支持尚不具备),适用于 iSCSI 等连接,同样可以用于 NVMeoF 连接。此规范 DM 组件的实施目标是将 NVMeoF 连接器与使用 DeviceMapper 进行多路径连接保持同步。

用例

无论通过原生多路径还是 DeviceMapper,用例都是能够将多路径连接暴露给卷,从而缓解连接单点故障并提高性能。

例如,NVMeoF 卷有两个路径(门户),并建立了多路径连接。如果其中一个路径中断(例如部分网络故障),则附加的设备将保持功能正常,而使用单路径连接,该设备将对它所附加的主机不可用。

提议的变更

多路径实现将分为两个主要组件功能:原生和 DM 多路径

阶段 1(原生)

NVMeoF 连接器将检查主机的多路径能力,并在传递给卷驱动程序的连接器属性中报告它,这将允许任何驱动程序/后端特定处理。

/sys/module/nvme_core/parameters/multipath 的值可以是 YN - 这应该作为 True 或 False nvme_native_multipath 属性返回在 NVMeOFConnector 连接器类中的 get_connector_properties 方法中。

“新的” NVMeoF 连接器 API(在 Wallaby 中引入)支持为同一个 NVMeoF 设备传递多个门户。目前仅建立第一个成功的连接。

在多路径模式下,门户连接方法应简单地通过运行每个门户的 nvme connect cli 命令来连接所有门户。

在底层,NVMe 系统将为每个门户连接创建不可见设备,并在其之上暴露一个单一的多路径设备。

需要注意的是,原生多路径规范要求目标门户以相同的目标 NQN 和命名空间 ID 暴露设备,才能实现多路径。(这是后端的责任,对 OpenStack 代码应该是透明的)

最后,新设备将通过其 uuid 进行匹配,就像基线单路径连接器中已经实现的那样。

原生多路径卷的连接信息如下所示

{
    'vol_uuid': '...someuuid...',
    'target_nqn': '...somenqn...',
    'portals': [
        ('10.1.1.1', 4420, 'tcp'),
        ('10.1.1.2', 4420, 'tcp')
    ]
}

关于 enforce_multipath - 这是一个 DeviceMapper 多路径参数,它将不会与原生 NVMe 多路径进行任何交互。

阶段 2(DeviceMapper)

对于 DeviceMapper 多路径,在连接信息中使用 dm_replicas 来指定所有副本。这种方法允许为一个同步卷使用多个 NQN,这通常是基于 DM 的多路径的必需条件。

dm_replicas 不能与 volume_replicas 一起使用,后者仅用于 RAID 复制。驱动程序应该知道不要传递它。如果同时传递两者,则操作应该失败。

与基线连接器一样,连接到所有 dm_replicas(值得注意的是,每个副本可以有多个门户,从而允许此 DeviceMapper 聚合在原生多路径设备之上运行)

建立连接后,DeviceMapper 将在底层处理多路径(对 OpenStack 代码应该是透明的)

DeviceMapper 需要识别应该“合并”两个设备。它基于设备 ID 信息来执行此操作。因此,后端负责暴露具有符合 DeviceMapper 设备匹配要求的 ID 信息的设备。

由于 DeviceMapper 根据设备 ID 信息(udev?)识别应该“合并”两个设备,因此后端负责处理其暴露的设备以符合要求。

DeviceMapper 多路径卷的连接信息如下所示

{
    'vol_uuid': '...someuuid...',
    'dm_replicas': [
        {
            'vol_uuid': '...someuuid1...',
            'target_nqn': '...somenqn1...',
            'portals': [('10.1.1.1', 4420, 'tcp')]
        },
        {
            'vol_uuid': '...someuuid2...',
            'target_nqn': '...somenqn2...',
            'portals': [('10.1.1.2', 4420, 'tcp')]
        }
    ]
}

连接器 API 摘要

有了这个提议,连接器将有多种复制和/或多路径操作模式:- 单路径连接 - 原生多路径连接 - RAID 连接(单路径或多路径) - DeviceMapper 连接(单路径或原生多路径)

注意:在 DM 之上使用 RAID 是不允许的,因为它与连接信息 API 不一致(并且物理实现也需要不必要的复杂化)。根据需要,理论上有一天可以添加它,但它在多个层面上都是多余的。

Cinder 驱动程序的单路径连接信息

{
    'vol_uuid': '...someuuid...',
    'target_nqn': '...somenqn...',
    'portals': [('10.1.1.1', 4420, 'tcp')]
}

支持原生多路径连接的 cinder 驱动程序的连接信息(如果请求单个路径连接,os-brick 将迭代它们)

{
    'vol_uuid': '...someuuid...',
    'target_nqn': '...somenqn...',
    'portals': [
        ('10.1.1.1', 4420, 'tcp'),
        ('10.1.1.2', 4420, 'tcp')
    ]
}

对于 DeviceMapper,给出的示例没有为副本设备使用原生多路径。为了使这些副本设备执行原生多路径,应该在 portals 列表中指定每个设备路径的门户。

DeviceMapper 的连接信息

{
    'vol_uuid': '...someuuid...',
    'dm_replicas': [
        {
            'vol_uuid': '...someuuid1...',
            'target_nqn': '...somenqn1...',
            'portals': [('10.1.1.1', 4420, 'tcp')]
        },
        {
            'vol_uuid': '...someuuid2...',
            'target_nqn': '...somenqn2...',
            'portals': [('10.1.1.2', 4420, 'tcp')]
        }
    ]
}

备选方案

我所了解的关于 NVMeoF 多路径的两种替代方案都描述在此规范中:原生和 DeviceMapper

数据模型影响

REST API 影响

安全影响

与基线 NVMeoF 连接器相同

  • sudo 执行 nvme

  • 需要访问以读取根文件系统路径,例如
    /sys/class/nvme-fabrics/…
    /sys/class/block/…

Active/Active HA 影响

通知影响

其他最终用户影响

性能影响

主要好处是在保持复制的同时提高 I/O,例如在同步复制的主动-被动故障转移多路径配置中。

主机上的附件期间应该会发生一个性能影响,现在需要连接多个 NVMeoF 设备(而不仅仅是一个),并在其之上暴露一个新设备。

根据多路径连接模式(例如主动-主动与主动-被动),多路径设备 io 的网络资源使用量可能会增加。

其他部署者影响

开发人员影响

希望使用 NVMeoF 的驱动程序开发人员需要了解连接器 API - 特别是描述的 connection_information 规范

值得注意的是,存储后端(虽然对 OpenStack 代码是透明的)需要牢记无论使用哪种多路径模式(原生或 DeviceMapper)的系统级要求。

实现

负责人

  • Zohar Mamedov (zoharm)

  • 其他人

工作项

阶段 1(原生)

  • 连接器属性检查内核是否支持原生多路径

  • 建立所有(多个)必要的连接到多路径卷,并确保正确暴露设备。

阶段 2(DeviceMapper)

  • 确保连接所有同步复制的设备。

  • 确保暴露正确的 DeviceMapper 设备。

依赖项

基线依赖项与基线单路径连接器相同:相关的 nvmeof 内核模块和 nvme-cli

对于原生 NVMe 多路径,内核需要支持它

对于 DeviceMapper 多路径,DeviceMapper 需要正常运行

测试

单元测试。此外,还有一个即将推出的 gate 作业,它将使用 LVM 来测试 NVMeoF(可以在其中包含针对它的多路径测试)

文档影响

记录此规范中描述的新 connection_information API - 特别是对于驱动程序能够遵循和使用它而言。

参考资料