作者简介
刘长鹏:资深存储工程师,主要研究方向为虚拟化,新存储介质应用,负责SPDK开发和社区维护。
![640?wx_fmt=gif](https://i-blog.csdnimg.cn/blog_migrate/f0752f6fcb79ee8c7fd1aaa32a8c0391.gif)
1 NVMeReservation简介
NVMe Reservation (预约) 提供了对共享Namespace访问控制的功能,可以在高可用场景以及分布式场景中使用。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/63853eeef639728936923cb9bfcb2e24.jpeg)
图1 多主机场景
图1所示,是一种常见的多主机连接场景,其中主机A连接到两个控制器是MPIO (Multi Path I/O) 多路径场景,而Host B和Host C只连接到一个控制器。
Reservation需要在Host和Namespace之间建立连接,Reservation是基于Namespace来进行访问控制的,例如在图1所示的环境中,主机A/B/C可以同时访问到相同的Namespace,而Reservation特性可以实现在这几个主机间Namespace的访问控制,如某一个时刻只允许Host A可写,而其他Host B/C是只读。
Host端为了维持和控制器端的连接关系,需要注册本机Host的Identifier到控制器,因此在控制器端可以基于该Host的Identifier来区分不同的Host主机。
Host Identifier:Spec上规定了两种格式的Host Identifier,64-bit和128-bit,其中NVMe Over Fabric需要实现128-bit的扩展版本的Host Identifier。
Host需要首先注册Key到某个Namespace从而成为该Namespace的注册者 (Registrant) ;在图1所示的多路径连接中,Host A只需要通过Controller 1或者Controller 2注册一次。
针对每个Host来说,有三种角色:Reservation Holder,Registrant,Non-Registrant。Host必须首先注册Key成为Registrant,然后发送Reservation Acquire命令后可以成为Holder,Host什么都不做就是Non-Registrant。
Host可以获取该Namespace的Reservation,成为该Namespace的持有者 (Holder) ,并设置该持有者的Reservation类型,如Exclusive Access。
常用的Reservation类型有以下几种:
1) Write Exclusive: 只有Holder可以发送写命令,其他的注册者或者非注册者都是只读;
2) Exclusive Access: 只有Holder可以访问,其他的注册者或者非注册者都不能访问;
3) Write Exclusive-Registrants Only: 只有注册者可写,非注册者可读;
4) Exclusive Access-Registrants Only: 只有注册者可以访问;
5) Write Exclusive-All Registrants: 所有的注册者都是Holder,非注册者只读;
6) Exclusive Access-All Registrants: 所有注册者都是Holder,非注册者不可访问;
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/f98fbb8b760ac52b83a1a6be068aaac1.jpeg)
图2 Reservation类型
Write Exclusive/Exclusive Access是比较严格的访问控制级别,Write Exclusive-All Registrants和Exclusive Access-All Registrants是比较宽松的访问控制级别。
![640?wx_fmt=gif](https://i-blog.csdnimg.cn/blog_migrate/f0752f6fcb79ee8c7fd1aaa32a8c0391.gif)
2 NVMe Reservation使用场景
下面我们介绍一些使用场景,对Reservation支持的NVMe SSD一般面向企业级市场,SAS接口硬盘能成为企业级存储阵列的标配,与双端口设计密不可分,而NVMe在企业级存储上同样有双端口支持,图3所示列出了一种阵列环境下的双主控使用示例:
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/b3743dcf84b8a40fedc1d0e41debc3df.png)
图3 双端口NVMe SSD连接示例
Host A和Host B是双活主控,而运行在Host A和Host B上的软件驱动可以通过NVMe Reservation命令对相同的Namespace进行数据协同管理。
同样的,SPDK目前在NVMe-oF实现了对Reservation命令的软件实现,与企业级NVMe SSD相比,NVMe-oF是更为广泛的应用场景,下面是评测使用NVMe-oF Reservation功能的一个网络连接示意图:
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/b001927b80a4f2e7f0ad5c5d1857fb35.png)
图4 NVMe-oF Reservation连接示意图
运行SPDK NVMe-oF的节点需要有两个物理端口,这两个端口连接到两个网络,Host A和Host B分别连接到NVMe-oF Target。
1. 启动SPDK NVMe-oF Target,通过rpc创建subsystem,添加两个监听端口,创建1个Namespace;
2. Host A和Host B分别使用nvme connect命令连接到NVMe-oF;
3.使用nvme resv-acquire/resv-register/resv-release/resv-report 这四个命令进行评估使用,需要安装nvme-cli工具包;
假设Host A和Host B已经分别连接到NVMe-oF,并且在各自环境中可以看到远端的磁盘/dev/nvme0n1,我们以一个Write Exclusive的例子来看下流程:
1) Register:
Host A:nvme resv-register -n 1 --crkey=0x0 --nrkey=0xa1 --rrega=0 /dev/nvme0n1
Host B:nvme resv-register -n 1 --crkey=0x0 --nrkey=0xb1 --rrega=0 /dev/nvme0n1
2) Acquire:
Host A:nvme resv-acquire -n 1 --crkey=0xa1 --rtype=1 --racqa=0 /dev/nvme0n1
当上述命令执行成功后,此时Host A获得了Namespace的Write Exclusive所有权,用户可以在Host A端发送任意的命令到/dev/nvme0n1设备,而如果在Host B端发送Write命令到/dev/nvme0n1设备时,该设备会返回IO错误,并且错误码会设置成Reservation Conflict。
NVMe specification中非常贴心的实现了Notification机制,用户可以注册Reservation Asynchronous Event通知,当Namespace上发生Reservation变更时用户可以收到一个异步事件通知,通过该异步事件不同的Host就可以知道当前Namespace的Reservation变更消息了。
![640?wx_fmt=gif](https://i-blog.csdnimg.cn/blog_migrate/f0752f6fcb79ee8c7fd1aaa32a8c0391.gif)
3 本文总结
总结:目前SPDK中对PCIe SSD和NVMe-oF模拟的SSD都有Reservation特性的支持,其中PCIe SSD需要盘侧特性支持,SPDK的支持在Host侧;而NVMe-oF SPDK在Host侧和Target侧都有对Reservation的完整支持。总体来说,该特性更多的是面向企业市场,但一些集群文件系统可以使用该特性进行数据的协同操作而不用开发额外的消息流来同步数据操作。
转载须知
深入理解 SPDK NVMe/TCP transport的设计