Exchange 2013 - Server Component State

В Exchange 2013 была анонсирована новая концепция управления состоянием серверов и сервисов Exchange в рамках организации – “Server Component State”. Бывают ситуации, когда нужно вывести сервер из обслуживания, но при этом оставить сервисы на нем в рабочем состоянии. Кроме того, функции Managed Availability (Health Manager) также нужно иметь возможность гибко управлять состоянием компонентов и сервисов на отдельно взятых серверах.

Несмотря на то, что принцип работы механизма ServerComponentState довольно прост, иногда возникают сложности в при его использовании. Далее мы рассмотрим распространённую ситуацию, когда с точки зрения командлета Get-ServerComponentState все компоненты находятся в состоянии Active, а с точки зрения сервиса Exchange (например, транспорта) – нет.

 

Немного теории:

Информация о состоянии компонентов хранится в двух местах:

  • Active Directory – атрибут msExchComponentStates у объекта сервера

 

  • Реестр сервера – ветка HKLM\Software\Microsoft\ExchangeServer\v15\ServerComponentStates

 

Получить текущее состояние компонентов для сервера можно командой:

Get-ServerComponentState -Identity <имя сервера>

Кроме того, есть такое понятие как Requester, грубо говоря, при помощи requester`a мы показываем зачем мы изменили состояние компонента. Есть следующе типы Requester`ов:

  • HealthAPI

  • Maintenance

  • Sidelined

  • Functional

  • Deployment

 

Вот именно с этого момента обычно и начинаются проблемы, дело в том, что Requester`ы являются независимыми и у каждого компонента мо жет быть несколько записей разных Requester `ов, при этом они могут иметь разные значения Active и Inactive одновременно . Приоритет отдается Inactive состояниям!

Пример:

Механизм Managed Availability по какой-то причине отключил компонент Hub Transport, а Вы его включили (например, через Requester Functional). В результате у компонента будет две записи от разных Requester`ов с разным состоянием, и он не окажется активным до тех пор, пока все записи не будут иметь 1 в своем значении.

Ситуация осложняется в том случае, если в момент изменения состояния произошли проблемы с репликацией данных в АД и значения в реестре и в Active Directory расходятся, например, вот так:

В результате администратор считает, что компонент активен, а сама служба транспорт – что нет. В итоге транспорт на этой ноде будет работать не корректно.

 

Резюме

Чтобы быть уверенным, что все компоненты включены, нужно руками проверять данные в реестре и в Active Directory. Облегчить задачу можно при помощи следующего скрипта: 

  • Записываем в переменную состояние компонентов сервера

$component_states = Get-ServerComponentState -Identity <имя сервера>

  • Получаем значение компонентов из реестра

$component_states.localstates

  • Получаем значение компонентов из ActiveDirectory

$component_states.remotestates

Как мы видим, значения различаются. Для того, чтобы исправить проблему в данном случае, нужно перевести компонент HubTransport в состояние Active через Requester HealthAPI ещё раз:

Set-ServerComponentState <имя сервера> -Component HubTransport -State active -Requester HealthAPI

 

Если у вас есть вопросы\предложения\пожелания, добро пожаловать в комменты.

 

Alexey Bogomolov,

CTS Support Escalation Engineer, Microsoft.