Поделиться через


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

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

Что такое аффинити и антиаффинити?

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

AntiAffinityClassnames

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

Get-ClusterGroup Group1 | fl AntiAffinityClassNames
    AntiAffinityClassNames : {}

Get-ClusterGroup Group2 | fl AntiAffinityClassNames
    AntiAffinityClassNames : {}

Так как AntiAffinityClassNames не определены как значение по умолчанию, эти роли могут выполняться вместе или отдельно. Цель состоит в том, чтобы держать их разделены. Значения для AntiAffinityClassNames могут быть любыми, какими вы хотите, они просто должны быть одинаковыми. Предположим, что Группа1 и Группа2 являются контроллерами домена, работающими на виртуальных машинах, и им будет лучше работать на разных узлах. Поскольку это контроллеры домена, я буду использовать "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

Если оба параметра установлены, группе будет запрещено выходить в сеть одновременно. Если они находятся на одном узле, это то, что вы увидите в Failover Cluster Manager.

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

В списке групп PowerShell вы увидите следующее:

Get-ClusterGroup

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

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

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

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

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

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