背景介绍
SPDK NVMe bdev模块支持两种模式:故障切换和多路径。故障切换模式只维护一个活动连接,只在切换期间连接备用路径。这可能会导致I/O延迟和上层调用报告I/O失败,但在任何给定时间都只维护一个活动连接的数量。在多路径模式下,每条路径都会维护主动连接,并根据”主动-被动”或”主动-主动”的策略使用主动连接。多路径模式还支持非对称命名空间访问(ANA),并使用它来制定策略决策。
为什么选择多路径
多路径技术支持在服务器和存储设备之间创建一条以上的物理路径。这样做可以为存储提供更有弹性的连接(向下的路径不会阻碍连接),也可以聚合存储带宽以提高性能。多路径实现了更好的容错和提供更高的性能。
什么是SPDK中的多路径
➢ 多路径模式
SPDK通过相同的NVMe bdev设备名称多次调用bdev_nvme_attach_controller RPC,用户可以在多个不同路径上建立连接到NVMe bdev的同一个NVMe-oF子系统的连接。此外,在连接第二条或更多其它路径时,此 RPC的多路径参数必须设置为“多路径(multipath)”。
bdev_nvme_attach_controller RPC每创建一条路径,都会创建一个NVMe-oF控制器。然后该控制器提供的命名空间集会被发现。每发现一个命名空间,NVMe bdev模块都会尝试将其与现有NVMe bdev进行匹配。如果找到匹配项,则会将给定的命名空间添加为备用路径。如果未找到匹配项,则会创建一个新的NVMe bdev。
I/O和admin qpairs是访问NVMe-oF控制器所必需的条件。创建一个admin qpair,并由所有SPDK线程共享。为了不使用锁提交I/O,将为每个SPDK线程创建一个I/O qpair,作为NVMe-oF控制器的I/O通道的动态上下文。
对于每个SPDK线程,NVMe bdev模块都会为NVMe bdev创建一个I/O通道,并将其提供给上层应用。NVMe bdev的I/O通道具有每个命名空间的I/O路径。I/O路径是向命名空间提交I/O的附加抽象,由I/O qpair上下文和命名空间组成。如果NVMe bdev具有多个命名空间,则NVMe bdev的I/O通道会有一系列的多条I/O路径。NVMe bdev的I/O通道具有重试I/O列表和路径选择策略的特性。
➢ 路径错误恢复
如果NVMe 驱动程序在qpair上检测到错误,它将断开qpair连接,并将错误通知给NVMe bdev模块。然后NVMe bdev模块开始重置相应的NVMe-oF控制器。NVMe-oF控制器重置包括以下步骤:1) 断开连接并删除所有I/O qpair;2) 断开admin qpair连接;3) 连接admin qpair;4) 配置 NVMe-oF 控制器;5) 创建并连接所有 I/O qpair。
如果步骤3、4、5失败,重置工作会恢复到步骤3,然后在reconnect_delay_sec秒后重试。如果在ctrlr_loss_timeout_sec 秒内未恢复成功,将自动删除NVMe-oF控制器。如果ctrlr_loss_timeout_sec 为-1,则会无限期重试。
➢ I/O 超时
NVMe驱动程序为已提交的I/O支持I/O 超时。当NVMe驱动程序通知I/O超时时,NVMe bdev模块会提供三种操作:中止(ABORT)、重置(RESET)或无(NONE)。用户可以使用选项action_on_timeout来设置超时操作。用户可以通过全局选项,timeout_us和timeout_admin_us,为I/O命令和管理命令分别设置不同的超时值。
如果选择中止(ABORT),NVMe bdev 模块会尝试中止超时的I/O,如果中止失败,它将启动NVMe-oF控制器重置。如果选择重置(RESET),NVMe bdev模块会启动NVMe-oF控制器重置。
如何通过Delay Bdev在SPDK中使用多路径
➢ 拓扑
举个例子来演示如何使用delay bdev实现多路径的路径切换和状态更改。我们使用SPDK NVMe-oF TCP目标和 SPDK NVMe-oF TCP启动器作为示例。拓扑如下所示。这两台物理机分别充当NVMe-oF目标和NVMe-oF启动器。这两台机器通过100G NIC电缆与E810 NIC背靠背直连。