【SPDK 用户态存储】Initiator 与互通:SPDK host、内核 nvme-rdma/tcp 与多路径边界
内容提要
本文介绍SPDK用户态存储栈中NVMe-oF Initiator(主机端)的三种路径:SPDK host、内核initiator及多路径。SPDK host通过统一API连接远端盘,内核initiator用nvme-cli管理块设备。多路径支持可达性与负载分布,但不提供数据冗余。安全特性如TLS需单独评估。选型取决于应用场景:SPDK流水线用SPDK host,传统文件系统用内核initiator。
延伸解读
选型核心:数据面归属决定路径
文章明确两条 host 路径的分工:SPDK host 将远端盘接入 bdev 树,适合继续在用户态做流水线或再导出;内核 initiator 则提供块设备节点,便于传统文件系统或应用直接使用。选型的关键在于数据面最终落在用户态还是内核,这决定了完成通知的模型和观测工具。混合部署虽可行,但会分裂故障域,需谨慎规划。
多路径的边界:可达性≠冗余
多路径与 ANA 解决的是路径可达与负载分布,不提供数据冗余,也不保证零中断切换。文章强调,两条网线连同一块盘只是双通道,冗余需依赖上层复制或 RAID。生产启用前必须按官方 HOWTO 验证路径切换,记录实际现象,避免将未测的“应该会”写入 SLA。
互操作需按特性验证,勿假设兼容
官方虽声明与内核互通,但协议兼容不等于运维兼容。不同实现或版本在特性位、超时、重连策略上可能存在差异,跨栈使用时需针对 fused 操作、TLS、ANA 等特性单独测试。升级任一侧后应重跑 discover/connect 与数据路径冒烟,确保实际行为符合预期。
安全与超时:联调清单需细化
TLS 与认证等安全特性改变连接建立方式,但不影响 I/O 主模型。启用时需确认每条路径都走安全通道,并明确认证失败的症状。超时与重连参数在两端可能不同,联调时应单列来源,故障演练中只改一侧观察另一侧,以建立可复核的因果,避免两侧同时调整导致问题难以定位。
Q&A
SPDK host 和内核 initiator 分别是什么?
SPDK host 是 SPDK 用户态存储栈中的 NVMe-oF 发起方,通过统一的 spdk_nvme_* API 连接远端 NVMe-oF 子系统;内核 initiator 是 Linux 内核提供的 NVMe-oF 发起方,使用 nvme-rdma 或 nvme-tcp 驱动模块,并通过 nvme-cli 工具管理,最终呈现为内核块设备(如 /dev/nvmeNnM)。
如何用 SPDK host 连接一个远端 NVMe-oF 子系统?
使用 spdk_nvme_probe() 或 bdev_nvme_attach_controller RPC。例如,通过 RPC 命令:scripts/rpc.py bdev_nvme_attach_controller -b Nvme0 -t RDMA -a 192.168.100.1 -f IPv4 -s 4420 -n nqn.2016-06.io.spdk:cnode1。连接后,远端盘就像本地 NVMe 控制器一样,可以使用相同的 API 进行 I/O。
如何用内核 initiator 连接 SPDK target?
首先加载内核模块:modprobe nvme-rdma 或 nvme-tcp。然后使用 nvme-cli 命令:nvme discover -t rdma -a 192.168.100.8 -s 4420 发现子系统,再使用 nvme connect -t rdma -n "nqn.2016-06.io.spdk:cnode1" -a 192.168.100.8 -s 4420 连接。成功后会出现 /dev/nvmeNnM 块设备。
SPDK host 和内核 initiator 在什么场景下选择哪个?
如果远端盘需要继续进入 SPDK 用户态流水线(如再导出 vhost/nvmf、做用户态处理),选择 SPDK host;如果远端盘需要交给内核文件系统或传统应用,选择内核 initiator。另外,如果同机已为 SPDK 独占 CPU/大页且希望减少进程,可选 SPDK host;如果运维只熟悉 nvme-cli 且应用不依赖 SPDK,可选内核 initiator。
SPDK 多路径支持哪些功能?它不能提供什么?
SPDK 多路径支持同一子系统配置多个 listener,并通过 ANA 状态表达路径优选,可设置 active_active 等策略,实现路径可达性和负载分布。但它不提供数据冗余,也不保证零中断切换;数据冗余需要 RAID/复制等上层机制,故障切换的可靠性取决于配置和策略。
如何验证多路径是否正常工作?
建议按官方 HOWTO 进行最小验证:1) 配置两个 listener 并标记为 optimized,确认双路径可见(如用 bdev_nvme_get_io_paths);2) 将一路标记为 non_optimized,确认流量迁移到另一路(可用 ss 观察连接);3) 模拟一路故障,记录应用是否只读错误或自动恢复;4) 若启用 active_active,确认这是负载分布而非冗余。
SPDK 支持哪些安全特性?使用时需要注意什么?
SPDK 支持 TCP TLS 1.3 PSK(实验性)和 DH-HMAC-CHAP 带内认证。注意:TLS secure-channel listener 与 allow-any-host 互斥;当前不支持规范允许的“带内认证+安全通道”组合,认证需走非 secure-channel 的 listener;密钥通过 keyring RPC 注入,initiator 在 attach 时上传 --psk 或 DHCHAP 参数。生产启用前需按官方实验标签和内核支持矩阵单独评估。
SPDK host 和内核 initiator 同时连接同一子系统时需要注意什么?
需要确认 target 的 max qpairs、host 允许列表和资源配额是否按双 initiator 规划,否则可能出现间歇性 connect 失败或路径抖动。除非有明确的迁移窗口需求,生产上应避免无文档的双栈并行挂载。