Affinité de cluster

S’applique à : Windows Server 2022, Windows Server 2019, Windows Server 2016, Azure Stack HCI versions 21H2 et 20H2

Un cluster de basculement peut contenir de nombreux rôles qui peuvent se déplacer d’un nœud à l’autre et s’exécuter. Il arrive que certains rôles (comme les machines virtuelles, les groupes de ressources, etc.) ne s’exécutent pas sur le même nœud. Cela peut être dû à la consommation de ressources, à l’utilisation de la mémoire, etc. Par exemple, prenons deux machines virtuelles qui nécessitent beaucoup de mémoire et de processeur ; si les deux machines virtuelles s’exécutent sur le même nœud, l’une ou les deux machines virtuelles peuvent avoir des problèmes d’impact sur les performances. Cet article explique les niveaux d’antiaffinité de cluster et la façon dont vous pouvez les utiliser.

Qu’est-ce que l’affinité et l’antiaffinité ?

L’affinité est une règle que vous configurez qui établit une relation entre deux rôles ou plus (comme des machines virtuelles, des groupes de ressources, etc.) pour les conserver ensemble. L’antiaffinité est identique, mais sert à essayer de garder les rôles spécifiés séparés les uns des autres. Les clusters de basculement utilisent l’antiaffinité pour ses rôles. Plus précisément, le paramètre AntiAffinityClassNames défini sur les rôles afin qu’ils ne s’exécutent pas sur le même nœud.

AntiAffinityClassnames

Lorsque vous examinez les propriétés d’un groupe, le paramètre AntiAffinityClassNames est vide par défaut. Dans les exemples ci-dessous, Group1 et Group2 devraient être empêchés de s’exécuter sur le même nœud. Pour afficher la propriété, la commande PowerShell et le résultat sont les suivants :

Get-ClusterGroup Group1 | fl AntiAffinityClassNames
    AntiAffinityClassNames : {}

Get-ClusterGroup Group2 | fl AntiAffinityClassNames
    AntiAffinityClassNames : {}

Étant donné que les AntiAffinityClassNames ne sont pas définis comme une valeur par défaut, ces rôles peuvent s’exécuter ensemble ou séparément. L’objectif est de les maintenir séparés. La valeur des AntiAffinityClassNames peut être ce que vous voulez, ils doivent simplement être identiques. Supposons que Group1 et Group2 sont des contrôleurs de domaine s’exécutant sur des machines virtuelles et qu’ils seraient mieux servis en s’exécutant sur différents nœuds. Étant donné qu’il s’agit de contrôleurs de domaine, j’utiliserai DC pour le nom de classe. Pour définir la valeur, la commande PowerShell et les résultats sont les suivants :

$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}

Maintenant qu’ils sont définis, le clustering de basculement tente de les séparer.

Le paramètre AntiAffinityClassName est un blocage « flexible ». Cela signifie qu’il essaiera de les séparer, mais s’il ne le peut pas, il leur permettra toujours de s’exécuter sur le même nœud. Par exemple, les groupes s’exécutent sur un cluster de basculement à deux nœuds. Si un nœud doit être arrêté pour maintenance, cela signifie que les deux groupes sont opérationnels sur le même nœud. Dans ce cas, il serait acceptable d’avoir cette situation. Ce n’est peut-être pas idéal, mais les deux machines virtuelles s’exécutent toujours dans des plages de performances acceptables.

J’ai besoin d’une aide supplémentaire

Comme mentionné précédemment, AntiAffinityClassNames est un blocage flexible. Mais que se passe-t-il si un blocage strict est nécessaire ? Les machines virtuelles ne peuvent pas être exécutées sur le même nœud ; dans le cas contraire, un impact sur les performances se produira et entraînera la défaillance de certains services.

Dans ce cas, il existe une autre propriété de cluster, ClusterEnforcedAntiAffinity. Ce niveau d’antiaffinité empêche à tout prix l’exécution des mêmes valeurs AntiAffinityClassNames sur le même nœud.

Pour afficher la propriété et la valeur, la commande PowerShell (et le résultat) sont les suivants :

Get-Cluster | fl ClusterEnforcedAntiAffinity
    ClusterEnforcedAntiAffinity : 0

La valeur « 0 » signifie qu’elle est désactivée et qu’elle ne doit pas être appliquée. La valeur « 1 » l’active et représente le blocage strict. Pour activer ce blocage strict, la commande (et le résultat) sont les suivants :

(Get-Cluster).ClusterEnforcedAntiAffinity = 1
    ClusterEnforcedAntiAffinity : 1

Lorsque ces deux éléments sont définis, le groupe n’est pas en ligne en même temps. S’ils se trouvent sur le même nœud, voici ce que vous voyez dans le Gestionnaire du cluster de basculement.

Cluster Affinity

Dans une liste PowerShell des groupes, vous voyez ceci :

Get-ClusterGroup

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

Commentaires supplémentaires

  • Assurez-vous d’utiliser le paramètre AntiAffinity approprié en fonction des besoins.

  • Gardez à l’esprit que dans un scénario à deux nœuds et ClusterEnforcedAntiAffinity, si un nœud est en panne, les deux groupes ne s’exécutent pas.

  • L’utilisation de propriétaires préférés sur les groupes peut être combinée avec l’antiaffinité dans un cluster à trois nœuds ou plus.

  • Les paramètres AntiAffinityClassNames et ClusterEnforcedAntiAffinity ne sont définis qu’après un recyclage des ressources. Autrement dit, vous pouvez les définir, mais si les deux groupes sont en ligne sur le même nœud lorsqu’ils sont définis, ils continueront à rester en ligne.