Azure共有ディスクを利用したWSFC(LBなし / 分散ネットワーク名)
Windows Server Failover Cluster (WSFC) を作る
検証のために Azure 上で Windows Server Failover Cluster (WSFC) を構築したのですが、
・ロードバランサーがいるんだっけ…いらないんだっけ…
・クラスター作成のオプションってなんだったっけ…
等々を忘れていて手間取りましたので、備忘を兼ねて整理しておきます。
クラスタは以下のような形で、構築します。
- 仮想マシン(b2ms) x2
- OS は Windows Server 2019 以降
- 分散ネットワーク名(VNN)で構築
- 共有ディスクを利用する
- スケールアウトファイルサーバーも構成する
構築時に使用した、ドメイン参加~スケールアウトファイルサーバーの設定を行う Powershell も残してみました。
Azure 上で WSFC を構成する際の LB 要否
Windows Server Failover Cluster (WSFC) の構成パターンとして、仮想ネットワーク名(VNN)を用いる構成と、分散ネットワーク名 (DNN)を用いる構成があります。
Azure 上での構成を前提に、少しまとめてみました。
従来 仮想ネットワーク名 (VNN) + Azure Load Balancer |
Windows Server 2019 以降 分散ネットワーク名 (DNN) |
|
---|---|---|
構成イメージ | ||
クラスタ構築時 既定のうごき |
オンプレミス/他クラウド等で構築した場合はこちらが既定 | Azure 上で構成した場合にはこちらが既定 |
LB要否を指定したい場合 New-Cluster の オプション |
New-Cluster -ManagementPointNetworkType Singleton
|
New-Cluster -ManagementPointNetworkType Distributed
|
従来、仮想ネットワーク名(VNN)と仮想 IP アクセスポイントを設定していました。
しかし、Azure 環境では仮想 IP を利用することはできないという制約があり、Azure 内部ロードバランサー を別途構成する形で、WSFC を実現をする必要がありました。
例えば、 wsfc というクラスター名を作成し IP 10.0.0.100 を設定したい場合、別途 10.0.0.100 の フロントIPアドレスを持たせた ロードバランサーを構成し、そのバックエンドにクラスターノードを配置する構成です。
クライアントからの wsfc 宛の通信は、10.0.0.100 にいったん名前解決されてロードバランサーへ到達し、ロードバランサーはバックエンドであるクラスターノードに対して通信を届ける形です。
しかし、Windows Server 2019 以降であれば、クラスターの作成中に、サーバーは自分自身が Azure 上 で稼働しているかどうかを判断し、自動的に 分散ネットワーク名 (DNN) リソースを使用する構成でクラスターが作成される動作となっています。
こちらは、ロード バランサーを使用しない構成となります。
分散ネットワーク名の場合、クライアントからの wsfc 宛の通信は、直接、クラスターノードのIPアドレスに名前解決され、直接クラスターノードに対して通信されます。
なお、Azure 上 で稼働しているかどうかは以下のように確認できます。
Get-Cluster | fl DetectedCloudPlatform
# 実行結果
# DetectedCloudPlatform : Azure
ちなみに、Windows Server 2019 以降では、Azure 上にクラスターを構成しようとしていることが感知されると、DNN 以外にも有効になる機能があります。
- クラスターノード間 の ハートビート (ネットワーク通信閾値)が自動調整される
- クラスターノードが Azureホストのメンテナンスを検知した際のイベントが追加され、ログ記録やその他アクションを設定することができる
詳細は こちらのブログ(英語) に記載されています。
また、Azure 上でも、これまでのオンプレミス同様構成をしたい場合には、表でも整理した通り、New-Cluster コマンドのオプション -ManagementPointNetworkType `Singleton を指定して構築する形です。
詳しくは サポートチームのブログ で手順が案内がされています。
早速、分散ネットワーク(DNN) で構築してみる
今回構成する環境はこんな感じです。
クラスターの作成自体は DNN で作成できますので、ロードバランサーは不要です。
加えて、クラスター化された役割として スケールアウトファイルサーバー を持たせます。
スケールアウトファイルサーバー は DNN 同様、DNS ラウンドロビンを利用した負荷分散が可能なファイルサーバーであるため、こちらもロードバランサーなしで構成できます。
では早速作っていきます。
なお、仮想ネットワーク と Active Directory の作成は既に済んでいる前提です。
1.仮想マシンを作る
仮想マシンは 2台 用意します。
作成が完了した後は、DNS が AD サーバー宛になるようにしておきます。
Azure Portal から 仮想マシン を作成する
まずは仮想マシンを用意していきます。
共有ディスクをここで作成しても良いのですが、今回はまだ設定していません。
このまま次々とデフォルトのまま進み、作成を完了させます。
仮想マシンは 2台 用意しますので、もう一度繰り返します。
作成が完了した後は、DNS を AD サーバー宛にしておきます。
仮想マシンの [設定] - [ネットワーク] を開き、ネットワークインターフェース のリンク から、仮想マシンに紐づいた NIC を開きます。
DNS サーバー の設定を変更し、ADサーバー のプライベートIPアドレスを入力します。
仮想マシン が起動済みの場合には、いったん再起動させ、設定した DNSサーバー へ名前解決するようにしておきます。
2.マネージドディスクを作成してアタッチする
つづけて、マネージドディスク を 共有ディスク として作成していきます。
作成時に、[共有ディスクを有効にする] にチェックをいれて作成するだけです。
Azure Portal から 共有ディスク を作成してアタッチする
Azure Portal から [ディスク] と検索し、新規作成に進みます。
選んだマネージドディスク SKU により、何台の仮想マシンで共有できるかの最大数が変動します。
以下公開ドキュメントも参考にして、調整します。
今回は一旦、既定値のまま進めてみます。
既定では OFF になっていますが、 [共有ディスクを有効にする] にチェックをいれることで共有ディスクになります。
最大共有数もここで選択します。 他は既定値のまま、作成を完了させます。
共有ディスクの作成が完了したら、仮想マシンのディスクとして追加しておきます。
作成した 仮想マシン 2台 とも、追加しておく必要があります。
作成した仮想マシンを開き、[設定] - [ディスク] - [既存のディスクをアタッチ] と進むと、作成した共有ディスクがプルダウンの選択肢に現れるはずです。
共有ディスクを選択して、設定を保存します。
3.ストレージアカウントを作成して、アクセスキーを確認する
WSFC の クォーラム となる ストレージアカウント も作成しておきます。
作成が完了したら、[セキュリティとネットワーク] - [アクセスキー] の箇所から、ストレージアカウント名 と キー が確認できます。
後ほど WSFC のクォーラムとして構成する際に、こちらの ストレージアカウント名 と キー を利用します。
ストレージアカウントの作成と、ストレージアカウント名 と キー の確認
4.仮想マシンをドメイン参加させる
クラスターノードとなる仮想マシン 2台 とも、Active Directory ドメインに参加させます。
作成した 仮想マシン にログインして GUI から操作を行ってもOKですし、Powershell で行う場合には下記で参加できると思います。
ドメイン名、管理者名、パスワードは、環境にあわせて変更する必要があります。
作成した 仮想マシン 2台 とも、ドメイン参加をさせる必要があります。
# 手順1 ドメイン参加する
# ドメイン名、ユーザー名、パスワードを指定
$domainName = "contoso.local"
$userName = "domainadmin"
$password = ConvertTo-SecureString "password" -AsPlainText -Force
# クレデンシャルオブジェクトを作成
$credential = New-Object System.Management.Automation.PSCredential($userName, $password)
# ドメイン参加を実行
Add-Computer -DomainName $domainName -Credential $credential -Verbose
# コンピュータを再起動(ドメイン参加後に必要)
Restart-Computer
Azure Portal 上での実行例
5.クラスターを構成する
クラスターを構成していきます。
ここからの手順は、仮想マシンどちらか1台で OK です。
以下 Powershell スクリプトを変数など調整して流せば、構成できると思います。
指定した仮想マシンに、フェールオーバー クラスタ リング機能 と スケールアウトファイルサーバー機能をインストールし、クラスター作成、クオーラムの設定、共有ディスクのフォーマットとファイル共有の作成を行うスクリプトです。
こちらの公開ドキュメント を参考に作成しました。
### 各種パラメーターの調整
# クラスターノード名を指定する。 クラスター名を指定する。 SoFS ロール名を指定する。
$nodes = ("wsfc01", "wsfc02")
$clustername = "wsfc"
$sofsrole = "sofsrole"
# ストレージアカウントのアカウント名とアクセスキーを指定する
$parameters = @{
CloudWitness = $true
AccountName = 'アカウント名'
AccessKey = 'アクセスキー'
}
# ディスク番号は手順 6 で確認した番号を指定する。ドライブレターは任意の文字、ディスクラベルは任意の名前を指定する。
$DiskNumber = 2
$DriveLetter = "S"
$DiskLabel = "FileShereDisk"
### 各種パラメーターの調整 - 終わり
### SoFS 構築用スクリプト。手順6-7 のディスクフォーマットを行う箇所注意。
# 手順 2: WSFC Role をインストール
icm $nodes {Install-WindowsFeature Failover-Clustering -IncludeAllSubFeature -IncludeManagementTools}
icm $nodes {Install-WindowsFeature FS-FileServer}
# 手順 3: クラスター構成を検証する
Test-Cluster -Node $nodes
# 手順 4: クラスターを作成する
New-Cluster -Name $clustername -Node $nodes
# 手順 5: クラスターのクオーラムを構成する(クラウド監視)
Set-ClusterQuorum @parameters
# 手順 6: ディスク一覧のうち、ファイルシステム未作成のディスクのみ、テーブル形式で表示する。ディスク番号を確認する。
get-disk | where partitionstyle -eq "RAW" | format-table -AutoSize
# 手順 7: クラスターの共有ボリュームを追加する。
# ディスク番号は手順 6 で確認した番号を指定する。ドライブレターは任意の文字、ディスクラベルは任意の名前を指定する。
# ファイルシステム未作成のディスクを初期化し、GPT パーティションを作成し、ドライブレターを割り当て、ReFS ファイルシステムを作成する。
Get-Disk -Number $DiskNumber | Where-Object PartitionStyle -Eq "RAW" | Initialize-Disk -PartitionStyle GPT -PassThru | New-Partition -DriveLetter $DriveLetter -UseMaximumSize | Format-Volume -FileSystem ReFS -NewFileSystemLabel $DiskLabel -Force -Verbose
# 手順 8: クラスター全ノードで利用可能なディスクをクラスターディスクとして追加する。その後、共有ボリュームを追加する。
Get-ClusterAvailableDisk -All | Add-ClusterDisk
Add-ClusterSharedVolume -Name "Cluster Disk 1"
# 手順 9: SoFS ロールを追加する。新しい共有フォルダを作成する。
Add-ClusterScaleOutFileServerRole -Name $sofsrole -Cluster $clustername
New-Item -Path C:\ClusterStorage\Volume1\Share001 -ItemType Directory
New-SmbShare -Name Share001 -Path C:\ClusterStorage\Volume1\Share001
各手順ごとに実行した例や、ポイントなど記載しておきます。
手順 2: WSFC Role をインストール - 実行例
まずは 仮想マシン2台共に、フェールオーバー クラスタ リング機能をインストールします。
また、スケールアウトファイルサーバー(SoFS)機能のため、ファイル サーバーの機能もインストールします。
今回 wsfc01 、wsfc02 という仮想マシンで構成していますが、必要に応じて $node の箇所を変更してください。
# 手順 2: WSFC Role をインストール
$nodes = ("wsfc01", "wsfc02")
icm $nodes {Install-WindowsFeature Failover-Clustering -IncludeAllSubFeature -IncludeManagementTools}
icm $nodes {Install-WindowsFeature FS-FileServer}
手順 3: クラスター構成を検証する,手順 4: クラスターを作成する - 実行例
クラスター構成の検証と、クラスターの作成を行います。
クラスターの名前などは適宜変更してください。
# 手順 3: クラスター構成を検証する
Test-Cluster -Node $nodes
# 手順 4: クラスターを作成する
New-Cluster -Name "wsfc" -Node $nodes
手順 5: クラスターのクオーラムを構成する(クラウド監視)- 実行例
作成したクラスターのクォーラムを設定します。
クォーラムは、スプリット ブレイン(デュアルマスター)を防ぐための仕組みです。
今回はストレージアカウントを利用したでクラウド監視のパターンで構成しますが、その他のパターン等は こちらに紹介があります。
先ほど確認した ストレージアカウント の アカウント名 と アクセスキー を使用します
# 手順 5: クラスターのクオーラムを構成する(クラウド監視)
$parameters = @{
CloudWitness = $true
AccountName = 'アカウント名'
AccessKey = 'アクセスキー'
}
Set-ClusterQuorum @parameters
手順 6: ディスク一覧確認、手順 7: フォーマットとクラスターの共有ボリューム追加 - 実行例
追加した共有ディスクをフォーマットします。
まずは手順6 で、対象ディスクの番号を確認しておきます。
確認したディスク番号で、手順7 のスクリプトを修正します。
今回の例では、ディスク番号が2 ( $DiskNumber = 2 ) を指定して、フォーマットを行っています。
なお ディスク番号以外にも、必要に応じて、ドライブレター や ディスクラベル を変更します。
# 手順 6: ディスク一覧のうち、ファイルシステム未作成のディスクのみ、テーブル形式で表示する。ディスク番号を確認する。
get-disk | where partitionstyle -eq "RAW" | format-table -AutoSize
# 手順 7: クラスターの共有ボリュームを追加する。
# ディスク番号は手順 6 で確認した番号を指定する。ドライブレターは任意の文字、ディスクラベルは任意の名前を指定する。
# ファイルシステム未作成のディスクを初期化し、GPT パーティションを作成し、ドライブレターを割り当て、ReFS ファイルシステムを作成する。
$DiskNumber = 2
$DriveLetter = "S"
$DiskLabel = "FileShereDisk"
Get-Disk -Number $DiskNumber | Where-Object PartitionStyle -Eq "RAW" | Initialize-Disk -PartitionStyle GPT -PassThru | New-Partition -DriveLetter $DriveLetter -UseMaximumSize | Format-Volume -FileSystem ReFS -NewFileSystemLabel $DiskLabel -Force -Verbose
手順6 確認結果: ディスク番号 2
手順7 フォーマット
手順 8: クラスターディスク追加と共有ボリューム作成。手順 9: SoFS ロールを追加と共有フォルダ作成 - 実行例
フォーマットしたディスクをクラスターディスクとして追加し、共有ボリュームにします。
その後、SoFS のロールを作成し、共有フォルダを作成します。
今回だと SoFS のロールを "sofsrole" という名前で作成しています。
また、作成する共有フォルダは "Share001" です。
\ "SoFS のロール名" \ "共有名" \ でアクセスできますので、\sofsrole\share001\ でアクセスできます。
# 手順 8: クラスター全ノードで利用可能なディスクをクラスターディスクとして追加する。その後、共有ボリュームを追加する。
Get-ClusterAvailableDisk -All | Add-ClusterDisk
Add-ClusterSharedVolume -Name "Cluster Disk 1"
# 手順 9: SoFS ロールを追加する。新しい共有フォルダを作成する。
Add-ClusterScaleOutFileServerRole -Name sofsrole -Cluster "wsfc"
New-Item -Path C:\ClusterStorage\Volume1\Share001 -ItemType Directory
New-SmbShare -Name Share001 -Path C:\ClusterStorage\Volume1\Share001
手順8 実行結果
手順9 実行結果
これで構成が完了しました。
6.動作確認
手順4 の クラスターの構築が、エラー無く完了しました。
手順5以降、クラスターに対しての操作も、特に問題なく成功しています。
また、スケールアウトファイルサーバーとしても、別の仮想マシンから確認してみると、 \sofsrole\share001\ でアクセスできています。
必要に応じて NTFSアクセス権などは調整する必要がありますが、こちらも問題ないようです。
なお、登録した クラスター名(wsfc) や SoFSロール名(sofs) は、たしかに DNSラウンドロビン で、クラスターノード(wsfc01 と wsfc02)のIPを返す形であることも確認できました。
Tips1 :ファイルサーバー と スケールアウトファイルサーバー(SoFS) の使いわけ
今回作成した WSFC に持たせた役割は、スケールアウトファイルサーバーでしたが、通常のファイルサーバーの役割を追加する場合もあります。
以下公開ドキュメントに、比較表があります。
ファイルを開く、ファイルを閉じる、新しいファイルを作成する、既存のファイル名を変更するなどのメタデータ操作がワークロードにより大量に生成される場合には、スケールアウト ファイル サーバーを使用しないでください。
例えば、ユーザープロファイルを配置するファイルサーバーとして利用する場合を考えてみると、ユーザープロファイルを移動ユーザープロファイルで実現する場合には、メタデータの操作が多くなりますので、この場合には、通常のファイルサーバーの構成の方が推奨となります。一方、FSLogix や UPD のように VHD をマウントする方式で、メタデータ操作頻度がすくない場合においては、スケールアウトファイルサーバーの方が適している形になります。
Tips2 : 汎用ファイルサーバー の場合の例
汎用ファイルサーバーの場合には、アクティブ/スタンバイ での構成となります。
共有ディスクはどちらのクラスターノードが占有し、DNSによる負荷分散も行わない形になります。
ロードバランサーを配置して構成してみます。
実行例
ファイルサーバーの役割を追加。
クラスターノードの自身のIPアドレスがいったん設定されるが、使用済みの為、起動できない。
静的IPアドレスとして、ロードバランサーのフロントエンドIPアドレスを指定して起動する。
構成できました。
おまけ GUIでクラスター作成
GUI でクラスター作る方法についてご質問頂いたので、ここに追記。
クラスターを構成する の、手順3-4 の部分です。
GUIでクラスター作成
●手順 3: クラスター構成を検証する
フェールオーバークラスターマネージャーを起動し、構成の検証を実行します。
[名前の入力] の部分で、クラスターとして構成する予定のノードを追加し、次へ を選択します。
その後、次へ次へ、と進んでいくことで、検証結果のレポートが生成されます。
[レポートの表示] が選択できるので、レポートを確認し、エラーがあれば修正します。
●手順 4: クラスターを作成する
クラスター構成の検証が完了したら、クラスターを作成します。
検証終了時に、 [検証されたノードを使用してクラスターを今すぐ構成する] というチェックをオンにしておけば、そのままクラスターの作成に進むこともできます。
クラスター名を入力し、作成すればOKです。
GUIで作成しても、CLIで作成しても、どちらの方法でも、Azure上で作成された場合には分散ネットワーク名で作成されます。
参考
Discussion