Afinidad de clústeres

Se aplica a: Windows Server 2022, Windows Server 2019, Windows Server 2016; Azure Stack HCI, versiones 21H2 y 20H2

Un clúster de conmutación por error puede contener muchos roles que pueden moverse entre nodos y ejecutarse. Hay ocasiones en las que determinados roles (es decir, máquinas virtuales, grupos de recursos, etc.) no se deben ejecutar en el mismo nodo. Esto podría deberse al consumo de recursos, el uso de memoria, etc. Por ejemplo, hay dos máquinas virtuales que consumen una cantidad de memoria y CPU considerable y, si se ejecutan en el mismo nodo, una o ambas podrían tener problemas de impacto en el rendimiento. En este artículo se explicarán los niveles de antiafinidad de clúster y cómo se pueden usar.

¿Qué es Affinity y AntiAffinity?

Affinity es una regla que configuraría que establece una relación entre dos o más roles (es decir, máquinas virtuales, grupos de recursos, etc.) para mantenerlos juntos. AntiAffinity es lo mismo, pero se usa para intentar mantener separados los roles especificados. Los clústeres de conmutación por error usan AntiAffinity para sus roles. Más concretamente, el parámetro AntiAffinityClassNames definido en los roles para que no se ejecuten en el mismo nodo.

AntiAffinityClassnames

Al examinar las propiedades de un grupo, el parámetro AntiAffinityClassNames está en blanco como valor predeterminado. En los ejemplos siguientes, Group1 y Group2 deben estar separados para que no se ejecuten en el mismo nodo. Para ver la propiedad, el comando y el resultado de PowerShell serían:

Get-ClusterGroup Group1 | fl AntiAffinityClassNames
    AntiAffinityClassNames : {}

Get-ClusterGroup Group2 | fl AntiAffinityClassNames
    AntiAffinityClassNames : {}

Dado que AntiAffinityClassNames no se define como valor predeterminado, estos roles se pueden ejecutar juntos o de forma independiente. El objetivo es mantenerlos separados. El valor de AntiAffinityClassNames puede ser el que desee que sean, solo tienen que ser iguales. Supongamos que Group1 y Group2 son controladores de dominio que se ejecutan en máquinas virtuales y se servirían mejor si se ejecutaran en distintos nodos. Dado que son controladores de dominio, usaré DC para el nombre de la clase. Para establecer el valor, el comando y los resultados de PowerShell serían:

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

Ahora que se establecen, la agrupación en clústeres de conmutación por error intentará mantenerlos separados.

El parámetro AntiAffinityClassName es un bloqueo "suave". Es decir, intentará mantenerlos separados, pero si no es posible, seguirá permitiendo que se ejecuten en el mismo nodo. Por ejemplo, los grupos se ejecutan en un clúster de conmutación por error de dos nodos. Si un nodo tiene que dejar de funcionar por mantenimiento, significaría que ambos grupos estarían activos y en ejecución en el mismo nodo. En este caso, estaría bien tener esto. Puede que no sea lo más ideal, pero ambas máquinas virtuales se seguirán ejecutando dentro de intervalos de rendimiento aceptables.

Necesito más

Como se mencionó anteriormente, AntiAffinityClassNames es un bloqueo suave. ¿Pero qué ocurre si se necesita un bloqueo duro? Las máquinas virtuales no se pueden ejecutar en el mismo nodo; de lo contrario, se producirá un impacto en el rendimiento que puede hacer que algunos servicios dejen de funcionar.

En esos casos, hay otra propiedad de clúster de ClusterEnforcedAntiAffinity. Este nivel de antiafinidad evitará a toda costa que los mismos valores AntiAffinityClassNames se ejecuten en el mismo nodo.

Para ver la propiedad y el valor, el comando (y el resultado) de PowerShell sería:

Get-Cluster | fl ClusterEnforcedAntiAffinity
    ClusterEnforcedAntiAffinity : 0

El valor "0" significa que está deshabilitado y no se debe aplicar. El valor "1" lo habilita y es el bloqueo duro. Para habilitar este bloqueo duro, el comando (y el resultado) es:

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

Cuando se establezcan ambos, se impedirá que los grupos se conecten juntos. Si se encuentran en el mismo nodo, esto es lo que vería en el Administrador de clústeres de conmutación por error.

Cluster Affinity

En una lista de PowerShell de los grupos, verá lo siguiente:

Get-ClusterGroup

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

Comentarios adicionales

  • Asegúrese de usar la configuración de AntiAffinity adecuada en función de las necesidades.

  • Tenga en cuenta que, en un escenario de dos nodos y ClusterEnforcedAntiAffinity, si un nodo está inactivo, no se ejecutará ninguno de los dos grupos.

  • El uso de propietarios preferidos en los grupos se puede combinar con AntiAffinity en un clúster de tres o más nodos.

  • La configuración de antiAffinityClassNames y ClusterEnforcedAntiAffinity solo se realizará después de un reciclaje de los recursos. Es decir, puede establecerlos, pero si ambos grupos están en línea en el mismo nodo cuando se establecen, seguirán estando en línea.