Bar

記憶域プール PowerShell を使ってパリティの障害から復旧させる手順

Windows 8/Windows Server 2012 から導入された記憶域プール(StoragePool)、お使いですか?
私はWindows Server 2012 R2 Essentials のサーバー フォルダーの一部を記憶域プール上に指定しています。
先日ファイル システムをReFSからNTFSへ変更し、同タイミングで回復性の種類をパリティに変更しましたが、障害発生後の復旧手順をテストしていなかったので確認作業をしてみました。
今回は、PowerShell を使って(記憶域プールの)パリティの障害から復旧手順をメモ。

環境

環境は下記の通り。
  • ホスト サーバー
    Windows Server 2012 R2 Essentials with Hyper-V
  • 仮想マシン
    Windows 8.1 Pro Update 64bit
  • 仮想ディスク
    32GB HDDを4本(OS用:1本、記憶域プール用:3本)
  • 記憶域プール
    回復性の種類はパリティ、シンプロビジョニングで200GBの仮想ディスク

正しい手順を理解し操作する事が一番の近道

Technet フォーラムの質問「記憶域プールのパリティで運用中、6台中1台だけ故障したのですが、記憶域全体がアクセス不可」で回答するため、いくつかのシナリオを検証しました。
上記環境においても質問された現象が発生。
検証した事で分かった事は、
  • 記憶域プールのテクノロジーを(ある程度)理解しておく(特にパリティ)
  • 正しい復旧手順を把握しておく
  • 復旧手順の訓練をしておく
3点が非常に大切です。

復旧手順

復旧手順の詳細は後程説明しますが、簡単な手順は下記の通りとなります。
  1. 新しいHDDを物理的に追加
  2. 破損したHDDのUsageをRetiredに変更
    • Set-PhysicalDisk -FriendlyName <問題のHDD> -Usage Retired
  3. 新しいHDDを記憶域プールに追加
    • Add-PhysicalDisk -PhysicalDisks <新しいHDD> -StoragePoolFriendlyName <記憶域プール名>
  4. 修復
    • Repair-VirtualDisk -FriendlyName <仮想ディスク名>
  5. (問題のHDDを)取り外し
    • Remove-PhysicalDisk -PhysicalDisks <問題のHDD> -StoragePoolFriendlyName <記憶域プール名>
  6. 破損したHDDを物理的に取り外す
検証によって分かった非常に大切な事は、
  1. 新しいHDDを追加出来るHW構成にしておく
    ※ホットスペアとして接続済みが理想
  2. 破損したHDDをすぐに取り外さない事
です。
よくありそうなシナリオですが、SATAポートorSASポートの空きがないため破損したHDDを取り外し新しいHDDを追加する
このシナリオだと、検証した限り復旧出来ませんでした。

パリティの障害から復旧させる手順

#現在の記憶域プールを確認
PS C:\Windows\system32> Get-StoragePool

FriendlyName            OperationalStatus       HealthStatus            IsPrimordial            IsReadOnly
------------            -----------------       ------------            ------------            ----------
Primordial              OK                      Healthy                 True                    False
StoragePool             Degraded                Warning                 False                   False


PS C:\Windows\system32> Get-VirtualDisk

FriendlyName        ResiliencySettingNa OperationalStatus   HealthStatus        IsManualAttach                     Size
                    me
------------        ------------------- -----------------   ------------        --------------                     ----
VirtualDisk         Parity              Degraded            Warning             False                            200 GB

#問題のHDDはPhysicalDisk-1,ステータスがLost Communication

#新規追加したHDDはPhysicalDisk1
PS C:\Windows\system32> Get-PhysicalDisk

FriendlyName        CanPool             OperationalStatus   HealthStatus        Usage                              Size
------------        -------             -----------------   ------------        -----                              ----
PhysicalDisk-1      False               Lost Communication  Warning             Auto-Select                    31.25 GB
PhysicalDisk3       False               OK                  Healthy             Auto-Select                    31.25 GB
PhysicalDisk2       False               OK                  Healthy             Auto-Select                    31.25 GB
PhysicalDisk1       True                OK                  Healthy             Auto-Select                       32 GB
PhysicalDisk0       False               OK                  Healthy             Auto-Select                       32 GB


PS C:\Windows\system32> Set-PhysicalDisk -FriendlyName PhysicalDisk-1 -Usage Retired
PS C:\Windows\system32> Get-PhysicalDisk

FriendlyName        CanPool             OperationalStatus   HealthStatus        Usage                              Size
------------        -------             -----------------   ------------        -----                              ----
PhysicalDisk-1      False               Lost Communication  Warning             Retired                        31.25 GB
PhysicalDisk3       False               OK                  Healthy             Auto-Select                    31.25 GB
PhysicalDisk2       False               OK                  Healthy             Auto-Select                    31.25 GB
PhysicalDisk1       True                OK                  Healthy             Auto-Select                       32 GB
PhysicalDisk0       False               OK                  Healthy             Auto-Select                       32 GB


PS C:\Windows\system32> $addDisk = Get-PhysicalDisk -FriendlyName PhysicalDisk1
PS C:\Windows\system32> Add-PhysicalDisk -PhysicalDisks $addDisk -StoragePoolFriendlyName StoragePool
PS C:\Windows\system32> Get-PhysicalDisk

