什么是 SCSI 预留和 SCSI 持久预留?
适用场景
- ONTAP 9
- 集群模式Data ONTAP 8.
- Data ONTAP 7及更早版本
- FlexPod
问题和答案
什么是SCSI预留和SCSI-3永久性预留?
- SCSI预留用于控制对共享SCSI设备(如磁盘或磁带驱动器)的访问。
- 启动程序会 在LUN上设置预留 、以防止其他启动程序对LUN进行更改。这与文件锁定概念类似。SCSI预留始终由主机启动程序设置。理想情况下、同一个启动程序会对受影响的LUN执行SCSI版本。
- SCSI预留的机制在SCSI 协议中指定。如这些协议中所述、预留用于控制对设备的访问。
- 最初的SCSI预留机制称为SCSI预留和释放、也称为SCSI-2预留。在此机制下、启动程序将使用SCSI Reserve命令设置预留。此预留可以由所属主机发出SCSI Release命令或通过SCSI总线重置来释放。因此、由于错误恢复而执行的SCSI总线重置将对要释放的预留执行发生原因。
- SCSI-3主命令规范提供了一种现代的预留方法、称为永久性预留。永久性预留可以使预留持久存在、即使总线已重置以进行错误恢复也是如此。这些值可通过SCSI 持久预留出和持久预留入命令来设置。尽管SPC-2既支持预留预留预留预留、又支持释放和持久预留、但这两种机制是互斥的。
- 如果在设备上放置了经典预留、则在执行经典版本之前、所有后续的永久性预留请求都将失败。较新的SPC-3规范弃用了传统的预留和释放机制、而改用永久性预留。
- SCSI 协议 规范 提供了有关预留的更多详细信息。
SCSI-3持久预留如何工作?
- SCSI-3持久预留支持多个节点访问一个设备、同时阻止对其他节点的访问。SCSI-3永久性预留也支持从主机到磁盘的多个路径、而SCSI-2预留则不支持、并且只能使用单个LUN路径。
- SCSI-3永久性预留使用注册和预留的概念。对于参与的系统、请向LUN注册密钥。每个系统都注册自己的密钥。之后、注册的系统可以建立预留。使用此方法、阻止写入访问就像从设备中删除注册一样简单。希望弹出另一个系统的系统可能会注册、清除或抢占已注册的其他启动程序。这种方法可以有效地避免脑裂情况。
- 永久性预留允许多个客户端(启动程序)通过跟踪多个启动程序到目标的关系(称为I_T nexuses)与目标进行通信。I_T Nexus是指SCSI目标中给定LUN的特定SCSI启动程序端口和SCSI目标端口之间的关系。
- 设置永久性预留的第一步是注册预留密钥。预留密钥特定于每个I_T Nexus、它包含必要的信息、用于对I_T Nexus设备进行身份验证、以控制预留。
永久性预留有两个命令:
persistent reserve in
:由启动程序用来读取有关目标的现有预留和注册信息。persistent reserve out
:由启动程序用于注册、设置和更改其预留以及中断预留以进行错误恢复。
SCSI永久性预留命令还可以使用称为服务操作的子命令来执行特定功能、例如保留和释放预留。以下示例说明了如何使用 persistent reserve out
服务操作设置持久预留:
在 reservation conflict
从目标向启动程序发送响应后、发生冲突的启动程序需要重试此 reserve
请求。主机启动程序的操作系统将控制 reserve
重试请求的时间间隔。发生冲突的主机将继续 reservation conflict
从目标获取状态、直到发生以下事件之一:
- 控制主机发送
release
命令。 - SCSI总线设备重置是从任何启动程序发出的。
注意:SCSI-3持久预留可能会在目标设备重新启动期间保留。此行为由启动程序在 reserve
使用APTPL标志将预留请求发送到目标时确定。
NetApp存储系统使用SCSI预留的原因有以下几个:
- 在SAN环境中、NetApp光纤连接存储系统将为启动程序请求的LUN设置并支持经典版本/预留和持久预留。
- 在磁带备份环境中、可以将存储系统配置为在动态驱动器共享环境中使用SCSI预留来预留磁带驱动器。
- 在7.1.1之前的Data ONTAP版本中、SCSI预留/释放预留由
options tape.persistent_reservations [on | off]
命令控制。 - Data ONTAP 7.1.1及更高版本增加了设置SCSI预留/释放或SCSI永久性预留的功能。
options tape.persistent_reservations
命令已弃用、并已替换为options tape.reservations [scsi | persistent]
命令。
- 在7.1.1之前的Data ONTAP版本中、SCSI预留/释放预留由
- NetApp高可用性(High Availability、HA)存储控制器使用SCSI预留来控制磁盘访问。
- 对于 使用硬件磁盘所有权的HA对、SCSI预留仅在cf接管期间使用。
- 对于使用软件磁盘所有权的HA对、无论系统是否处于cf接管状态、都将使用SCSI预留。
- 它们不会在磁盘架重新启动期间持久保留。因此、如果磁盘架断电或驱动器重置、接管节点将定期重新声明预留。
- 虽然可以看到存在预留、但无法确定哪个节点设置了预留。
- 使用SANOWN (软件磁盘所有权)的主动-主动集群配对节点使用SCSI-3持久预留来控制磁盘所有权。
- 无论HA对是否处于cf接管状态、都将使用预留。这些预留会在重新启动后保持不变。
- 拥有预留的节点可以完全控制磁盘、包括读写功能。
- SCSI-3永久性预留每30秒重新确认一次。
解决主机中的SCSI-2预留冲突
lun reset
和 target reset
命令如何影响SCSI-2预留?
- 使用基于主机的软件是清除SCSI预留的最佳方式。通常、LUN会映射到单个主机。但是、对于主机集群、 相同的LUN通常会映射到所有集群节点。
- 在某些情况下、主机可能需要清除未启动的预留。 这可通过使用
lun reset
和target reset
SCSI命令来实现。
存储系统在收到 lun reset
或 target reset
命令时如何响应?
- 收到重置后、系统将记录以下消息:
Mon Jan 5 18:19:40 CST [storage1: scsitarget.ispfct.lunReset:notice]: FCP Target 5a: LUN 0 was Reset by the Initiator at Port Id: 0x74001f (WWPN 5001438002210a3e)
Mon Jan 5 18:18:01 CST [storage1: scsitarget.ispfct.targetReset:notice]: FCP Target 6a: Target was Reset by the Initiator at Port Id: 0x1d3600 (WWPN 500508b200b65d52)
发出 target reset
命令时是否必须使用特定的LUN?
target reset
启动程序可以发送命令、而无需寻址特定LUN、但lun reset
需要将寻址到特定LUN。
警告:目标重置将中止映射到发出此命令的启动程序的所有LUN上的所有命令。 此外、它还会中止从其他启动程序向启动程序访问的LUN发出的命令。 |
示例:
SCSItarget reset or lun reset
命令是否会清除SCSI-2预留?
是
lun reset
或 target reset
命令是否会影响SCSI-3持久预留?
否
是否可以 lun reset
从可查看此LUN的任何主机上的任何启动程序发出SCSI命令?
是但是、该 lun reset
命令需要发送到特定的LUN。
SCSI是否会 lun reset
影响登录到特定LUN的任何其他启动程序?
是映射到特定LUN的所有启动程序都将收到 LUN RESET
通知。
SCSI target reset命令是否会影响登录到 目标LUN的所有启动程序中的所有LUN?
NetApp SCSI目标上的目标重置仅会重置映射到发送target reset命令的启动程序的LUN。
与SCSI预留冲突相关的SnapDrive错误
- 尝试使用SnapDrive连接到LUN时、可能会出现以下错误:
Unable to locate a LUN to perform requested operation.
The LUN has SCSI reservation but has not been mapped.
- 在Windows主机上,在 “计算机管理”>“磁盘管理”中,磁盘也可以显示为
Unknown/Unreadable
。 - 可以通过清除SCSI预留来解决此问题。
建议使用基于主机的软件清除这些预留。
如果不起作用、可由 NetApp 全球支持部门的升级工程师(如有必要、可从存储系统)完成。
解决 NetApp 存储系统中SCSI-3持久预留的冲突- 在尝试清除NetApp 存储系统中的任何预留之前、请联系NetApp支持部门。