Windows Serverでは以前より、ソフトウェアRAIDと呼ばれるWindows ServerのOS自体の機能で、RAIDボリュームを構築することが可能となっています。RAID(Redundant Arrays of Inexpensive Disks)は複数のディスクを組み合わせて構築するディスクシステムで、複数のディスクを1つの大きなボリュームとして利用でき、冗長性の保持、パフォーマンスのアップを期待することができます。今回はWindows Server 2019のRAID機能としてこれまで提供されてきたものに、さらに記憶域プールの機能を組み合わせて、冗長性とパフォーマンスがより優れたRAIDディスクシステムを構築してみたいと思います。
ソフトウェアRAID 0・1・5
Windows Serverの「ディスクの管理」から構築できるRAIDボリュームを確認してみると、ボリュームの種類として、スパンボリューム、ストライプボリューム、ミラーボリューム、RAID5ボリュームの4種類が作成可能となっています。このうち、ストライプボリューム(RAID0)、ミラーボリューム(RAID1)、RAID5ボリューム(RAID5)がいわゆるRAID構成のボリュームということになります。スパンボリュームもRAIDと呼べそうですが、複数のディスクに分散してデータを書き込むRAIDとは別物として扱われているようです。
「ディスクの管理」で作成可能なRAIDボリューム
今回は各RAIDの特徴や構築方法などは割愛させていただきますが、それぞれのRAIDが単独のディスクに対してどれだけパフォーマンスと冗長性がアップするかを確認しておきます。(検証用として用意したものは、SATAのいわゆるひと昔前の遅いディスクです。)
まずは、物理ディスク1台単体のベンチマークです。1台のディスク容量は465GBです。
ディスク1台のベンチマーク
次にRAID0=ストライプをディスク3台で構築しています。容量は465×3=1395GBです。
ディスク3台RAID0のベンチマーク
すでにRAIDのパフォーマンスについては様々なところで紹介されていますが、教科書通りRAID0のストライプ構成では、ディスクのRead・Writeのパフォーマンスがディスクの台数分だけ向上しています。組み合わせたディスクサイズ分、ボリューム容量を確保可能ですが、ディスクが1台でも故障してしまうとデータを失ってしまうというリスクを伴うのがRAID0となっています。
次にRAID1=ミラーをディスク2台で構築しています。ディスク容量は1台分と同等の465GBです。
ディスク2台RAID1のベンチマーク
ディスク2台から同時に読み取りが行われるので、Readのパフォーマンスが向上しています。Writeは1台の時とほぼ同じです。1つのデータを2台のディスクに同様に書き込んでいるため、ディスクが1つ故障したとしてもデータは保持されるので安全性が高いです。ミラーはディスク1台に対して1組となるため、ボリュームサイズはディスク1台のサイズが最大となります。
最後に、RAID5=パリティーをディスク3台で構築しています。容量はパリティー分差し引かれて2台分の930GBです。
ディスク3台RAID5のベンチマーク
パフォーマンスの良いRAID0のストライプに冗長性を持たせたのがRAID5となります。ディスクが1台故障したとしてもデータは保持され、大きなボリュームサイズを確保することが可能です。複数のディスクから読み込みするためReadのパフォーマンスがアップしますが、パリティー情報の書き込みが発生するため、Writeのパフォーマンスが低下します。ハードウェアのRAIDコントローラーでは、Writeのパフォーマンス低下を抑えるために、ライトバックというキャッシュメモリを利用したパフォーマンス対策を行っていますが、OSレベルのソフトウェアRAIDでは実現できていません。
DiskPartをPowerShellから使うには
各RAIDはWindows Serverの「ディスクの管理」から構築できますが、コマンドを利用することもできます。PowerShellではRAID関係のコマンドは提供されていないので、DiskPartを使って構築することになります。PowerShellからDiskPartを呼び出す場合は以下のようになります。
@"select disk 4convert dynamicselect disk 5convert dynamicselect disk 4select volume Eadd disk 5"@ | DiskPart
RAID1(ミラー)のボリュームを作成するサンプルです。ポイントとしては、DiskPartで実行するコマンドをヒア文字列で作成して、パイプラインでDiskPartに引き渡す部分となります。
記憶域プール
記憶域プールの詳細についても、すでに様々な記事で詳しく紹介されているので、ここでは概要だけ紹介します。Windows Server 2012から利用できるようになった記憶域プールは、OSレベルで構築する新しいディスクシステムです。仮想化の技術を応用し、仮想ディスクベースで構成されます。複数の物理ディスクに跨ってデータを分散し、冗長性、拡張性、パフォーマンスに優れたディスクシステムを提供します。
これまで「ディスクの管理」から行っていたような構築管理が、サーバーマネージャーやPowerShellで行うことができるようになっています。RAIDボリュームのような冗長性を持たせつつ、さらに障害対策機能も向上しています。また、仮想化ならではの機能で、実際の物理ディスク以上の容量を確保したボリューム作成が可能で、オンラインで後からディスクを追加することができるなど、管理のしやすさ、パフォーマンスの向上も実現しています。
記憶域プールでは「シンプル」「ミラー」「パリティー」といった記憶域のレイアウトを選択することができ、RAIDボリューム以上の障害対策を利用することが可能です。
記憶域のレイアウトの簡単な説明をしておきます。
・シンプルは、RAID0のように高いパフォーマンスでディスクを無駄なく利用することができますが、障害対策機能を持っていませんので、物理ディスクに障害が発生した場合、データを失うことになります。
記憶域のレイアウト シンプル
・ミラーはRAID1同様に2台のディスクでデータを二重化して保存しているので、障害対策も問題ありません。さらなる障害対策として、同じデータを3か所に保存しておくといった3方向ミラーという構成も選択可能です。3方向ミラーの場合、最低5台の物理ディスクが必要で、2台までの故障に対応できますが、その分ディスク容量の利用効率は低くなり、コストがかかります。
記憶域のレイアウト ミラー
・パリティーは、RAID5のようにデータを3台以上のディスクに分散して保存して、パリティー領域にデータ保存情報を確保するので、ミラーよりもディスク容量の利用効率は良くなっています。パリティー情報の書き込みが発生するため、書き込み速度が遅くなる傾向があります。
記憶域のレイアウト パリティー
記憶域プールの作成
記憶域プールは、サーバーマネージャーもしくはPowerShellから作成することができます。まずはサーバーマネージャーを使って記憶域プールを作成してみましょう。「サーバーマネージャー」 - 「ファイルサービスと記憶域サービス」 - 「記憶域プール」を選択します。右上の「タスク」から「記憶域プールの新規作成」を選択してウィザードを起動します。
「記憶域プール名」を設定して、利用していない物理ディスクを3台選択します。
ディスクの選択
記憶域プールが作成されました。
記憶域プールの作成完了
次に、作成した記憶域プール内に仮想ディスクを作成します。仮想ディスクの「タスク」から「仮想ディスクの新規作成」を選択します。
仮想ディスクの新規作成
記憶域プールが複数ある場合は、仮想ディスクを作成する記憶域プールを選択して、ウィザードを起動します。
記憶域プールの選択
仮想ディスク名を設定します。エンクロージャの回復性の指定は、ブレードサーバーなどを利用する場合にブレードのモジュールなどを物理的に分けている場合に指定する項目となります。エンクロージャがない場合、チェックボックスは無効になっているのでこのまま次に進みます。
エンクロージャの設定
記憶域のレイアウト、RAID0と比較するため、今回は「Simple」を選択します。
記憶域のレイアウトの選択
プロビジョニングの種類の指定では、仮想ディスクの初期状態を指定します。
Hyper-Vで利用する仮想ハードディスクのvhdxファイルと同様に、「最小限」は利用した分だけ実容量を確保する容量可変の仮想ディスクです。「固定」は先にボリュームの実容量すべてを確保しておく仮想ディスクとなります。記憶域プールを利用すると、利用当初からすべての実容量を確保しておく必要がないという、仮想化ならではの利便性があります。足りなくなったら後から物理ディスクを追加することが可能です。
ここでは「最小」を選択します。
プロビジョニングの種類の指定
仮想ディスクのサイズを指定します。先ほど作成したRAID0と比較するため、同じサイズで作成しておきます。
仮想ディスクのサイズの指定
仮想ディスクが作成されました。
仮想ディスクの作成完了
「閉じるボタン」をクリックすると、引き続き「新しいボリュームウィザード」が自動的に起動します。これ以降はこれまで利用していた「ディスクの管理」ツールでボリュームを作成する手順と同じです。
新しいボリュームウィザード
ボリュームを作成するディスクを選択します。先ほど作成した仮想ディスクがリストに追加されています。
ディスクの選択
「ディスクの管理」ツールから確認すると、仮想ディスクが1台の物理ディスクとして認識されているのが確認できます。
ディスクの管理から確認
ボリュームサイズを指定します。ここでは最大サイズを指定します。
ボリュームサイズの指定
ドライブ文字を割り当てます。フォルダとして割り当てることも可能です。
ドライブ文字の割り当て
ファイルシステムの指定で、ファイルフォーマットを指定します。
ファイシステムの選択
「ディスクの管理」ツールのボリューム作成ウィザードと異なる点は、データ重複除去の設定が併せてできる点です。
データ重複除去の設定
ボリュームが作成されました。
ボリューム作成の完了
「ディスクの管理」ツールからも確認できます。
ディスクの管理からボリュームの確認
早速、パフォーマンスをチェックしてみましょう。先ほど作成したRAID0と同等のパフォーマンスとなっています。
記憶域プールSimple
RAID0
ここまでだと、記憶域プールのSimpleとこれまでの「ディスクの管理」から作成したRAID0(ストライプ)の違いは無いように思えますが、記憶域プールの利点はここからになります。
先ほど3台の物理ディスクで記憶域プールを作成しました。「ディスクの管理」ではすでに物理ディスク3台分の容量でボリュームを作成しているので、それ以上のボリュームは作成できません。記憶域プールでは仮想ディスクベースでボリュームを作成しているため、最小の容量でボリュームを作成でき、実際に利用していないディスクのスペースにさらにボリュームを作成することが可能です。いわゆるオーバーコミットと呼ばれている技術です。実際に利用された分だけ物理ディスクが消費されるので、初めは最小のコストでパフォーマンスを落とすことなくスタートすることができます。ディスク領域が足りなくなってきたら、記憶域プールに物理ディスクを追加していきます。
このキャプチャー画像は、物理ディスク3台分の記憶域プールの中に、物理ディスク6台分に相当する容量で仮想ディスクを作成して、2つのボリュームとして利用している状態です。これまででは実現できなかったディスクシステムを構成できるのが、記憶域プールのメリットとなります。
効率的なディスクの利用が可能な記憶域プール
ただし、同じ物理ディスク上に複数の記憶域プールを作成した場合は、ディスクの故障によるデータ消失のリスクが高くなりますので、障害対策として万全を期す場合には記憶域プールごとに仮想ディスクを割り当てることをお勧めします。
※仮想ディスクの削除不要となった仮想ディスクを削除する場合は、作成しているボリュームを先に削除してから、仮想ディスクを削除する必要があります。
ボリュームの削除・仮想ディスクの削除
続いて、記憶域プールのMirrorとParityも同様に作成してパフォーマンスを見てみましょう。記憶域プールMirrorの場合は、Readのパフォーマンスがほぼ1台の物理ディスクと同様となっています。RAID1のほうがReadについてはパフォーマンスが良いようです。
記憶域プールMirror
RAID1
記憶域プールのParityでは、RAID5の弱点であったWriteのパフォーマンスが向上しています。
記憶域プールParity
RAID5
PowerShellによる記憶域プールの作成
サーバーマネージャーから記憶域プールの作成方法を紹介しましたので、次にPowerShellで記憶域プールを作成する方法を紹介します。
まずは、物理ディスク一覧でDeviceIdを確認します。このDeviceIdをキーとして記憶域プールを作成していきます。
(Get-PhysicalDisk -CanPool $True) | Select DeviceidDeviceid--------7131242381091114165
物理ディスクのDeviceId 2,3,4を使って記憶域プールを作成します。記憶域のレイアウトはSimpleです。
$PhysicalDisks = (Get-PhysicalDisk -CanPool $True) | Where {($_.Deviceid -eq 2) -Or ($_.Deviceid -eq 3) -Or ($_.Deviceid -eq 4)}$StragePoolName = "SP01"$VirtualDiskName = "VD_Simple"$Layout = "Simple"New-StoragePool -FriendlyName $StragePoolName -StorageSubsystemFriendlyName (Get-StorageSubSystem).FriendlyName -PhysicalDisks $PhysicalDisks -ResiliencySettingNameDefault $Layout -ProvisioningTypeDefault Thin -Verbose
仮想ディスクを作成して、ボリュームを作成します。
$DriveLetter = "E"New-VirtualDisk -FriendlyName $VirtualDiskName -StoragePoolFriendlyName $StragePoolName -Size 465GB -ProvisioningType Thin | Initialize-Disk -PassThru | New-Partition -UseMaximumSize -DriveLetter $DriveLetter | Format-Volume -Confirm:$falseDriveLetter FileSystemLabel FileSystem DriveType HealthStatus OperationalStatus SizeRemaining Size----------- --------------- ---------- --------- ------------ ----------------- ------------- ----E NTFS Fixed Healthy OK 464.73 GB 464.87 GB
PowerShellを使えば、記憶域プールから仮想ディスク、ボリュームの作成まで一気に完了します。
仮想ディスクの削除と、記憶域プールの削除は以下となります。
Get-VirtualDisk -FriendlyName $VirtualDiskName | Remove-VirtualDisk -Confirm:$falseGet-StoragePool -FriendlyName $StragePoolName | Remove-StoragePool -Confirm:$false
RAID10・RAID50の構築は可能か?
RAIDと記憶域プールの解説はここまでとして、今回の本題に移りたいと思います。これまで見てきたように、Windows Server 2019では、「ディスクの管理」からRAID0、1、5の構成が作成できました。記憶域プールでもRAID0、1、5相当の障害対策を踏まえたディスクシステムを構築することが可能となっていました。RAIDではさらにパフォーマンスのアップとディスクの障害対策を万全にするために、RAID10(1+0)、RAID50(5+0)と呼ばれるディスク構成を採用することが可能です。RAID1、RAID5の冗長性とRAID0のパフォーマンスを合わせて、RAID10は物理ディスクを2台1組としてRAID1のペアを作成し、複数台ストライプとして並べたものです。RAID50は3台以上の物理ディスクを一組としてRAID5の構成をペアとして作成し、複数台ストライプとして並べたものです。
RAID10・RAID50
RAID10とRAID50をWindow Serverで実現するためにはどのように構成すべきか考えてみましょう。
記憶域プールで作成した仮想ディスクは、Windows Serverからは1つのディスクとして認識されています。
ディスクとして確認できる仮想ディスク
すでにこの状態で、記憶域プールでMirrorもしくはParityとして仮想ディスクが作成されていれば、これを複数作ってRAID0(ストライプ化)とすることで、RAID10とRAID50を構築可能と考えられます。先にも述べましたが、複数のディスクで構成される記憶域プール内に、複数の仮想ディスクを作成した場合、見た目は冗長性が確保されているように見えますが、実際の障害対策としては不十分となります。RAID10とRAID50を構築する場合でも、物理ディスクごとに記憶域プールをきちんと作り分けて仮想ディスクを作成する必要があります。
従って、RAID10の場合に必要な物理ディスクは最低でも4台、RAID50の場合は6台となります。RAID0にする組み合わせが増えれば増えるほど、パフォーマンスアップが期待できますし、記憶域のレイアウトを3方向のMirrorにした場合などは最低でも10台の物理ディスクが必要となります。
記憶域プールを利用したRAID10・RAID50
RAID10とRAID50のディスクシステムをPowerShellで一気に構築してみましょう。
まずはRAID10から。
$PhysicalDisks = (Get-PhysicalDisk -CanPool $True) | Where {($_.Deviceid -eq 2) -Or ($_.Deviceid -eq 3)}$StragePoolName = "SP01"$VirtualDiskName = "VD01"$Layout = "Mirror"New-StoragePool -FriendlyName $StragePoolName -StorageSubsystemFriendlyName (Get-StorageSubSystem).FriendlyName -PhysicalDisks $PhysicalDisks -ResiliencySettingNameDefault $Layout -ProvisioningTypeDefault Thin -VerboseNew-VirtualDisk -FriendlyName $VirtualDiskName -StoragePoolFriendlyName $StragePoolName -Size 465GB -ProvisioningType Thin | Initialize-Disk -PassThru$DiskNo1 = (Get-Disk -FriendlyName $VirtualDiskName).Number$PhysicalDisks = (Get-PhysicalDisk -CanPool $True) | Where {($_.Deviceid -eq 4) -Or ($_.Deviceid -eq 5)}$StragePoolName = "SP02"$VirtualDiskName = "VD02"$Layout = "Mirror"New-StoragePool -FriendlyName $StragePoolName -StorageSubsystemFriendlyName (Get-StorageSubSystem).FriendlyName -PhysicalDisks $PhysicalDisks -ResiliencySettingNameDefault $Layout -ProvisioningTypeDefault Thin -VerboseNew-VirtualDisk -FriendlyName $VirtualDiskName -StoragePoolFriendlyName $StragePoolName -Size 465GB -ProvisioningType Thin | Initialize-Disk -PassThru$DiskNo2 = (Get-Disk -FriendlyName $VirtualDiskName).Number@"select disk $DiskNo1convert dynamicselect disk $DiskNo2convert dynamiccreate volume stripe disk=$DiskNo1,$DiskNo2format fs=ntfs quickassign letter=E"@ | DiskPart
2つの記憶域プールにMirrorの仮想ディスクをそれぞれ作成しました。
2つの記憶域プールに2つのMirrorを作成
EドライブとしてRAID0を構築しています。
2つの仮想ディスクでRAID0を構成
パフォーマンスも良好です。
RAID10のパフォーマンス
続いてRAID50です。
$PhysicalDisks = (Get-PhysicalDisk -CanPool $True) | Where {($_.Deviceid -eq 6) -Or ($_.Deviceid -eq 7) -Or ($_.Deviceid -eq 8)}$StragePoolName = "SP03"$VirtualDiskName = "VD03"$Layout = "Parity"New-StoragePool -FriendlyName $StragePoolName -StorageSubsystemFriendlyName (Get-StorageSubSystem).FriendlyName -PhysicalDisks $PhysicalDisks -ResiliencySettingNameDefault $Layout -ProvisioningTypeDefault Thin -VerboseNew-VirtualDisk -FriendlyName $VirtualDiskName -StoragePoolFriendlyName $StragePoolName -Size 465GB -ProvisioningType Thin | Initialize-Disk -PassThru$DiskNo1 = (Get-Disk -FriendlyName $VirtualDiskName).Number$PhysicalDisks = (Get-PhysicalDisk -CanPool $True) | Where {($_.Deviceid -eq 9) -Or ($_.Deviceid -eq 10) -Or ($_.Deviceid -eq 11)}$StragePoolName = "SP04"$VirtualDiskName = "VD04"$Layout = "Parity"New-StoragePool -FriendlyName $StragePoolName -StorageSubsystemFriendlyName (Get-StorageSubSystem).FriendlyName -PhysicalDisks $PhysicalDisks -ResiliencySettingNameDefault $Layout -ProvisioningTypeDefault Thin -VerboseNew-VirtualDisk -FriendlyName $VirtualDiskName -StoragePoolFriendlyName $StragePoolName -Size 465GB -ProvisioningType Thin | Initialize-Disk -PassThru$DiskNo2 = (Get-Disk -FriendlyName $VirtualDiskName).Number@"select disk $DiskNo1convert dynamicselect disk $DiskNo2convert dynamiccreate volume stripe disk=$DiskNo1,$DiskNo2format fs=ntfs quickassign letter=F"@ | DiskPart
2つの記憶域プールにParityの仮想ディスクをそれぞれ作成しました。
2つの記憶域プールに2つのParityを作成
FドライブとしてRAID0を構築しています。
2つの仮想ディスクでRAID0を構成
記憶域プールのParityよりもパフォーマンスが向上しています。
RAID50のパフォーマンス
以上、記憶域プールのMirrorとParityの障害対策と、RAID0のパフォーマンスをうまく組み合わせることができました。物理ディスクの台数と障害対策、パフォーマンスを考慮すると、RAID10のバランスが良い結果となっています。RAID50は書き込みの機会が多いバックアップ領域などの利用に適しているようです。RAID0で構成する仮想ディスクの数を増やすことでさらなるパフォーマンスアップも期待できます。さらに、記憶域プールでSimpleの仮想ディスクを作成し、「ディスクの管理」でRAID1やRAID5を構成して、RAID01(0+1)、RAID05(0+5)など逆の構成や障害対策にすぐれたRAID11(1+1)など自由に組み合わせることも可能です。このように、Windows Server 2019では、これまでのソフトウェアRAIDと記憶域プールを組み合わせることで、障害対策にすぐれ、パフォーマンスも向上させることができるディスクシステムを構築することが可能です。PowerShellを使えば簡単に構築可能ですので、利用するハードウェア環境でこれらの構成を試して、最適なディスクシステムを見つけてみましょう。