FriendlyName        CanPool             OperationalStatus   HealthStatus        Usage                              Size
------------        -------             -----------------   ------------        -----                              ----
PhysicalDisk-1      False               Lost Communication  Warning             Retired                        31.25 GB
PhysicalDisk3       False               OK                  Healthy             Auto-Select                    31.25 GB
PhysicalDisk2       False               OK                  Healthy             Auto-Select                    31.25 GB
PhysicalDisk1       False               OK                  Healthy             Auto-Select                    31.25 GB
PhysicalDisk0       False               OK                  Healthy             Auto-Select                       32 GB


PS C:\Windows\system32> Get-StoragePool

FriendlyName            OperationalStatus       HealthStatus            IsPrimordial            IsReadOnly
------------            -----------------       ------------            ------------            ----------
Primordial              OK                      Healthy                 True                    False
StoragePool             Degraded                Warning                 False                   False

#この時点でRetiredしたHDDを削除するとエラーになります。 
PS C:\Windows\system32> $removeDisk = Get-PhysicalDisk -FriendlyName PhysicalDisk-1
PS C:\Windows\system32> Remove-PhysicalDisk -PhysicalDisks $removeDisk -StoragePoolFriendlyName StoragePool

確認
この操作を実行しますか?
Removing a physical disk will cause problems with the fault tolerance capabilities of the following storage pool:
"StoragePool".
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): y
Remove-PhysicalDisk : One of the physical disks specified could not be removed because it is still in use.
発生場所 行:1 文字:1
+ Remove-PhysicalDisk -PhysicalDisks $removeDisk -StoragePoolFriendlyName StorageP ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (StorageWMI:ROOT/Microsoft/..._StorageCmdlets) [Remove-PhysicalDisk], CimE
   xception
    + FullyQualifiedErrorId : StorageWMI 51004,Remove-PhysicalDisk

PS C:\Windows\system32> Get-PhysicalDisk

FriendlyName        CanPool             OperationalStatus   HealthStatus        Usage                              Size
------------        -------             -----------------   ------------        -----                              ----
PhysicalDisk-1      False               Lost Communication  Warning             Retired                        31.25 GB
PhysicalDisk3       False               OK                  Healthy             Auto-Select                    31.25 GB
PhysicalDisk2       False               OK                  Healthy             Auto-Select                    31.25 GB
PhysicalDisk1       False               OK                  Healthy             Auto-Select                    31.25 GB
PhysicalDisk0       False               OK                  Healthy             Auto-Select                       32 GB


#仮想ディスクを修復します

PS C:\Windows\system32> Repair-VirtualDisk -FriendlyName VirtualDisk
PS C:\Windows\system32> Get-StoragePool

FriendlyName            OperationalStatus       HealthStatus            IsPrimordial            IsReadOnly
------------            -----------------       ------------            ------------            ----------
Primordial              OK                      Healthy                 True                    False
StoragePool             Degraded                Warning                 False                   False


#RetiredしたHDDを取り外します
PS C:\Windows\system32> Remove-PhysicalDisk -PhysicalDisks $removeDisk -StoragePoolFriendlyName StoragePool

確認
この操作を実行しますか?
Removing a physical disk will cause problems with the fault tolerance capabilities of the following storage pool:
"StoragePool".
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): y

#取り外すと記憶域プール及び仮想ディスクは正常に戻ります
PS C:\Windows\system32> Get-StoragePool

FriendlyName            OperationalStatus       HealthStatus            IsPrimordial            IsReadOnly
------------            -----------------       ------------            ------------            ----------
Primordial              OK                      Healthy                 True                    False
StoragePool             OK                      Healthy                 False                   False


PS C:\Windows\system32> Get-VirtualDisk

FriendlyName        ResiliencySettingNa OperationalStatus   HealthStatus        IsManualAttach                     Size
                    me
------------        ------------------- -----------------   ------------        --------------                     ----
VirtualDisk         Parity              OK                  Healthy             False                            200 GB

実際に触って分かった注意点

  • パリティの1本に障害が発生しExplorerからアクセスすると反応が非常に悪い
    この状態から復旧させるため、下記2点を実行する。
    1. Exploereを閉じる、又は開かない
    2. PowerShellを起動し各種コマンドレットを実行する
  • ホットスペアの設定済みならばExplorerは不安定にならない
    ホットスペアの設定を施した物理HDDを記憶域プールに追加しておき、Repair-VirtualDisk コマンドレットを実行すればExplorerが不安定にはならない。
結論:パリティの場合は、ホットスペアが必要
パリティの特徴・動作をある程度把握した限り、パリティを使うならばホットスペア用HDDを追加した方が安全・安心できます。
お金がかかるじゃないか?!
お金は非常に大切ですが、そもそも耐障害性を上げるためのテクノロジーを選定している訳ですからね。
そこはしょうがないのではないかと。
それか、パリティではなく2方向ミラーや3方向ミラーを選定してみてはどうでしょうか。
ディスク サイズは減りますが、予想管理は楽でしょう。