本文为大家介绍SCSI-2和SCSI-3访问控制原理。主要内容包括:SCSI-2 Reserve/Release/Reset和SCSI-3 Persistent Reserve IN/ Persistent Reserve OUT/ PREEMPT以及SCSI访问控制常见场景。
SCSI-2协议中客户端访问lun过程如下:
1、客户端向lun发起预留操作
2、预留操作成功后,客户端获得lun操作权限;预留失败,提示预留冲突,会继续尝试,直到预留成功。
3、客户端操作完毕后,执行释放操作,其他客户端可以预留。
SCSI-2访问控制主要缺点有:
1、预留操作基于路径。预留和释放必须由相同的客户端完成,一台主机不能释放另外一台主机的预留,同一主机HBA卡不能取消相同主机另外一块HBA的预留。
2、预留无法长久保留。主机重启将会丢失预留信息。
3、如果lun已经被预留,其他主机无法再预留。如果其他主机要想获得lun操作权限,必须对lun进行重置,重置操作可能会导致数据丢失。重置后释放掉lun现有的预留,重置操作由lun主动发起,原来预留主机并不知晓。
SCSI-3 Persistent Reserve (PR)/ PREEMPT(抢占)
SCSI-3协议引入PGR(persistent group reservation)功能。在访问lun之前,客户端首先向lun注册(registration)一个预留密钥(reservation key),注册成功后客户端可以尝试进行永久预留(reserve),永久预留成功后就可以获得lun操作权限。预留密钥是一串16进制的ASCII码,最长8个字节。永久预留一共6种类型,由1、3、5、6、7、8数字表示。包括两种操作类型和三种客户类型,操作类型包括写排它和所有访问排他,客户类型包括所有客户端、已注册客户端和所属客户端。数字与永久预留类型对应关系如下:
1-> write exclusive
3-> exclusive access
5-> write exclusive - registrants only
6-> exclusive access - registrants only
7-> write exclusive - all registrants
8-> exclusive access - all registrants.
不同注册类型对应不同访问权限。与SCSI-2不同,SCSI-3释放操作根据预留密钥。不同客户端可以使用相同密钥或是不同密钥进行预留,具体可以结合永久预留类型决定。客户端可以通过抢占来获取已被永久预留的lun访问权限。SCSI-3抢占和SCSI-2重置不一样,抢占不会造成数据丢失。
SCSI-3关于PGR相关操作命令分为两大类:分别是PRIN和PROUT。PRIN主要用于查询,PROUT用于修改。SCSI命令执行过程中,需要明确该命令是哪种类型。
常见使用场景
1、 集群I/O Fencing
为了防止集群故障发生“脑裂”现象,2-节点集群可以通过SCSI-2 Reseve/Release触发I/O fencing来保证整个集群正常运行,是SCSI-2不适用于多-节点集群,多-节点集群可以使用SCSI-3 PGR。主流厂商集群套件都已经支持SCSI-3 PGR,比如:VCS、HACAMP、RHCS等。
2、 集群文件系统
集群文件系统需要保证多节点同时访问存储时的数据一致性,SCSI-2/SCSI-3都可以满足,当一个节点尝试访问一个已经被预留的存储就会产生访问权限冲突。SCSI-3 PGR相比SCSI-2 Reserve/Release更能够减少访问权限冲突。
小结:
SCSI-2具体基本访问控制能力,但是无法满足Active/Active多路径环境和集群多节点访问存储的需求。SCSI-3通过引入客户端注册和操作权限分类概念,强化并行访问权限控制,弥补SCSI-2的不足。