Понятия
OS X v10.4 обеспечивает новый механизм обработки отказа, составленный из двух узлов – главного узла и резервного узла – формирование пары обработки отказа.
Соблюдающие правила управляют, может ли узел быть сконфигурирован как ведущее устройство или как резервное копирование:
Главные и резервные узлы должны находиться в той же частной сети FireWire.
Главные и резервные узлы не могут выполнить конфликтную службу, такой как являющийся Открыть ведущим устройством Directory или копией.
И ведущее устройство и резервный узел должны быть перечислены в доступном сервере DNS.
Коммуникация внутриузла между процессами, работающими на главных и резервных узлах, выполняется через NSDistributedNotificationCenter. Стороннее программное обеспечение может использовать NSDistributedNotificationCenter для получения уведомления об изменениях, таких как изменение конфигурации или событие обработки отказа. Коммуникация межузла выполняется через пользовательский, собственный протокол, которым управляет кластерный демон (clusterd).
Архитектура обработки отказа
Рисунок 1-1 показывает типичный аппаратный сценарий, в котором используется новый механизм обработки отказа.

На рисунке 1-1 FireWire соединяет два узла кластера Xserve G5 и формирует частную, сеть FireWire. Оба узла кластера Xserve G5 подключены к устройству RAID Xserve через переключатель Fibre Channel. Каждый узел имеет общедоступное имя и IP-адрес, определенный в DNS. На рисунке 1-1 общедоступный адрес 192.0.34.164 присваивается в DNS master.example.com, и общедоступный адрес 192.0.34.165 присваивается backup.example.com. В дополнение к общедоступным адресам, частные адреса (10.13.0.4 и 10.13.0.5, соответственно), также присваиваются каждому узлу. Общедоступный адрес 192.0.34.166 также присваивается в DNS homedirs.example.com, но постоянно не присваивается определенному компьютеру. Этот тип присвоения иногда вызывают виртуальным IP-адресом.
Рисунок 1-2 показывает взаимодействие компонентов обработки отказа, установленных на ведущем устройстве и резервном узле.

