クラスターのアフィニティ
フェールオーバー クラスターは、ノード間を移動して実行できる多数のロールを保持できます。 特定のロール (仮想マシン、リソース グループなど) が同じノードで実行されないことがあります。 これは、リソース消費、メモリ使用量などが原因である可能性があります。 たとえば、メモリと CPU を集中的に使用する 2 つの仮想マシンがあり、2 つの仮想マシンが同じノードで実行されている場合、一方または両方の仮想マシンがパフォーマンスに影響を与える可能性があります。 この記事では、クラスターのアンチアフィニティ レベルとその使用方法について説明します。
アフィニティおよびアンチアフィニティとは
アフィニティは、2 つ以上のロール (仮想マシン、リソース グループなど) の間にリレーションシップを確立してそれらを一緒に保つために設定するルールです。 アンチアフィニティは同じですが、指定されたロールを相互に分離するために使用されます。 フェールオーバー クラスターは、そのロールにアンチアフィニティを使用します。 具体的には、ロールに定義されている AntiAffinityClassNames パラメーターによって、同じノードで実行されないようにします。
AntiAffinityClassnames
グループのプロパティを見ると、パラメーター AntiAffinityClassNames は既定値で空白になっています。 次の例では、Group1 と Group2 を同じノードで実行することから分離させる必要があります。 プロパティを表示する場合、PowerShell コマンドと結果は次のようになります。
Get-ClusterGroup Group1 | fl AntiAffinityClassNames
AntiAffinityClassNames : {}
Get-ClusterGroup Group2 | fl AntiAffinityClassNames
AntiAffinityClassNames : {}
AntiAffinityClassNames は既定値として定義されていないため、これらのロールは一緒に実行することも、別々に実行することもできます。 それらを切り離しておくことが目標です。 AntiAffinityClassNames の値は任意の値にすることができますが、同じである必要があります。 たとえば、Group1 と Group2 は仮想マシンで実行されるドメイン コントローラーであり、それぞれ異なるノードで実行されるのが最適であるとします。 これらはドメイン コントローラーなので、クラス名には DC を使用します。 値を設定する場合、PowerShell コマンドと結果は次のようになります。
$AntiAffinity = New-Object System.Collections.Specialized.StringCollection
$AntiAffinity.Add("DC")
(Get-ClusterGroup -Name "Group1").AntiAffinityClassNames = $AntiAffinity
(Get-ClusterGroup -Name "Group2").AntiAffinityClassNames = $AntiAffinity
$AntiAffinity = New-Object System.Collections.Specialized.StringCollection
$AntiAffinity.Add("DC")
(Get-ClusterGroup -Name "Group1").AntiAffinityClassNames = $AntiAffinity
(Get-ClusterGroup -Name "Group2").AntiAffinityClassNames = $AntiAffinity
Get-ClusterGroup "Group1" | fl AntiAffinityClassNames
AntiAffinityClassNames : {DC}
Get-ClusterGroup "Group2" | fl AntiAffinityClassNames
AntiAffinityClassNames : {DC}
これらの設定が完了すると、フェールオーバー クラスタリングはそれらを分離しようとします。
AntiAffinityClassName パラメーターは "ソフトな" ブロックです。 つまり、それらを分離しようとしますが、できない場合でも、同じノードでの実行を許可します。 たとえば、グループが 2 ノードのフェールオーバー クラスターで実行されているとします。 メンテナンスのために 1 つのノードをダウンさせる必要がある場合は、両方のグループが同じノードで稼働していることを意味します。 この場合は、同じノード上で実行させても問題ありません。 これは最適な方法ではありませんが、どちらの仮想マシンも許容可能なパフォーマンス範囲内で実行されます。
さらに必要な場合
前述したとおり、AntiAffinityClassNames はソフトブロックです。 しかし、ハードブロックが必要な場合はどうなるでしょうか。 仮想マシンを同じノードで実行することはできません。同じノードで実行させると、パフォーマンスに影響が生じ、一部のサービスがダウンする可能性があります。
このような場合は、ClusterEnforcedAntiAffinity の別のクラスター プロパティがあります。 このアンチアフィニティ レベルにより、同じノードで同じ AntiAffinityClassNames 値が何があっても実行されないようにします。
プロパティと値を表示する場合、PowerShell コマンド (および結果) は次のようになります。
Get-Cluster | fl ClusterEnforcedAntiAffinity
ClusterEnforcedAntiAffinity : 0
"0" の値は、無効になっていて適用されないことを意味します。 "1" の値を指定すると有効になり、ハードブロックになります。 このハードブロックを有効にする場合、コマンド (および結果) は次のようになります。
(Get-Cluster).ClusterEnforcedAntiAffinity = 1
ClusterEnforcedAntiAffinity : 1
これらの両方が設定されている場合、グループは同時にオンラインになることができなくなります。 これらが同じノード上にある場合は、フェールオーバー クラスター マネージャーに表示されます。
グループの PowerShell リストでは、次の内容が表示されます。
Get-ClusterGroup
Name State
---- -----
Group1 Offline(Anti-Affinity Conflict)
Group2 Online
その他のコメント
必要に応じて、適切なアンチアフィニティ設定を使用していることを確認します。
2 ノードのシナリオと ClusterEnforcedAntiAffinity では、1 つのノードがダウンした場合、両方のグループが実行されないことに注意してください。
グループで優先所有者を使用する場合、3 つ以上のノード クラスターでアンチアフィニティと組み合わせることができます。
AntiAffinityClassNames と ClusterEnforcedAntiAffinity の設定は、リソースのリサイクル後にのみ行われます。 つまり、これらを設定することはできますが、両方のグループが設定時に同じノード上でオンラインになっている場合は、両方ともオンラインのままになります。