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 的值可以是 Y 或 N - 这应该作为 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 - 特别是对于驱动程序能够遵循和使用它而言。