クラスターのアフィニティ

適用対象: Windows Server 2022、Windows Server 2019、Windows Server 2016、Azure Stack HCI バージョン 21H2 および 20H2

フェールオーバー クラスターは、ノード間を移動して実行できる多数のロールを保持できます。 特定のロール (仮想マシン、リソース グループなど) が同じノードで実行されないことがあります。 これは、リソース消費、メモリ使用量などが原因である可能性があります。 たとえば、メモリと 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

これらの両方が設定されている場合、グループは同時にオンラインになることができなくなります。 これらが同じノード上にある場合は、フェールオーバー クラスター マネージャーに表示されます。

Cluster Affinity

グループの PowerShell リストでは、次の内容が表示されます。

Get-ClusterGroup

Name       State
----       -----
Group1     Offline(Anti-Affinity Conflict)
Group2     Online

その他のコメント

  • 必要に応じて、適切なアンチアフィニティ設定を使用していることを確認します。

  • 2 ノードのシナリオと ClusterEnforcedAntiAffinity では、1 つのノードがダウンした場合、両方のグループが実行されないことに注意してください。

  • グループで優先所有者を使用する場合、3 つ以上のノード クラスターでアンチアフィニティと組み合わせることができます。

  • AntiAffinityClassNames と ClusterEnforcedAntiAffinity の設定は、リソースのリサイクル後にのみ行われます。 つまり、これらを設定することはできますが、両方のグループが設定時に同じノード上でオンラインになっている場合は、両方ともオンラインのままになります。