Сходство кластеров

Область применения: Windows Server 2022, Windows Server 2019, Windows Server 2016, Azure Stack HCI, версии 21H2 и 20H2

Отказоустойчивый кластер может содержать множество ролей, которые могут перемещаться между узлами и выполняться. Существует время, когда определенные роли (то есть виртуальные машины, группы ресурсов и т. д.) не должны выполняться на одном узле. Это может быть связано с потреблением ресурсов, использованием памяти и т. д. Например, есть две виртуальные машины, которые являются большим объемом памяти и ЦП, и если две виртуальные машины работают на одном узле, одна или обе виртуальные машины могут повлиять на производительность. В этой статье описаны уровни защиты кластера и способы их использования.

Что такое affinity и AntiAffinity?

Сходство — это правило, которое устанавливает связь между двумя или более ролями (т. е. виртуальными машинами, группами ресурсов и т. д.), чтобы сохранить их вместе. AntiAffinity совпадает с тем же, но используется для того, чтобы попытаться сохранить указанные роли отдельно друг от друга. Отказоустойчивые кластеры используют AntiAffinity для своих ролей. В частности, параметр AntiAffinityClassNames, определенный для ролей, поэтому они не выполняются на одном узле.

AntiAffinityClassnames

При просмотре свойств группы параметр AntiAffinityClassNames пустой в качестве значения по умолчанию. В приведенных ниже примерах группу 1 и группу 2 следует отделять от запуска на одном узле. Чтобы просмотреть свойство, будет выполнена команда PowerShell и результат:

Get-ClusterGroup Group1 | fl AntiAffinityClassNames
    AntiAffinityClassNames : {}

Get-ClusterGroup Group2 | fl AntiAffinityClassNames
    AntiAffinityClassNames : {}

Так как AntiAffinityClassNames не определен как значение по умолчанию, эти роли могут выполняться вместе или отключать. Цель состоит в том, чтобы держать их разделены. Значение для AntiAffinityClassNames может быть любым, что вы хотите, чтобы они были, они просто должны быть одинаковыми. Предположим, что group1 и Group2 являются контроллерами домена, работающими на виртуальных машинах, и они лучше всего обслуживаться на разных узлах. Так как это контроллеры домена, я буду использовать контроллер домена для имени класса. Чтобы задать значение, команда 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 является блоком soft. Это означает, что он попытается сохранить их друг от друга, но если он не может, он по-прежнему позволит им работать на одном узле. Например, группы выполняются в отказоустойчивом кластере с двумя узлами. Если один узел должен перейти к обслуживанию, это означает, что обе группы будут работать и работать на одном узле. В этом случае это было бы нормально. Это может быть не самый идеальный вариант, но обе виртуальные машины по-прежнему будут работать в допустимых диапазонах производительности.

Мне нужно больше

Как упоминание, 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

Дополнительные комментарии

  • Убедитесь, что вы используете правильный параметр AntiAffinity в зависимости от потребностей.

  • Помните, что в сценарии с двумя узлами и ClusterEnforcedAntiAffinity, если один узел отключен, обе группы не будут выполняться.

  • Использование предпочитаемых владельцев в группах можно объединить с AntiAffinity в трех или более кластерах узлов.

  • Параметры AntiAffinityClassNames и ClusterEnforcedAntiAffinity будут выполняться только после повторного использования ресурсов. То есть можно задать их, но если обе группы находятся в сети на одном узле при установке, они будут продолжать оставаться в сети.