本文探讨了一个情况,即在群集的其他组件脱机之后,群集共享卷(CSV)也随之脱机。 本文包含解决问题的步骤,并在必要时恢复任何受影响的虚拟机(VM)。
症状
此问题在以下情况下启动:
- 群集节点或存储组件变得不可用,但 I/O作仍在继续。 例如,磁盘阵列发生故障或需要维护。
- 随着I/O操作的进行,元数据记录累积。
- 当元数据记录达到其分配的限制时,I/O作会失败。
- 关联的 CSV 进入失败状态。
- 群集每 15 分钟(默认设置)尝试使 CSV 联机。 如果虚拟机管理服务(VMMS)管理群集上的 VM,VMMS 会定期尝试启动 VM。
- 30 分钟后,VMMS 停止尝试启动 VM。 使用受影响 CSV 的任何 VM 都无法自动恢复。
原因
群集行为的最新更改会影响 CSV 在“症状”部分中提到的情况下做出响应的方式。 以前,当元数据记录累积到分配的限制时,I/O操作可能会无限期停止。 由于更改,在这种情况下,I/O操作会失败,而不是继续挂起。 I/O 失败反过来会导致 CSV 脱机并进入“失败”状态。
恢复
可以使用以下两种方法之一来恢复群集。 要使用的方法取决于是否可以还原以前的群集组件,还是必须替换群集的某些部分。
方法 1:还原脱机组件并自动修复群集
还原脱机节点或存储后,会自动执行以下步骤。
- 下次群集自动尝试使 CSV 联机时,会成功。
- 自动修复过程将启动,然后卷变为可用。
重要
群集恢复后,可能需要手动启动使用该群集的任何 VMMS 托管 VM。 群集关闭 30 分钟后,VMMS 会自动停止尝试重启虚拟机。
方法 2:替换脱机组件并手动恢复群集
如果无法还原缺少的节点或存储,请按照以下步骤手动恢复群集。
重要
- 此过程暂时使池中的所有卷脱机。
- 可以将此过程既用于存储空间,又用于故障转移群集。 适用于虚拟磁盘或卷的每个步骤也适用于群集虚拟磁盘和群集共享卷。
在对存储池具有完全访问权限的节点上,以群集管理员身份运行以下步骤。
-
在对存储池具有完全访问权限的群集节点上,打开管理 PowerShell 命令提示符窗口。
-
若要获取受影响存储池的属性,请在 PowerShell 命令提示符处运行以下命令:
Get-ClusterResource <Pool>注释
- 在此 cmdlet 中, <池> 是存储池资源的名称。
- 此过程的后续步骤使用资源的名称和所有者组等属性。
-
若要获取存储池虚拟磁盘和 CSV 的属性,请运行以下命令:
Get-ClusterResource | Where-Object { $_.ResourceType -eq "Physical Disk" }Get-ClusterSharedVolume -
查看属性以确定哪些资源处于“失败”状态。
注释
如果打算对替换的任何资源重复使用名称和 ID 信息,则可以使用
Get-ClusterResource和Get-ClusterParameter获取该信息。 -
无论是替换节点还是仅存储,请运行以下 cmdlet,将未池磁盘添加到存储池:
Get-StoragePool -isprimordial $false | Add-PhysicalDisk -PhysicalDisks $(Get-PhysicalDisk -CanPool $true) -
若要停用不正常的磁盘(或与失败的节点关联的磁盘),请运行以下 cmdlet:
Get-PhysicalDisk | Where-Object { $_.OperationalStatus -eq "Lost Communication" } | Set-PhysicalDisk -usage Retired -
通过运行
Get-VirtualDisk并在 cmdlet 输出中查找OperationalStatus = InService来监视虚拟磁盘。OperationalStatus当所有虚拟磁盘的参数明确时,请转到下一步。 -
若要将受影响的存储池(之前标识)移到当前节点,请运行类似于以下命令的 PowerShell cmdlet:
Move-ClusterResource -node <Current Node> -name <OwnerGroup>注释
在此命令中, <Current Node> 是正在处理的节点的名称, <OwnerGroup 是存储组资源的 OwnerGroup> 属性的值。
-
若要将失败的磁盘和 CSV 资源移到当前节点,请针对每个物理磁盘和 CSV 资源再次运行
Move-ClusterResource。 若要查看 CSV 的 OwnerGroup 值,请运行Get-ClusterSharedVolume | get-ClusterGroup。 -
若要从群集管理中删除所有群集虚拟磁盘和 CSV,请按顺序运行以下 PowerShell 命令:
Remove-ClusterSharedVolume Get-ClusterResource | Where-Object { $_.ResourceType -eq "Physical Disk" } | Remove-ClusterResource -
若要从群集管理中删除存储池,请运行
Remove-ClusterResource此过程的步骤 2 中标识的存储池对象的命令。 -
若要使存储池可写,请运行以下命令:
Get-StoragePool -isPrimordial $false | Set-StoragePool -IsReadOnly $false -
若要配置虚拟磁盘,请针对此过程的步骤 3 中标识的每个虚拟磁盘运行以下命令。
Get-VirtualDisk | Set-VirtualDisk -IsManualAttach $false -
使用
Get-StorageJobcmdlet 监视与修复相关的存储作业。 作业启动后(完成的百分比大于 0),转到下一步。 -
若要将存储池还原到群集管理,请运行以下命令:
Get-CimInstance -Namespace "root\MSCluster" -ClassName "MSCluster_AvailableStoragePool" | invoke-cimmethod -MethodName AddToCluster -
将所有未失败的虚拟磁盘还原到群集管理。 如果在发生故障之前将上一步骤中的任何虚拟磁盘配置为 CSV,请将其转换为 CSV。
例如,可以恢复未处于失败状态的任何虚拟磁盘或 CSV 资源。 若要还原这些资源,请使用步骤 3 中的
virtualdiskid``name属性值,然后运行类似于以下脚本摘录的命令:`$virtualdiskname = "ClusterPerformanceHistory"` `$virtualdiskid = "603bb5d0-9c4d-4fc6-9c25-eec92a478733"` `(get-clusteravailabledisk | Where-Object { $_.Id -eq $virtualdiskid} | add-clusterdisk).Name = $virtualdiskname`您可以使用
Add-ClusterSharedVolume重新配置 CSV。 -
通过运行
Get-VirtualDisk并在 cmdlet 输出中查找OperationalStatus = InService来监视虚拟磁盘。OperationalStatus如果所有虚拟磁盘的参数已清除,请继续执行下一步。 -
若要使虚拟磁盘联机并将其配置为读/写,请运行以下命令:
Get-VirtualDisk | get-disk | Where-Object { $_.IsReadonly -eq $true } | set-disk -IsReadOnly $false Get-VirtualDisk | get-disk | Where-Object { $_.IsOffline -eq $true} | set-disk -IsOffline $false -
通过运行以下 cmdlet 监视已停用物理磁盘的虚拟磁盘占用情况:
get-physicaldisk -Usage Retired | ft Deviceid, Usage, VirtualDiskFootprint当占用空间降至零时,请继续下一步。
-
将先前故障的虚拟磁盘恢复到群集管理。 如果上述任一虚拟磁盘以前配置为 CSV,请将其转换为 CSV。
-
将上一步中的虚拟磁盘联机,并将其配置为读/写。
重要
群集恢复后,可能需要手动启动使用该群集的任何 VMMS 托管 VM。 群集关闭 30 分钟后,VMMS 会自动停止尝试重启虚拟机。
状态
此行为是 Windows Server 2025 的设计初衷。 它的目的在于防止 I/O 持续无响应。