Горячее резервирование домена
Назначение
Горячий резервный экземпляр системы, автоматически синхронизирующий настройки домена и находящийся в пассивном ожидании потери связи с экземпляром лидером. Основной инстанс активен, резервный инстанс пассивен. Пользователи и устройства могут подключаться к любому из двух или более инстансов, который в данный момент активен. Все настройки синхронизированы, статистика также синхронизируется.
Концепция
В обоих инстансах существует домен с одним и тем же названием. В настройках каждого из них заданы параметры резервирования с указанием альтернативного инстанса, доступов к нему, а также приоритета.
В случае корректных настроек и активации режима резервирования эти домены на двух инстансах автоматически приходят в состояние Active-Passive. На инстансе, где домен пассивный, деактивируются микросервисы, создающие активность, а также фасады перестают обслуживать запросы по домену.
При корректно настроенной в домене и включенной резервирования выделяются следующие роли для экземпляра домена, а также инстанса при рассмотрении с точки зрения этого домена: * Мастером называется домен с наивысшим приоритетом (наименьшее значение параметра order). * Слейвом называется домен с приоритетом, отличным от наивысшего.
При корректно настроенной в домене и включенной резервирования выделяются следующие состояния для экземпляра домена, а также инстанса при рассмотрении с точки зрения этого домена: * Активным называется домен, который не обнаружил более приоритетных активных альтернатив, и в котором полноценно без ограничений работают сервисы. * Пассивным называется домен, который обнаружил более пририоритетную активную альтернативу, и в котором сервисы деактивируют активности.
Домен, для которого не настроено или выключено резервирование, является изолированным и не считается активным, хотя работает полноценно без ограничений. Выключение резервирования в настройке домена влечет потерю активности. Домен с некорректно настроенным резервированием является изолированным.
При этом в рамках инстанса может быть несколько различных доменов с настроенным и включенным резервированием, находящихся в разных ролях и состояниях.
Пассивный домен не генерирует активностей: не выполняет сценарии, не запускает продуктовые микросервисы, не осуществляет синхронизации с почтовыми каталогами и мессенджерами. Подключиться к пассивному домену может только пользователь с ролью администратора, другие пользователи при попытке создать сессию перенаправляются на веб-серверы инстанса с активным доменом. Регистрация SIP-устройств также невозможна, и запросы перенаправляются на SIP-серверы инстанса с активным доменом.
При этом модель данных пассивного домена доступна для администраторов и системных процессов.
Пассивный домен осуществляет регулярный пинг активного экземпляра и при его потере активируется. Он также производит синхронизацию настроек и модели данных в соответствии с метаданными в настройках резервирования. Синхронизация производится с некоторыми ограничениями - не подлежат синхронизации некоторые настройки, связанные с конкретным инстансом, а также реалтаймовые коллекции. Соответственно при активации текущие активности не продолжаются и не восстанавливаются. Дополнительно может быть настроена фильтрация самих коллекций, сущностей в коллекциях, маскировка полей коллекций, данные из которых подлежат синхронизации. Поддерживается подписка на изменения коллекций, и данные синхронизируются в реальном времени.
Активный домен ведет журнал своей активности. Он применяется для выкачивания истории в привязке к периодам пассивности и недоступности.
Таким образом пользовательские данные и история синхронизированы между мастером и слейвом. Слейв в любой момент готов активироваться и приступить к обслуживанию процессов. При восстановлении мастера сразу или по команде администратора производится перемена состояний доменов.
Настройка
Чтобы активровать режим резервирования необходимо:
-
Убедиться, что две системы представляют собой один и тот же продукт.
-
Убедиться, что в резервной системе существует домен с тем же именем.
-
Установить в конфигурациях обеих систем идентичное значение параметра general.pwd_hash_alg.
-
В каждой из систем в соответствующем домене, подлежащем резервированию, настраивается опция settings.survival_options:
Цветом подсвечены обязательные поля для корректной работы сервиса.
-
enabled - должен быть включен в настройках обоих экземпляров.
-
order - приоритет для определения мастера и слейва. Должен отличаться от значения приоритета в настройке домена на другом инстансе, а также от приоритетов, указанных в списке альтернативых инстансов. Рекомендуется, чтобы значения соответствовали, то есть чтобы указанный в списке альтернатив приоритет совпадал с приоритетом соответствующего другого инстанса, и наоборот.
-
security_key - проверочная строка с произвольным ключом, должна совпадать в настройках обоих экземпляров.
-
token_local - токен канала интеграции в домене текущего экземпляра системы. Используется при синхронизации файлов-вложений.
-
uris_local - URL веб-сервера или нескольких веб-серверов текущего экземпляра системы. Используется при синхронизации файлов-вложений. Примеры: "https://instance1.era-platform.ru:443", "http://192.168.100.1".
-
alternatives - список из одного или более объектов-дескрипторов альтернативных систем из группы синхронизации домена.
-
name - опциональное поле, используется только для логирования упоминаний об описываемом альтернативном экземпляре.
-
order - приоритет для определения мастера и слейва. Должен непротиворечиво соответствовать значению order корневого объекта настройки в соответствующем альтернативном экземпляре системы.
-
uris - URL веб-сервера или нескольких веб-серверов альтернативного экземпляра системы. Используется для http и websocket подключения к веб-серверу альтернативного экземпляра с целью определения доступности и синхронизации данных.
-
token - токен канала интеграции в домене альтернативного экземпляра системы. Используется для авторизации http и websocket подключений к веб-серверу альтернативного экземпляра. Токен должен иметь назначенного пользователя с ролью admin для полноценного доступа к настройкам.
-
ws_redirect_to - опциональное поле. При заполнении корректными URL доступа к альтернативному экземпляру, во время пассивного состояния на эти адреса активного альтернативного экземпляра осуществляется переадресация всех HTTP запросов авторизации от пользователей без роли admin. Примеры: "https://instance2.era-platform.ru:443", "http://192.168.100.1".
-
sg_redirect_to - опциональное поле. При заполнении корректными URL доступа к альтернативному экземпляру, во время пассивного состояния на эти адреса активного альтернативного экземпляра осуществляется переадресация всех HTTP запросов авторизации от пользователей без роли admin. Примеры: "sip:instance2.era-platform.ru:5060", "192.168.100.5:5060", "192.168.100.5".
-
-
activate_delay_sec - опциональное поле, позволяет переопределить значение по умолчанию. Пауза перед активацией пассивного экземпляра после обнаружения пропадания активного альтернативного экземпляра. Во время ожидания производятся попытки обращения к активному экземпляру, и если он обнаруживается, то таймер останавливается. По умолчанию 30 секунд. Уменьшать интервал имеет смысл с целью увеличения периода доступности, но с риском кратковременной активной работы обоих экземпляров. Увеличивать интервал имеет смысл с целью снижения ложных срабатываний при нестабильных каналах и учете операций обновления и перезагрузки.
-
mode - режим поведения мастера в момент старта при наличии активного слейва - ожидать деактивации слейва или перехватывать активность приоритетно.
-
name - опциональное поле, при работе сервиса не используется.
-
sync_settings_mode - режим синхронизации настроек. isolate - не синхронизировать настройки. oneway - синхронизировать настройки только в сторону пассивного слейва. bothway - синхронизировать настройки в сторону пассивного слейва и пассивного мастера. По умолчанию oneway.
-
sync_history_mode - режим синхронизации истории. isolate - не выкачивать историю с другого экземпляра. oneway - выкачивать историю только со слейва на мастер в момент активации мастера без дальнейшей подписки на изменения. bothway - дополнительно подписываться слейвом на изменение истории активного мастера. По умолчанию isolate.
-
custom_sync_metadata - опциональное поле для тонкой настройки режимов синхронизации настроек и истории по конкретным коллекциям. По умолчанию синхронизируются все имеющиеся коллекции с частичным применением фильтров по значениям некоторых полей сущностей. Отдельные коллекции могут быть кастомизированы.
-
default_enabled_settings - значение поля enabled для всех коллекций по умолчанию (при этом режим sync_settings_mode по умолчанию oneway).
-
default_enabled_history - значение поля enabled по умолчанию (при этом режим sync_history_mode по умолчанию isolate).
-
endpoints_of_settings - объект тонкой настройки синхронизации коллекций настроек (коллекции доменного центра и коллекции модели данных типа 'category'). Каждым ключом объекта является рест-эндпойнт конкретной коллекции, а значением - объект тонких настроек синхронизации этой коллекции. Ключи/REST-эндпойнты, не соответствующие указанным типам коллекций игнорируются.
-
enabled - выключатель обработчика синхронизации коллекции.
-
filter - дополнительный фильтр на объекты коллекции, применяется стандартный формат параметра filter REST-запроса чтения коллекции. Система в любом случае применяет фильтры к коллекциям доменного центра на поля ext.source, ext.survival_sync, а для коллекции domain/settings на поле key. Дополнительные фильтры могут лишь усилить их.
-
order - сортировка сущностей при вычитывании данных, применяется стандартный формат параметра order REST-запроса чтения коллекции. По умолчанию применяется сортировка по идентификатору и в некоторых коллекциях доменного центра по ext.ct. Это важно для организации правильной последовательности создания объектов.
-
mask - ограничение на состав полей коллекции, применяется стандартный формат параметра mask REST-запроса чтения коллекции.
-
retries - количество итераций при синхронизации коллекции при возникновении ошибок. Например может использоваться как альтернатива order при работе с наследуемой коллекцией классов.
-
portion_size - нестандартный размер порции при вычитывании данных. По умолчанию 1000, но для сценариев 100. Имеет смысл опираться на средний размер сущности.
-
-
endpoints_of_history - объект тонкой настройки синхронизации коллекций истории (коллекции модели данных типов 'history' и 'transactionlog'). Каждым ключом объекта является рест-эндпойнт конкретной коллекции, а значением - объект тонких настроек синхронизации этой коллекции. Ключи/REST-эндпойнты, не соответствующие указанным типам коллекций игнорируются.
-
enabled - выключатель обработчика синхронизации коллекции.
-
filter - дополнительный фильтр на объекты коллекции, применяется стандартный формат параметра filter REST-запроса чтения коллекции.
-
use_sync - выключатель операции синхронизации, не влияет на изменения по уведомлениям на основании подписки. Может использоваться для коллекций типа transactionlog в KAFKA без Clickhouse, то есть там где чтение данных невозможно, но может иметь смысл подписка на поток событий.
-
portion_size - размер порции при вычитывании данных. По умолчанию 1000, но для сценариев 100. Имеет смысл опираться на средний размер сущности.
-
-
Чтобы исключить из синхронизации определенные объекты коллекций доменного центра (или наоборот включить в синхронизацию для некоторых таких коллекций), можно управлять значением ext.survival_sync каждой конкретной сущности.
Не синхронизируются объекты, создаваемые автоматически, в том числе продуктовым слоем. Это осуществляется через фильтр по полю ext.source (исключаются значения "master", "fixture", "productLayer").
Отладка
Процесс управления резервированием обслуживатеся микросервисом mware. В рамках обслуживания применяются два вида сервисов:
-
survival
- применяет опции, отслеживает состояние альтернативных экземпляров, управляет состоянием локального экземпляра. -
etl
- организует процесс синхронизации данных - потоковую вычитку/вставку, подписку и обновление на основании уведомлений.
Включением для активной ноды mware уровня логирования TRACE или DEBUG, весь процесс слежения и синхронизации попадет в лог-журнал ноды middleware/erl_*.log .
Синхронизация коллекций производится последовательно в одном процессе/потоке и процесс может быть основательно прослежен.
На пассивном экземпляре домен не обслуживается в следующих микросервисах:
-
email - сервис домена полностью выгружается, не происходят обращения к почтовым серверам.
-
im - сервис домена полностью выгружается, не происходят обращения к серверам мессенджеров, а также не обрабатываются хуки.
-
msvc - сервис домена полностью выгружается, продуктовые микросервисы прекращают работу.
-
mware - прекращают работу сервисы домена, инициирующие активности: распределение провайдеров, запуск сценариев по расписанию, обслуживание учетных записей транков без регистрации, callmanager, devicemanager.
-
sg - блокирует определенные начальные запросы REGISTER, INVITE, SUBSCRIBE, PUBLISH. При наличии настройки sg_redirect_to осущестляет ответ с перенаправлением на адреса активного экземпляра.
-
esg - не обслуживает вызовы от аплинков по учетным записям домена, воспринимает их как "неизвестные" и поступает в соответствии с настройками. Либо ответ с отказом, либо игнорирование.
-
b2b - не осуществляет маршрутизацию в домен с помощью кросс-доменных правил. Инициирующие вызовы в домен к нему не поступают из фасадных сервисов.
-
ivr - инициирующие вызовы в домен не поступают ни из b2b, ни из callmanager.
-
conf - инициирующие вызовы в домен не поступают из b2b.
-
svc - некому запускать служебные сценарии в домене в оставшейся действующей части системы.
-
ws - при обращениях к эндпойнту сессий осуществляет отказ. Запрос создания сессии, запрос чтения сессии. При наличии настройки ws_redirect_to добавляет в ответ локацию для перенаправления на адреса активного экземпляра. Разрываются все пользовательские веб-сокет подключения к домену, а также новые подключения при попытке авторизации в домен. При этом статика возвращается нормально, система дает авторизоваться пользователям с ролью 'admin'.
В лог-журналах соответствующих микросервисов фиксируются процедуры вывода домена из обслуживания, а также факты отказов на поступающие запросы.
Важно убедиться, что резервная площадка в состоянии обеспечивать полный сервис при недоступности основной:
|
Особенности и ограничения
-
Для синхронизации у обеих систем должны совпадать: имя домена, значение полей settings.survival_options.security_key, выбранный алгоритм хеширования паролей пользователей (в конфигурации).
-
Настройки синхронизируются при старте системы/микросервиса, а также каждый час после продления подписок. Синхронизация включает предварительную сверку инкремента модификатора в каждой коллекции, и при отсутствии изменений процесс пропускается. При возможном наличии локальных изменений в коллекции на пассивном экземпляре, его данные активному не отправляются, данные активного экземпляра имеют приоритет и восстанавливаются на пассивном в течение часа. При наличии изменений производится сверка чек-сумм каждой сущности в соответствии с фильтрами и масками. Операции создания, модификации и удаления производятся на пассивном экземпляре с сущностями и вложениями.
-
Вложения сущностей настроек синхронизируются полноценной проверкой хеш-сумм от содержимого файлов. Все вложения сценариев, звуковые файлы и пр., также синхронизируются.
-
По умолчанию не синхронизируются каналы интеграции (integration_points). Чтобы канал интеграции синхронизировался, ему необходимо явно установить ext.survival_sync = true. Такие каналы синхронизируются вместе со значениями токенов.
-
Не синхронизируются дочерние домены.
-
Не синхронизируются сущности мастер-домена: конфигурации, правила пограничного фильтра и т.д.
-
При изменении состава классов типа 'category' происходит переинициализация сервиса синхронизации данных с последующим внеочередным стартом синхронизации. При этом переустановка продуктового слоя не влияет на это, поскольку все создаваемые им классы исключаются из процесса синхронизации стандартным статическим фильтром.
-
На момент реализации существуют коллекции, сущности которых могут иметь отсылки к конфигурации. Например 'providers.serveridxs' - имеет отсылки к идентификаторам экземпляров esg в конфигурации, 'sipusers.devices' - имеет отсылки к адресам гейтов из конфигурации. Это является ограничением, и в данный момент требует отказа от синхронизации таких учетных записей, либо выставление для них масок, исключающих эти поля.
-
Для коллекций доменного центра, предполагающих вложения (roleapps, mservices, ivrscripts, svcscripts) - исключить синхронизацию вложений при синхронизации сущности невозможно.
-
История не синхронизируется, а выкачивается в интервалах неактивности. Сверки чек-сумм сущностей не происходит, а только вставка при отсутствии записи с соответствующим идентификатором. Удаления также не происходит, даже если в источнике данные удалены. Решается задача выкачивания накопленных данных за время неактивности, но не их синхронизация. Вместе с каждой записью выкачиваются и сохраняются вложения. Применяется сортировка по полю партиционирования. Вычитка и вставка производится последовательно порциями.
-
Для выкачивания и синхронизации записей разговоров требуется включенный режим сохранения истории диалогов в настройках домена (domain.settings.archive_dialogs_enabled).
-
Если в момент выкачивания сущности истории недоступны вложения, то повторного их выкачивания не производится.
-
Если в маске не указано поле типа 'attachment', то соответствующие вложения не выкачиваются. Аналогично с полями типа 'filelink'.
-
Процесс синхронизации происходит в один поток в одном websocket подключении последовательно. Однако настройки и история синхронизируются раздельно.
-
Чтобы активировать перенос активности обратно на восстановленный мастер экземпляр, ожидающий вывода слейса из активного состояния, можно либо в экземпляре мастера временно выставить режим settings.survival_options.mode=takeover, либо в пассивном временно отключить резервирование settings.survival_opts.enabled=false, либо иным образом временно расцепить связывание в группу резервирования.
-
Не синхронизируется никакая инфраструктурная информация, содержание каталогов на диске (кроме файлов вложений).
-
Не синхронизируются учетные записи пользователей, скопированные автоматически из мастер-домена.
-
Вложения, размещенные в полях типа attachment, при копировании попадают в файловое хранилище, настроенное для использованию в классе экземпляра системы - приемника.
-
Файлы, ссылки на которые размещены в полях типа filelink, при копировании попадают в файловое хранилище системы-приемника, доступное по оригинальному имени (тот же код хранилища и тот же путь).