Afinidade de cluster

Aplica-se a: Windows Server 2022, Windows Server 2019, Windows Server 2016, Azure Stack HCI, versões 21H2 e 20H2

Um cluster de failover pode conter várias funções que podem ser movidas entre nós e executadas. Há momentos em que determinadas funções (ou seja, máquinas virtuais, grupos de recursos e assim por diante) não devem ser executadas no mesmo nó. Isso pode ocorrer devido ao consumo de recursos, uso de memória e assim por diante. Por exemplo, há duas máquinas virtuais que fazem uso intensivo de memória e CPU e, se as duas máquinas virtuais estiverem em execução no mesmo nó, uma ou ambas as máquinas virtuais poderão ter problemas no desempenho. Este artigo explicará os níveis de antiafinidade do cluster e como você pode usá-los.

O que é afinidade e antiafinidade?

Afinidade é uma regra que você configura para estabelecer uma relação entre duas ou mais funções (ou seja, máquinas virtuais, grupos de recursos e assim por diante) para mantê-las juntas. Antiafinidade é usada para tentar manter as funções especificadas separadas umas das outras. Os clusters de failover usam antiafinidade para suas funções. Mais especificamente, o parâmetro AntiAffinityClassNames definido nas funções para que elas não sejam executadas no mesmo nó.

AntiAffinityClassnames

Ao examinar as propriedades de um grupo, o parâmetro AntiAffinityClassNames fica em branco como padrão. Nos exemplos abaixo, Group1 e Group2 devem ser separados da execução no mesmo nó. Para exibir a propriedade, o comando e o resultado do PowerShell seriam:

Get-ClusterGroup Group1 | fl AntiAffinityClassNames
    AntiAffinityClassNames : {}

Get-ClusterGroup Group2 | fl AntiAffinityClassNames
    AntiAffinityClassNames : {}

Como AntiAffinityClassNames não é definido como padrão, essas funções podem ser executadas juntas ou separadas. O objetivo é mantê-las separadas. O valor de AntiAffinityClassNames pode ser o que você quiser; ele só precisa ser o mesmo. Digamos que Group1 e Group2 sejam controladores de domínio em execução em máquinas virtuais e que eles seriam melhor atendidos em execução em nós diferentes. Como esses são controladores de domínio, usarei DC para o nome da classe. Para definir o valor, o comando e os resultados do PowerShell seriam:

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

Agora que eles estão definidos, o cluster de failover tentará mantê-los separados.

O parâmetro AntiAffinityClassName é um bloco "flexível". Ou seja, ele tentará mantê-los separados, mas se não puder, ele ainda permitirá que eles sejam executados no mesmo nó. Por exemplo, os grupos estão em execução em um cluster de failover de dois nós. Se um nó precisa ficar inativo para manutenção, isso significa que ambos os grupos estariam em execução no mesmo nó. Nesse caso, não há problema. Pode não ser o ideal, mas ambas as máquinas virtuais ainda serão executadas dentro de intervalos de desempenho aceitáveis.

Preciso de mais ajuda

Conforme mencionado, AntiAffinityClassNames é um bloco flexível. E se um bloco rígido for necessário? As máquinas virtuais não podem ser executadas no mesmo nó; caso contrário, o impacto no desempenho ocorrerá e fará com que alguns serviços possivelmente fiquem inativos.

Para esses casos, há outra propriedade de cluster de ClusterEnforcedAntiAffinity. Esse nível de antiafinidade impedirá, a todo custo, que qualquer um dos mesmos valores AntiAffinityClassNames seja executado no mesmo nó.

Para exibir a propriedade e o valor, o comando (e o resultado) do PowerShell seriam:

Get-Cluster | fl ClusterEnforcedAntiAffinity
    ClusterEnforcedAntiAffinity : 0

O valor "0" significa que ele está desabilitado e não deve ser imposto. O valor "1" habilita-o e é o bloco rígido. Para habilitar esse bloco rígido, o comando (e o resultado) é:

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

Quando ambos estiverem definidos, o grupo será impedido de ficar online juntos. Se eles estiverem no mesmo nó, isso é o que você veria no Gerenciador de Cluster de Failover.

Cluster Affinity

Em uma listagem do PowerShell dos grupos, você verá o seguinte:

Get-ClusterGroup

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

Comentários Adicionais

  • Verifique se você está usando a configuração adequada de antiafinidade, dependendo das necessidades.

  • Tenha em mente que, em um cenário de dois nós e ClusterEnforcedAntiAffinity, se um nó estiver inativo, ambos os grupos não serão executados.

  • O uso de Proprietários Preferenciais em grupos pode ser combinado com a antiafinidade em um cluster de três ou mais nós.

  • As configurações AntiAffinityClassNames e ClusterEnforcedAntiAffinity só ocorrerão após uma reciclagem dos recursos. Ou seja, você pode defini-los, mas se ambos os grupos estiverem online no mesmo nó quando definidos, ambos continuarão online.