现象:非正常删除windows2012 R2故障转移集群后,重新安装系统后,发现磁盘变成RAW并且联机后格式化无法顺利完成。
格式化无法完成,删除卷提示被使用
检查日志发现都是警告和报错
分析:由于是非正常删除集群,导致这些磁盘依然被上一个集群的PR Key(SCSI-3 Reservation)锁定着,导致这些磁盘被占用而不能访问和格式化。
处理:
对其中一台节点的异常磁盘分别执行如下清理保留磁盘命令,-Disk 后跟的是磁盘管理器中的磁盘标签号,具体用法在https://technet.microsoft.com/en-us/library/ee461016.aspx,
清理集群信息的命令:
Clear-ClusterDiskReservation -Disk
依次执行后磁盘状态正常。
总结:重新装集群时候,务必先将群集节点依次退出集群并清除群集磁盘,再删除集群,防止共享磁盘继续被之前集群的PR Key锁着的问题。
知识补充:
SCSI锁是多台主机用来操作LUN的基本机制。在Windows存储环境中,当多台Windows主机需要访问一个LUN的情况下,例如Windows Cluster环境,就会用到SCSI锁。
原理解读:
在一个共享存储的环境下,多台主机可能会同时访问同一台存储设备,如果此时多台主机在同一时点上对一个Lun进行写的操作,那么可想而知这个Lun将不知道哪个数据先写,哪个数据后写。为了防止这种情况发生而导致的数据损坏,于是就引入了SCSI锁的概念。通过SCSI Reservation机制来进行SCSI锁的操作,目前绝大多数的磁盘都支持‘SCSI reservvation命令‘。如果一台主机给磁盘传输了一条SCSI Reservation命令,则这个磁盘对于其他的主机就处于锁定状态。如果有其他的主机给已经被锁定的磁盘发送读写请求,则会收到‘reservation conflict’报错信息。如果保留SCSI锁的主机崩溃,或者其他主机给磁盘发送‘break reservation或者reset target命令,用来解除SCSI锁。然后,第二个主机发送I/O请求之前需要重新发送SCSI Reservation命令给磁盘。
SCSI锁的分类:
SCSI锁有两种类型:SCSI-2 Reservation和SCSI-3 Reservation。一个LUN上只能存在一种类型的SCSI锁。
SCSI-2 Reservation只允许设备被发出SCSI锁的Initiator访问,也就是主机的HBA。比如主机1上的HBA1对访问的LUN加上SCSI-2锁,此时即使主机1的HBA2也无法访问这个LUN。所以SCSI-2 Reservation也被称为Single Path Reservation。
SCSI-3 Reservation(Persistent Reservation)是使用PR Key来对磁盘进行加锁。通常一台Host会有唯一的PR Key,不同的主机对应的PR Key也不同。所以一般SCSI-3 Reservation通常被应用在多通路的共享环境下面。这里SCSI-3 Reservation也称之为Persistent Reservation。
Windows Cluster中的SCSI锁:
Windows 2003集群中使用SCSI-2 reserve/release命令。作为非持久的reservation,所以集群中的一台节点会持有SCSI-2 Reservation的锁,然后每过3秒会重新刷新一次。如果故障转移发生,则切换节点主机会在相应的磁盘上放置SCSI-2 Reservation然后维护SCSI锁。如果所有节点主机上的集群服务都会关闭,Reservation也不会保留。
Windows 2008以上集群中使用SCSI-3 persistent reservation机制。如果磁盘从主机上没有正确移除,集群使用的磁盘(Cluster Disk)会保留着这些Reservation。锁对应的SCSI锁会一直存在于相应的磁盘之上,即使集群服务被关闭或者磁盘对于主机取消掩饰(unmasked)。所以,有些时候需要强行移除磁盘上的Reservation。
什么情况下设备会被加锁?
一般设备被打开时将会被加上锁。比如varyonvg、dd等等,需要注意的是对于dd这种命令当它运行时设备会被加锁,运行完成后会自动解锁。
注意:varyonvg -c不会对设备加锁。
另外,当vg varyon之后,只有varyoffvg或者varyonvg -b才会对vg相关的设备进行解锁。直接用shutdown命令不会做varyoffvg的动作,因此不会解锁。
群集服务如何保留一个磁盘并使磁盘返回到联机状态?
群集服务仅使用 SCSI 协议来管理共享总线上的磁盘。
注意:这并不意味着所有磁盘都将属于类型 SCSI,指定称为 SCSI 硬件接口,但相反,存储单元都必须能够正确地解释和处理 SCSI 协议和命令。
下面的命令是在群集环境中的磁盘时将使用的其他 SCSI 协议功能。
保留︰ 通过获得或保留所有权的 SCSI 设备的主机总线适配器发出此命令。保留设备的所有其他主机总线适配器,但最初保留其发起人之一会拒绝所有的命令。
释放︰ 所属的主机总线适配器发出此命令,当磁盘资源处于脱机状态。它释放保留的另一台主机总线适配器的 SCSI 设备。
重置︰ 在目标设备上,此命令中断预留。此命令可以重置 (对于整个总线) 或使用 storport 驱动程序目标重置总线上的特定设备的总线。
下面的过程描述服务器群集如何启动并取得控制权的共享磁盘。此方案假定,只有一个节点每次打开︰
当计算机启动时,群集磁盘驱动程序 (Clusdisk.sys) 读取以下的本地注册表项,以获得在群集管理的共享磁盘签名的列表︰
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ClusDisk\Parameters \Signatures
获取该列表后,群集服务将尝试扫描所有的设备上共享的 SCSI 总线以查找匹配的磁盘签名。
群集磁盘驱动程序在群集中的第一个节点启动时,第一次标记的所有 Lun (LUN︰ 逻辑单元号、 SCSI 总线上用来区分共享同一总线的设备的唯一标识符) 签名密钥匹配为离线卷。请注意,这并不相同,则为使群集资源脱机。卷被标记为离线,以防止多个节点同时具有卷写入权限。如果群集共享的磁盘群集,其中一个磁盘被指定为仲裁磁盘的群集服务。仲裁磁盘是第一资源联机时,群集服务将尝试形成群集。
Forming 节点上的群集服务启动时,它首先尝试联机指定为仲裁磁盘的物理设备。获得所有权的仲裁磁盘上执行磁盘仲裁算法。成功的仲裁,在群集服务给 clusdisk 开始发送定期保留到磁盘 (以保留所有权) 发送的请求。群集服务将请求发送给 clusdisk 取消阻止对仲裁磁盘的访问权限,然后装入的磁盘上的卷。成功装入卷,完成在线的过程和群集服务,然后继续使用群集过程中窗体。请求从群集磁盘驱动程序传递到 Microsoft 存储驱动程序堆栈和最后到特定于 HBA 驱动程序进行通信的磁盘。它也可能传递到运行存储堆栈中的任何多路径软件。有关存储堆栈和驱动程序模型的详细信息,请单击下面的链接︰
后该存储控制器/设备驱动程序报告,成功地保留了该设备,该群集服务确保驱动器可以读取和写入。一旦越过这些测试中的所有磁盘,磁盘资源标记为联机,群集服务将继续使所有其他资源联机。
在群集中的每个节点续订它拥有每三秒任何 Lun 的预留。如果群集中的节点丢失 (例如,如果在私有或公用网络上有没有通信) 与其他网络通信,节点开始该过程称为仲裁决定仲裁磁盘的所有权。赢得拥有仲裁磁盘资源在群集节点之间的通信完全丢失的节点将保持有效。群集服务和任何资源,任何节点,无法交流,无法维护或获得仲裁磁盘的所有权将终止该节点的承载将会被移动到群集中的另一个节点。
目前拥有仲裁磁盘的节点是保护节点。Defender 假设,它抵御任何群集节点它无法与通信和未接收关闭通知。Defender 不断通过 SCSI 请求续订仲裁为其预留储备放在 LUN 上每三秒。
所有其他节点 (节点不拥有仲裁磁盘并不能传达与拥有仲裁资源的节点) 将成为具有挑战性的节点。
当挑战者检测到丢失的所有通信时,它会立即请求总线范围的 SCSI 重置中断任何现有的预留。
7 秒后重置 SCSI 请求,挑战者尝试保留仲裁磁盘。如果 defender 节点联机并且运行正常,它将已经保留了仲裁磁盘那样通常每隔三秒。挑战者并检测到它不能预留仲裁,群集服务将终止。如果 defender 工作不正常,挑战者可以成功保留仲裁磁盘。10 秒钟后,挑战者将在线仲裁,并将群集中的所有资源的所有权。如果保护节点失去仲裁设备的所有权,然后保护节点上的群集服务立即终止。
当群集节点所需的磁盘资源脱机时,它请求释放 SCSI 保留驱动器然后再一次将是对操作系统不可用。只要群集的磁盘资源脱机,群集中,资源指向 (具有匹配签名的磁盘) 的卷将无法访问任何群集节点上的操作系统。