群集关联

适用于:Windows Server 2022、Windows Server 2019、Windows Server 2016,Azure Stack HCI 版本 21H2 和 20H2

故障转移群集可以包含可在节点之间移动并运行的许多角色。 有时,某些角色(即虚拟机、资源组等)不应在同一节点上运行。 这可能是由于资源消耗量、内存使用量等造成的。 例如,有两个虚拟机是内存密集型虚拟机和 CPU 密集型虚拟机,如果这两个虚拟机在同一节点上运行,则其中一个或这两个虚拟机的性能会受到影响。 本文将介绍群集反相关性级别及其使用方式。

什么是相关性和反相关性?

相关性是一种规则,你可以设置此规则以在两个或两个以上的角色(即虚拟机、资源组等)之间建立关系,从而将它们放置在一起。 反相关性是一种相同的规则,不同之处在于它用于尝试将指定的角色彼此隔离。 故障转移群集对其角色使用反相关性。 更具体地说,在角色上定义了 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 参数是一个“软”块。 这意味着,它将尝试将这些角色分开,但如果不能做到,它仍会允许它们在同一节点上运行。 例如,这些组在双节点故障转移群集上运行。 如果需要关闭一个节点以进行维护,这意味着两个组都将在同一节点上启动并运行。 在这种情况下,这是可行的。 这可能不是最理想的情况,但两个虚拟机仍将在可接受的性能范围内运行。

需要更多功能

如前所述,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

其他注释

  • 确保根据需求使用适当的反相关性设置。

  • 请记住,在双节点方案中,使用 ClusterEnforcedAntiAffinity 时,如果一个节点关闭,则两个组都不会运行。

  • 在三个或更多节点群集中,可以将组上的首选所有者与反相关性结合使用。

  • 仅在回收资源后才会执行 AntiAffinityClassNames 和 ClusterEnforcedAntiAffinity 设置。 也就是说,可以设置它们,但如果两个组在设置时位于同一节点上,则它们将继续保持联机状态。