記憶域スペースダイレクトを用いたHyper-Vクラスターを構築する方法

記憶域スペースダイレクト(Storage Spaces Direct 以下 S2D)を共有領域として利用するHyper-Vクラスターの構築手順。
ここでは構築手順を確立するために全ての要素をHyper-V仮想マシン上で構築する。よって、ネットワーク帯域やディスクなどに関して[S2Dのハードウェア要件](https://docs.microsoft.com/ja-jp/windows-server/storage/storage-spaces/storage-spaces-direct-hardware-requirements)を満たせていない部分がある点に留意すること。

## 検証環境
### ノードサーバー (2台)
クラスターを構成するためのハイパーバイザーサーバー。

* 機種: 第二世代 Hyper-V仮想マシン
* ストレージ: HDD: 300GB x5
* NIC: 1Gpbs NIC x1
* CPU: 16core
* メモリ: 16GB
* OS: WindowsServer2016 **DataCenter** 評価版


### ActiveDirectoryサーバー (1台)
クラスターを管理するためのActiveDirectoryドメインサーバー。

* 機種: 第二世代 Hyper-V仮想マシン
* ストレージ: HDD: 300GB x1
* NIC: 1Gpbs NIC x1
* CPU: 4core
* メモリ: 4GB
* OS: WindowsServer2016 Standard 評価版


### ネットワーク
#### 検証用ネットワーク(192.168.1.0/24)
* ActiveDirectoryサーバー: 192.168.1.20/24
* ノードサーバー1: 192.168.1.31/24
* ノードサーバー2: 192.168.1.32/24
* クラスターIP: 192.168.1.35/24


## サーバーへのOSインストール
以下の点に気を付けてOSをインストールする。

* GUIありでインストールする
* 【ノードサーバーのみ】WindowsUpdateの適用状態をサーバー同士で同じ状態にする
* 【ノードサーバーのみ】S2D用ディスクは全てGPTでフォーマットする
* 時刻同期が正しく行われるようにする


## Nested Hyper-Vの有効化
ノードサーバーはHyper-V仮想マシンであるため、そのままではHyper-Vの機能をインストールできない。
そこで、ノードサーバーに対してNested Hyper-Vを有効にしておく。

```ps1:PowerShell
Set-VMProcessor -VMName <仮想マシン名> -ExposeVirtualizationExtensions $true
```
当たり前だが、実際の物理マシンの場合はこの作業は不要である。


## クラスター管理ドメインの準備
### ActiveDirectoryのインストール
AcriveDirectoryサーバーに対し、サーバーマネージャーから以下の機能をインストールする。インストールの詳細は省略。

* Active Directory ドメイン サービス

![install_ad.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/92f58bf1-63fc-2a4c-6c35-a365ea9d8be3.jpeg)

### ドメインの作成
ドメインコントローラーに昇格してドメインを作成する。ドメイン作成の詳細は省略。

* ドメイン機能レベル: Windows Server 2016
* ドメイン名: s2d.local

![created_domain.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/dc66c4ed-91af-ba4f-a895-3e2a69697950.jpeg)

### ドメインへの参加
ノードサーバーをドメインに参加させる。ドメイン参加手順の詳細は省略。
![joined_nodes.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/e773427a-57c6-a533-b047-cf077ef47344.jpeg)




## クラスターの作成
### クラスター関連機能のインストール
全てのノードサーバーに対し、サーバーマネージャーから以下の機能をインストールする。

* Hyper-V
* フェールオーバークラスタリング

役割・機能のインストール

![choose_hyper-v.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/d323e9b0-74ea-d8ee-462f-0bee20c2b6ff.jpeg)

![choose_msfc.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/abe4aa22-68d9-affb-bc81-4cbaf9c2da15.jpeg)

役割・機能選択後のウィザードは何も変更しない。

![step1_rolefeature.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/036255ed-2e29-58b9-f4ad-7bbbcb4c3a75.jpeg)

![step2_rolefeature.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/4b16b7ba-c5eb-7b97-fa66-1e2f6333e9ec.jpeg)

![step3_rolefeature.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/b54a2041-2d3f-ebaf-506e-148c25b8d52d.jpeg)

![step4_rolefeature.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/506442f2-b83a-d6d9-a30a-a8be6a02b078.jpeg)

インストール完了後はサーバーを再起動すること。


### Hyper-Vクラスターの作成
**1台のノードサーバー上でのみ実施する。**
"フェールオーバークラスターマネージャー"を起動し、"クラスターの作成"を選択する。
![start_clustercreate.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/8321931f-ae1f-8808-b41a-059aca33fbd3.jpeg)

![about_clustercreate.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/11333a4d-5998-ab7e-dda4-ca720ebddc7c.jpeg)

ノードサーバーを全て登録する。
![add_nodes.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/b9128f41-7748-0c66-68c9-da6f6acecbcc.jpeg)

疑似環境であるため検証作業は省略する。
**マイクロソフトサポートを受けるために必要であるため、実機では必ず実施して問題が無いことを確認すること。**
![skip_checks.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/b8ae2912-3c87-d60a-c121-9c53eced4cbf.jpeg)

クラスター名とクラスターの管理IPを入力する。
![config_clusterinfo.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/13c6a3dc-658e-3889-c673-4d2d9ee149d3.jpeg)

クラスターの作成を実施する。"使用可能な記憶域をすべてクラスターに追加する"のチェックは外すこと。
![start_createtask.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/07fcf1f9-2ba6-8215-928b-974542693a1f.jpeg)

![created_createcluster.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/9e9d316f-69c1-2f50-8775-46bf04674981.jpeg)

クラスターが作成され、フェールオーバークラスターマネージャー上に表示される。
![view_cluster.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/a3e382af-822a-969f-bf5f-c4c4468479a4.jpeg)


### クォーラム領域を準備する
AcriveDirectoryサーバー上にてファイル共有を作成し、全てのノードサーバーからアクセス出来るようにする。詳細は省略。
![view_quorum.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/cbd30239-c407-f256-4f53-294c885fea17.jpeg)


### クラスターにクォーラム領域を設定する
**1台のノードサーバー上でのみ実施する。**
"フェールオーバークラスターマネージャー"を起動し、作成したクラスターを右クリックして"他のアクション"→"クラスタークォーラム設定の構成"を選択する。
![choose_quorumdef.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/f8b058f1-e1f7-5acb-9996-fa5d2b727f62.jpeg)

![about_quorum.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/bdb4253d-2dfd-c966-1822-517f199cb1c2.jpeg)

"クォーラム監視を選択する"を選択する。
![choose_quorum.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/f253bfd7-02d1-a46c-73ea-927cf6aba5c6.jpeg)

"ファイル共有監視を構成する"を選択する。
![choos_filequorum.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/b033dda8-c7ea-5819-37e0-d832cda6b9ae.jpeg)

ドメインサーバー上に用意したクォーラム用共有を指定する。
![set_quorumpath.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/c4c4d4bf-077d-fb38-fef8-68dc548f82c1.jpeg)

クォーラム設定を適用する。
![apply_quorum1.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/a4b1b0c8-648d-3c55-4529-1adc38081171.jpeg)

![apply_quorum2.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/78603611-be51-c195-29e0-c73fe94e0650.jpeg)



## S2D設定
### クラスターに対してS2Dプールの作成を行う
**1台のノードサーバー上でのみ実施する。**
PowerShellにて以下のコマンドを実行し、S2Dの有効化及びS2Dストレージプールの作成を行う。
この作業を実施すると、S2Dに使用されたディスクがOS上から見えなくなる。

```ps1:PowerShell
Enable-ClusterStorageSpacesDirect

確認
この操作を実行しますか?
ターゲット 'クラスターの記憶域スペース ダイレクトを有効にします' で操作 's2dcluster-v' を実行しています。
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): Y
警告: 2018/01/11-19:48:38.667 ノード S2D-VNODE2: キャッシュに使用するディスクが見つかりませんでした
警告: 2018/01/11-19:48:38.698 ノード S2D-VNODE1: キャッシュに使用するディスクが見つかりませんでした
警告: 2018/01/11-19:48:38.714 C:\Windows\Cluster\Reports\Enable-ClusterS2D on 2018.01.11-19.48.38.706.htm
```

キャッシュディスクが無いと表示されるが、特に気にする必要はない。
本当にプールができたかどうかを確認したい場合は、以下のコマンドを実行する。

```ps1:PowerShell
Get-StoragePool

FriendlyName        OperationalStatus HealthStatus IsPrimordial IsReadOnly
------------        ----------------- ------------ ------------ ----------
Primordial          OK                Healthy      True         False
S2D on s2dcluster-v OK                Healthy      False        False
Primordial          OK                Healthy      True         False
```

S2Dプール名は自動で "S2D on クラスター名" となる。


### S2Dプール上に仮想ディスクを作成する
**1台のノードサーバー上でのみ実施する。**
PowerShellにて以下のコマンドを実行し、S2Dストレージプール上に仮想ディスクを作成する。
今回はノードサーバーが2台であるため、"双方向ミラー"モードでディスクを作成する。（2ノード環境では双方向ミラーしか構成できない）

```ps1:PowerShell
Get-StoragePool

FriendlyName        OperationalStatus HealthStatus IsPrimordial IsReadOnly
------------        ----------------- ------------ ------------ ----------
Primordial          OK                Healthy      True         False
S2D on s2dcluster-v OK                Healthy      False        False
Primordial          OK                Healthy      True         False

New-Volume -StoragePoolFriendlyName <S2Dプール名> -FriendlyName <仮想ディスク名> -Size <サイズ> -FileSystem ReFS -ResiliencySettingName Mirror -PhysicalDiskRedundancy 1

【例】
New-Volume -StoragePoolFriendlyName "S2D on s2dcluster-v" -FriendlyName "Volume1" -Size 1.1TB -FileSystem ReFS -ResiliencySettingName Mirror -PhysicalDiskRedundancy 1

DriveLetter FileSystemLabel FileSystem DriveType HealthStatus OperationalStatus SizeRemaining   Size
----------- --------------- ---------- --------- ------------ ----------------- -------------   ----
            Volume1         ReFS       Fixed     Healthy      OK                      1.09 TB 1.1 TB
```

#### 備考: 仮想ディスクのサイズについて
仮想ディスクのサイズはモードによって設定可能な最大値が変動する。
今回は300GBのディスク4本を使用したノードを2台使用したため、物理的な容量は約2.4TBとなるが、双方向ミラーでは設定可能な最大値は約1.2TB(50%)となる。
TB/TiB問題もあり、`-Size`オプションで指定可能なサイズは結局1.1TB程度になる。（設定可能な値を超えるとエラーになる。）


### 仮想ディスクをクラスター共有ボリュームに変換する
**1台のノードサーバー上でのみ実施する。**
作成した仮想ディスクはそのままだとクラスターで利用できないため、クラスター共有ボリュームに変換する必要がある。
"フェールオーバークラスターマネージャー"を起動し、クラスターのツリーにある"記憶域"→"ディスク"を開き、作成した仮想ディスクを選択したあと、"クラスターの共有ボリュームへの追加"を押す。

![add_csv.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/cb30a279-68b3-5e3d-7616-1387f1f0805a.jpeg)

ディスクが少しの間オフラインになり、再度オンラインになったあとはクラスター共有ボリュームとして利用可能な状態になっている。

アクセス可能かどうか調べるために、`C:\ClusterStorage`を開き、`Volume1`が存在することを確認する。
![view_csv.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/8781c4a9-59e6-a606-9d65-0e68c28fe38c.jpeg)

なお、この領域は**Hyper-V仮想マシンの配置でのみ利用すべき**であり、**アンチウィルスソフトのチェック対象からも外すべき**領域となる。



これで3レイヤー構成のHyper-Vクラスターと同じように仮想マシンを操作することができるようになる。
フェールオーバー可能な高可用性仮想マシンの作成や、マイグレーション動作に関しては以下のページを参照。
https://qiita.com/SkyLaptor/items/0c1d7845f925f6db1b4c



## 参考
https://docs.microsoft.com/ja-jp/windows-server/storage/storage-spaces/storage-spaces-direct-overview