一、背景介绍
SPDK(Storage Performance Development Kit)是英特尔开发的一个高性能存储框架,其主要特征包括用户态(user space)、轮询(polled-mode)、异步(asynchronous)、无锁(lockless)。基于spdk可以实现直接从用户态高并发访问远端存储设备。
NVMe和NVMe-oF
NVMe全称Non-Volatile Memory Express是一种存储设备访问的接口规范,它通过多队列多并发的方式很大提高了直接访问存储设备如闪存存储SSD的速度。NVMe-oF协议规范使用TCP、光纤通道、RoCE或infiniBand的RDMA实现访问远端存储设备。
基于SPDK内部实现的多路径技术为一种链路冗余技术,通过建立多于两条的访问路径,解决单路径故障路径问题。
基于SPDK的NVMe-oF+多路径的技术可以实现远程访问存储设备的可靠访问。
二、基于SPDK NVMeOF + 多路径访问远端存储设备
在这里,远端存储设备以常用的ceph集群rbd image为例,多路径采用主、备双路径模式,连接示意图如下:
存储端:这里以分布式存储集群为例,存储卷为ceph的rbd image;
Target端:控制器A和控制器B运行在不同的机器即存储网关上,每个存储网关上运行SPDK nvmf_tgt进程,基于ceph的rbd image卷创建subsystem供client端连接;
client端:用户端,基于SPDK通过NVMe OF与Target端的Controller A和Controller B建立连接,呈现出bdev设备,上层应用可以对bdev设备进行读写。
三、操作示例
1、存储端:
在ceph集群使用rbd命令创建一个size为10G的rbd image:test-image-10G
rbd create -p volumes --size 10240 test-image-10G
创建完成后,可以使用rbd info查看该image的信息如下:
2、Target端:
在controller A和controller B上运行SPDK nvmf_tgt服务,并创建rdma transport:
spdk_rpc.py nvmf_create_transport -t RDMA -m 64
2.1)在controller A上依次执行如下命令创建基于rbd image:test-image-10G的subsystem,供client端连接使用。
步骤1:注册image所在的ceph集群配置
spdk_rpc.py bdev_rbd_register_cluster --user cinder --config-param keyring=/etc/ceph_ssd/ceph.client.cinder.keyring --config-file /etc/ceph_ssd/ceph.conf ceph_ssd_cluster
步骤2:基于ceph集群和image创建rbd设备
spdk_rpc.py bdev_rbd_create -b rbd0 volumes test-image-10G 4096 -c ceph_ssd_cluster
步骤3:创建subsystem及其nqn:nqn.2021-06.io.spdk:ctc_rbd0,每个rbd卷可以创建独有的nqn,ctrlid范围为1~32760
spdk_rpc.py nvmf_create_subsystem nqn.2021-06.io.spdk:ctc_rbd0 -a -s SPDK_BDEV_0 -i 1 -I 32760
步骤4:基于rbd和subsystem创建namespace
spdk_rpc.py nvmf_subsystem_add_ns nqn.2021-06.io.spdk:ctc_rbd0 rbd0
步骤5:建立subsystem的监听地址和端口
spdk_rpc.py nvmf_subsystem_add_listener nqn.2021-06.io.spdk:ctc_rbd0 -t rdma -a 55.243.92.20 -s 4420
创建完成后,调用命令:spdk_rpc.py nvmf_get_subsystems nqn.2021-06.io.spdk:ctc_rbd0,查看该nqn的信息如下:
2.2)在controller B上依次执行如下命令创建基于rbd image:test-image-10G
步骤1:spdk_rpc.py bdev_rbd_register_cluster --user cinder --config-param keyring=/etc/ceph_ssd/ceph.client.cinder.keyring --config-file /etc/ceph_ssd/ceph.conf ceph_ssd_cluster
步骤1:spdk_rpc.py bdev_rbd_create -b rbd0 volumes test-image-10G 4096 -c ceph_ssd_cluster
步骤2:不同于controller A,controller B使用ctrlid范围为32761~65519
spdk_rpc.py nvmf_create_subsystem nqn.2021-06.io.spdk:ctc_rbd0 -a -s SPDK_BDEV_0 -i 32761 -I 65519
步骤3:spdk_rpc.py nvmf_subsystem_add_ns nqn.2021-06.io.spdk:ctc_rbd0 rbd0
步骤4:使用controller B的监听ip为55.243.92.21
spdk_rpc.py nvmf_subsystem_add_listener nqn.2021-06.io.spdk:ctc_rbd0 -t rdma -a 55.243.92.21 -s 4420
调用命令:spdk_rpc.py nvmf_get_subsystems nqn.2021-06.io.spdk:ctc_rbd0
在controller B上查看创建的基于test-image-10G的spdk subsystem信息如下:
3、client端:
在host侧启动spdk,通过调用bdev_nvme_attach_controller使用rdma传输方式,基于ip、port、nqn同时连接controllerA和controller B。
步骤1:spdk_rpc.py bdev_nvme_attach_controller -b Nvme0 -t rdma -f ipv4 -a 55.243.92.20 -s 4420 -n nqn.2021-06.io.spdk:ctc_rbd0 -x multipath -l -1 -o 20
步骤2:spdk_rpc.py bdev_nvme_attach_controller -b Nvme0 -t rdma -f ipv4 -a 55.243.92.21 -s 4420 -n nqn.2021-06.io.spdk:ctc_rbd0 -x multipath -l -1 -o 20
调用命令:spdk_rpc.py bdev_nvme_get_controllers -n Nvme0,查看Nvme0对应的多路径信息如下:
bdev:Nvme0 即通过两条不同路径通道55.243.92.20、55.243.92.21访问ceph存储卷test-image-10G。调用SPDK bdev读写接口,可以对bdev:Nvme0进行读写,IO请求默认优先第一条路径,当第一条路径故障后,IO请求会自动切换到下一条正常路径。