• SPDK NVMe-oF target多路功能介绍


    基本概念

    SPDK NVMe-oF target multi-path是基于NVMe协议的multi-path IO和namespace sharing功能。

    NVMe multi-path IO指的是两个或多个完全独立的PCI Express路径存在于一个主机和一个命名空间。

    而namespace 共享是两个或多个主机使用不同的NVMe控制器访问一个shared namespace。

    Multi-path IO和namespace 共享需要NVM 子系统有两个以上的控制器。

    两个主机同时访问一个shared namespace需要主机间的协调工作。

    SPDK NVMe-oF target 的multi-path功能提供的是namespace的sharing功能。比如,多个客户端通过交换机能够同时发现,连接和操作SPDK NVMe-oFsubsystem下的namespace。这些namespace是可共享的。如图所示

    图 1 SPDK NVMe-oF target namespace共享示例

    NVMe-oF host1和host2能够同时通过交换机发现和连接到监听地址为192.168.12.11的SPDK NVMe-oF target subsystem1。两个host端可以同时对subsystem1下的namespace进行操作。

    如果namespace不能共享,那么同时只能有一个NVMe-oF host连接到SPDK NVMe-oF target。

    具体查看方法:

    1. 运行SPDK NVMe-oF target 在目标机器端,子系统配置如下:

    1. [Subsystem1]
    2. NQN nqn.2018-07.io.spdk:cnode1
    3. Listen RDMA 192.168.12.11:4420
    4. AllowAnyHost Yes
    5. Host nqn.2016-06.io.spdk:init
    6. SN SPDK00000000000001
    7. MaxNamespaces 20
    8. Namespace Nvme0n1

    2. 在客户端机器运行nvme命令发现和连接SPDK NVMe-oF target, 命令如下:

    1. nvme discover -t rdma -a 192.168.12.11 -s 4420
    2. nvme connect -t rdma -n "nqn.2016-06.io.spdk:cnode1" -a 192.168.12.11 -s 4420

    3. 运行nvme id-ns命令, 参数是完整的nvme设备名, 比如/dev/nvme0n1:

    nvme id-ns /dev/nvme0n1

    在结果中, 我们就能看到如下内容:

    nmic    : 0x1

    nmic是Namespace Multi-Path I/O and Namespace sharing Capabilities的缩写。该值为1, 就表明这个namespace处于共享状态。

    使用场景

    在实际使用环境中,可以让SPDK NVMe-oF target子系统同时监听两个IP地址。客户端机器可以通过两个IP地址同时连接SPDK NVMe-oF target子系统。这样如果一个IP连接出现问题,比如网卡出现故障, 可以使用另外一个IP连接访问SPDK NVMe-oF target子系统。如下图所示:

    图 2 使用多网络端口访问同一个subsystem

    NVMe-oF host端使用192.168.11.0/24和192.168.12.0/24连接到SPDK NVMe-oF target的同一个subsystem。如果192.168.11.0/24的连接出现问题, 我们可以使用192.168.12.0/24的连接, 反之亦然。

    具体操作步骤如下:

    1. 运行SPDK NVMe-oF target 在目标机器端, 子系统配置如下:

    1. [Subsystem1]
    2. NQN nqn.2016-06.io.spdk:cnode1
    3. Listen RDMA 192.168.11.11:4420
    4. Listen RDMA 192.168.12.11:4420
    5. AllowAnyHost Yes
    6. Host nqn.2016-06.io.spdk:init
    7. SN SPDK00000000000001
    8. MaxNamespaces 20
    9. Namespace Nvme0n1
    10. Namespace Nvme1n1
    11. Namespace Nvme2n1

    2. 在客户机,首先查看一下系统的Linux 内核版本及配置。

    从Linux 4.15开始,nvme驱动支持multipath功能。 但是需要在编译内核的时候,将NVME_MULTIPATH功能打开。接下来的步骤都是基于4.15以上的带有NVME_MULTIPATH功能的Linux内核。

    运行如下命令发现SPDK NVMe-oF target子系统。

    1. nvme discover -t rdma -a 192.168.11.11 -s 4420
    2. nvme discover -t rdma -a 192.168.12.11 -s 4420

    两个命令有相同的输出:

    1. Discovery Log Number of Records 2, Generation counter 5
    2. =====Discovery Log Entry 0======
    3. trtype: rdma
    4. adrfam: ipv4
    5. subtype: nvme subsystem
    6. treq: not specified
    7. portid: 0
    8. trsvcid: 4420
    9. subnqn: nqn.2016-06.io.spdk:cnode1
    10. traddr: 192.168.12.11
    11. rdma_prtype: not specified
    12. rdma_qptype: connected
    13. rdma_cms: rdma-cm
    14. rdma_pkey: 0x0000
    15. =====Discovery Log Entry 1======
    16. trtype: rdma
    17. adrfam: ipv4
    18. subtype: nvme subsystem
    19. treq: not specified
    20. portid: 1
    21. trsvcid: 4420
    22. subnqn: nqn.2016-06.io.spdk:cnode1
    23. traddr: 192.168.11.11
    24. rdma_prtype: not specified
    25. rdma_qptype: connected
    26. rdma_cms: rdma-cm
    27. rdma_pkey: 0x0000

    3. 然后使用如下命令连接到子系统。

    1. nvme connect -n nqn.2016-06.io.spdk:cnode1 -t rdma -a 192.168.11.11
    2. nvme connect -n nqn.2016-06.io.spdk:cnode1 -t rdma -a 192.168.12.11

    4. 运行”nvme list”命令可以得到如下结果。

    1. Node SN Model Namespace Usage Format FW Rev
    2. ---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------
    3. /dev/nvme0n1 SPDK00000000000001 SPDK bdev Controller 1 2.00 TB / 2.00 TB 512 B + 0 B 18.10
    4. /dev/nvme0n2 SPDK00000000000001 SPDK bdev Controller 2 1.60 TB / 1.60 TB 512 B + 0 B 18.10
    5. /dev/nvme0n3 SPDK00000000000001 SPDK bdev Controller 3 800.17 GB / 800.17 GB 512 B + 0 B 18.10

    这样我们就可以在两条路径上对磁盘进行操作了。如果没有使用Linux内核的nvme multipath功能,运行”nvme list”命令会得到6个node, 因为每条路径3个node,总共2条路径。我们同样也能采用传统的multipath服务,来实现host端的multipath功能。本文不讨论如何使用传统的multipath服务。

  • 相关阅读:
    多线程和并发编程(6)—并发编程的设计模式
    linux系统下的文件操作
    python--gdal:tif图像坐标/投影坐标/经纬度转换(理清i和j的顺序)
    2.5计划任务远程管理
    【芯片前端】四年经验|芯片前端|IP设计岗|面试问题|总结分享
    JdbcTemplate查询操作
    【Linux】进程概念 —— 环境变量
    GS5MB-ASEMI贴片整流二极管GS5MB
    react typescript @别名的使用
    Python 自动化测试技术面试真题
  • 原文地址:https://blog.csdn.net/weixin_43778179/article/details/134512771