Сходство кластеров
Отказоустойчивый кластер может содержать множество ролей, которые могут перемещаться между узлами и выполняться. Существует время, когда определенные роли (то есть виртуальные машины, группы ресурсов и т. д.) не должны выполняться на одном узле. Это может быть связано с потреблением ресурсов, использованием памяти и т. д. Например, есть две виртуальные машины, которые являются большим объемом памяти и ЦП, и если две виртуальные машины работают на одном узле, одна или обе виртуальные машины могут повлиять на производительность. В этой статье описаны уровни защиты кластера и способы их использования.
Что такое 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
Если оба из них заданы, группа будет запрещена в сети. Если они находятся на одном узле, это то, что вы увидите в диспетчере отказоустойчивости кластеров.
В списке групп PowerShell вы увидите следующее:
Get-ClusterGroup
Name State
---- -----
Group1 Offline(Anti-Affinity Conflict)
Group2 Online
Дополнительные комментарии
Убедитесь, что вы используете правильный параметр AntiAffinity в зависимости от потребностей.
Помните, что в сценарии с двумя узлами и ClusterEnforcedAntiAffinity, если один узел отключен, обе группы не будут выполняться.
Использование предпочитаемых владельцев в группах можно объединить с AntiAffinity в трех или более кластерах узлов.
Параметры AntiAffinityClassNames и ClusterEnforcedAntiAffinity будут выполняться только после повторного использования ресурсов. То есть можно задать их, но если обе группы находятся в сети на одном узле при установке, они будут продолжать оставаться в сети.