На главном узле, launchd демон запускает и контролирует демона диспетчера серверов (servermgrd) и кластерный демон (clusterd). Администраторы обеспечивают ввод конфигурации для servermgrd через Приложение администрирования Сервера.
servermgr_clusterd модуль servermgrd чтения и записи clusterd настройки и также отправляют кластерные события, такие как обновление, обработка отказа, и оконечный, к clusterd демон.
servermgr_afp модуль servermgrd чтения и записи настройки AFP. Изменение в настройках AFP заставляет уведомление быть отправленным NSDistributedNotificationCenter. clusterd демон зарегистрировался в NSDistributedNotificationCenter для получения уведомления об изменениях настроек AFP, таким образом, это получает уведомление, когда изменяется установка AFP.
clusterd демон на главном узле связывается с clusterd демон на резервном узле с помощью IP по специализированной, безопасной ссылке FireWire.
Для этого выпуска, servermgrd у демона также есть a servermgr_nfs модуль и a servermgr_smb модуль, которые выполняют те же функции как servermgr_afp модуль.
Взаимодействия резервного узла подобны главному узлу. Однако определенные операции администрирования сервера, такие как изменение настроек файловой службы, не позволяются.
Сообщения обработки отказа
Главные и резервные узлы обмениваются сообщениями, которые являются фактически plists. Сообщения включают использование двух типов записи узла:
Общедоступная запись узла — общедоступная запись узла представляет публично доступный IPv4 или адресную информацию IPv6, полученную из сервера DNS. Когда ведущее устройство перестало работать, адрес IPv4 или IPv6 общедоступного узла присвоен ведущему устройству и предположен резервным копированием. Эта запись узла или ее IP-адреса являются виртуальными IP-адресами.
Кластерная запись узла — кластерная запись узла представляет один из компьютеров в паре обработки отказа. Одна или более общедоступных записей узла, в настоящее время связываются с кластерным узлом размещая его.
Для этого выпуска единственная коллега может быть идентифицирована путем запросов общедоступного узла.
Сообщение |
Функция |
|---|---|
|
Это запросы сообщения список общедоступных узлов цель контролирует, а также список цели частных адресов. Ответ ожидается. Для получения дополнительной информации об этой команде посмотрите Команду Конфигурации. |
|
Это сообщение отправляется узлом, бросающим общедоступный узел к резервному узлу. В случае ручной обработки отказа в сети, показанной на рисунке 1-1, ведущее устройство (master.example.com) выпускает контролируемый общедоступный узел homedirs.example.com к резервному копированию (backup.example.com). Когда переход завершен, у ведущего устройства все еще есть его собственный общедоступный узел (master.example.com), но другой общедоступный узел (homedirs.example.com) размещается на резервном копировании (backup.example.com). |
|
Это сообщение уведомляет |
Любая из команд, перечисленных в Таблице 1-1, может сопровождаться любым из стандартных атрибутов, перечисленных в Таблице 1-2.
Сообщение |
Функция |
|---|---|
|
Уведомление описания содержимого пакета или запрошенные данные. Этот атрибут появляется в уведомлениях и может появиться в ответах. |
|
Список ошибок сгенерирован в результате соответствующего запроса. Этот атрибут только появляется в ответах. |
|
Кластер plist число версии формата. Это может появиться в любом сообщении. |
Команда конфигурации
configuration команда является первой командой, отправленной резервным узлом. Это запрашивает общедоступные узлы интереса определить текущего владельца. Вот пример запроса backup.example.com, отправил бы к homedirs.example.com:
<?xml version-”1.0” encoding=”UTF-8”?> |
<!DOCTYPE plist PUBLIC “-//Apple Computer//DTD PLIST 1.0//EN” “http://www.applecom/ DTDs/PropertyList-1.0.dtd”> |
<plist version=”1.0”> |
<dict> |
<key>command</key> |
<string>configuration</string> |
<key>version</key> |
<integer>1</integer> |
</dict> |
</plist> |
Ответ конфигурации
Ответ на a configuration команда является словарем, содержащим идентификацию информации, включая UUID (допустимый для жизни процесса), список частных имен и адресов и список размещенных общедоступных узлов. Вот пример ответа от homedirs.example.com (в настоящее время размещен на master.example.com) к запросу от backup.example.com:
<?xml version-”1.0” encoding=”UTF-8”?> |
<!DOCTYPE plist PUBLIC “-//Apple Computer//DTD PLIST 1.0//EN” “http://www.applecom/ DTDs/PropertyList-1.0.dtd”> |
<plist version=”1.0”> |
<dict> |
<key>command</key> |
<string>configuration</string> |
<key>data</key> |
<dict> |
<key>_id_</key> |
<string>E773FBDD-5CFE-4CF0-9F4C-10B6604064D7</string> |
<key>addresses</key> |
<array> |
<string>10.13.0.5</string> |
</array> |
<key>names</key> |
<array> |
<string>master</string> |
<key>publicNodes</key> |
<dict> |
<key>homedirs</key> |
<array> |
<string>192.0.34.166</string> |
</array> |
<key>master.example.com</key> |
<array> |
<string>192.0.34.164</string> |
</array> |
</dict> |
</dict> |
<key>errorCodes</key> |
</array> |
<key>version</key> |
<integer>1</integer> |
</dict> |
</plist> |
В примере выше,
E773FBDD-5CFE-4CF0-9F4C-10B6604064D7допустимое UUID для жизниclusterdпроцесс. Это используется для быстрой идентификации узла.addressesключ всегда указывает по крайней мере один допустимый адрес, который является частным IP-адресом цели, контролирующейся, который, в этом случае10.13.0.5.namesключ, как гарантируют, будет содержать наименьшее количество одного значения, узел Добрый день называют. В этом примере,master.localДобрый день имя, соответствующее 10.13.0.5.publicNodesключ является словарем вместо массива, потому что каждый узел может иметь всего одно имя DNS и многократные IP-адреса. В этом примере homedirs.example.com является именем DNS узла, который контролирует цель.192.0.34.166IP-адрес для homedirs.example.com.
Уведомления
Демон диспетчера серверов (servermgrd) сообщения сообщений с помощью механизма NSDistributedNotificationCenter. Кластерный демон (clusterd) регистры для уведомлений, отправленных servermgrd и использует их для инициирования действий синхронизации. Стороннее программное обеспечение может зарегистрироваться для получения уведомления о сообщениях. Для получения дополнительной информации посмотрите NSDistributedNotificationCenter.
Обмен сообщениями обработки отказа использует два типа уведомления:
com.apple.ServiceConfigurationChangedNotificationcom.apple.ServiceStatusChangedNotification
Конфигурация измененное уведомление
Это уведомление отправляется когда изменения конфигурации службы. Связанный словарь указывает имя службы. Например, вот измененное уведомление конфигурации для AFP:
<dict> |
<key>ServiceName</key> |
<string>afp</string> |
</dict> |
Для этого выпуска, возможных значений для ServiceName :
afpnfssmbsharepoints
sharepoints значение не является фактически службой, но используется для уведомления заинтересованных сторон изменения в наборе sharepoints.
Состояние службы измененное уведомление
Когда служба останавливается или запускается, это уведомление отправляется. Связанный словарь указывает имя службы и ее нового состояния. Например, вот измененное уведомление состояния службы для AFP:
<dict> |
<key>ServiceName</key> |
<string>afp</string> |
<key>State</key> |
<string>RUNNING</string |
</dict> |
Для этого выпуска, возможных значений для ServiceName :
afpnfssmb
Возможные значения для state :
RUNNINGSTOPPEDSTARTEDSTOPPINGUNKNOWN
Определения
Заголовочный файл /usr/include/NSFailoverEvents.h содержит следующие определения обмена сообщениями обработки отказа для использования сторонними приложениями, хотящими получить уведомления. Это содержит определения для символьных имен для уведомлений и ключей и оценивает за словари, включенные в уведомления.
#define NSFailoverServiceStatusChanged @"com.apple.ServiceStatusChangedNotification" |
#define NSFailoverServiceConfigurationChanged @"com.apple.ServiceConfigurationChangedNotification" |
#define NSFailoverServiceNameKey @"ServiceName" |
#define NSFailoverServiceStateKey @"State" |
#define NSFailoverServiceStateRunning @"RUNNING" |
// Any value other than NSFailoverServiceStateRunning means "not running". |
#define NSFailoverServiceStateStopped @"STOPPED" |
#define NSFailoverServiceStateStarting @"STARTING" |
#define NSFailoverServiceStateStopping @"STOPPING" |
#define NSFailoverServiceStateUnkonwn @"UNKNOWN" |
#define NSFailoverServiceNameAFP @"afp" |
#define NSFailoverServiceNameSMB @"smb" |
#define NSFailoverServiceNameNFS @"nfs" |
#define NSFailoverServiceNameWeb @"web" |
#define NSFailoverServiceNameMail @"mail" |
// NSFailoverServiceNameSharepoints is a virtual service that reflects the |
// set of file service sharepoints |
#define NSFailoverServiceNameSharepoints@"sharepoints" |
#define NSFailoverPathToScriptsDir @"/Library/Failover" |
#define NSFailoverPathToDefaultScriptsDir@"/Library/Failover/Default Scripts" |