Отказоусточивость
Определение координатора в кластере
В конфигурации Кластера в параметре coordinators пользователь может перечислить идентификаторы узлов-координаторов. При отказе сервера-координатора, один из работающих серверов кластера автоматически станет координатором.
При запуске кластера(выполнении apply) определение координатора выполняется по полю в конфигурации кластера:
- Если параметр пустой, то кластер сам определяет координатора по текущей схеме. 
- Если параметр заполнен, то кластер пытается сделать координатором один из указанных в массиве узлов, беря их в порядке следования в параметре. Если все не отвечают, то определяем следующего в соответствии с предыдущим пунктом. 
Алгоритм действия узла при получении новой конфигурации кластера:
- Вычислить, кто должен быть координатором по полученной схеме НовыйКоординатор. 
- Если Я-текущийКоординатор == НовыйКоординатор => применить схему как сейчас. 
- Иначе если НовыйКоординатор жив => отправить схему ему, самому ничего не делать. Новый координатор ее сохраняет, обрабатывает и рассылает остальным машинам в кластере. 
- Выполнять предыдущие пункты, пока координатор не будет определен. 
Приоритетность при выборе координатора
При выборе координатора учитываются следующие моменты:
- Если в кеше есть адрес предыдущего координатора, начинаем опрос с него. 
- Если в кеше ничего нет - CS отправляет запрос на получение адреса или идентификатора координатора на первую попавшуюся машину кластера. 
- Если машина доступна, то она сообщает адрес координатора. В этом случае конфигурацию отправляем по полученному адресу и кешируем в памяти адрес, кому последнему отправляли конфигурацию для этого кластера. 
- Если машина недоступна или не ответила до наступления таймаута, то отправляем запрос по очереди на остальные машины. 
- Если ни одна из машин не сообщает координатора, то высылаем информацию на первую, дальше работает алгоритм из предыдущего пункта. 
- Если ни одна из машин не доступна, помещаем в очередь и при попытке отправки повторяем все шаги, перечисленные выше. 
Отказоустойчивость Центра мониторинга
Отказоустойчивость ЦМ реализуется совместно с механизмом отказоустойчивости координатора. ЦМ открывается с сервера, который является координатором. Перенаправление на страницу ЦМ сервера-координатора перенастраивается автоматически на других серверах кластера в течение короткого времени после переезда координатора на другой сервер.
Репликация сервера управления
Настройка репликации Центра Настройки выполняется методом POST/api/scheme/controlcenter Сохранить настройки репликации Центра настройки с конфигурацией:
{
        "$type": "DT.Config.ControlCenterReplication.ControlCenterReplicationSettings, DT_Core",
        "replicationNodes": [
        {
                "$type": "DT.Config.ControlCenterReplication.ControlCenterReplicationNode, DT_Core",
                "order": 1,
                "nodeId": "d28268c6-ab48-4d7a-b5d5-8e0618ec8c3a",
                "runControlCenter": true,
                "usedForReplication": true
        },
{
        "$type": "DT.Config.ControlCenterReplication.ControlCenterReplicationNode, DT_Core",
        "order": 2,
        "nodeId": "7f66dec4-78eb-47fc-9635-9f4ea805d3a1",
        "runControlCenter": true,
        "usedForReplication": true
}
],
"folderId": "33333333-3333-3333-0000-000000000000",
"entityId": "96385274-1111-1111-1234-000000000000",
"clusterId": "00000000-0000-0000-0000-000000000000",
"name": "Настройки репликации Центра настройки",
}
где узел с order=1 - мастер-сервер ЦН добавляется в список автоматически при создании первого узла в схеме, остальные узлы нужно добавить вручную. Настройки репликации сохраняются в файле LocalNodeConfig.json на всех узлах.
Механика репликации
- В конфигурации настраиваются параметры резервного копирования (по умолчанию 1 минута). 
- Менеджер узла отслеживает изменения файлов копий: - если последнее изменении было более минуты назад, то последний файл нужно реплицировать. 
- если последнее изменение менее 1 минуты назад, то реплицируется предпоследний файл. 
 
- При репликации менеджер копирует себе последнюю реплицированную копию в C:\ProgramData\Datareon\Platform\ReplicaBackup. Копирование файла выполняется, только если появился новый бекап конфигурации. В остальных случаях копирование не выполняется. 
- Узел-приемник (узел, который есть в списке репликации) при несовпадении контрольных сумм запрашивает полную копию у источника. При отправке полной реплики она перед отправкой считывается из файла со сжатием, а при получении распаковывается в файл в C:\ProgramData\Datareon\Platform\ReplicaBackup. Аналогично дифф перед отправкой считывается из файла со сжатием, а при получении распаковывается в файл. 
- Если на узел выполняется репликация CS, и он не мастер (не первый в списке репликации), менеджер должен запускать периодическую проверку доступности мастер-CS и всех, кто выше него в списке репликации. Если в течение 15 минут мастер недоступен, менеджер должен определять - он ли следующий должен запускать резервную копию CS. Если он следующий в списке, то: - Если для работы с конфигурацией используется Guard, необходимо дождаться выполнения команды restore вручную. 
- Если работа производится без Guard: - Остановить CS. 
- Заменить файл с базой на резервную копию. 
- Запустить CS вместе с API. Команда DatareonPlatformService.exe restore запускается с правами администратора из папки C:\Program Files(x86)\Datareon\Platform. 
 
 
- Перед тем, как запускать CS, менеджер должен выполнить синхронизацию версий баз конфигураций со всеми машинами, на которых могут быть реплики. Если вдруг у кого-то есть база новее, необходимо сначала выкачать ее себе, затем в зависимости от использования Guard попытаться применить изменения, и в случае успеха - запустить CS и разослать всем информацию об этом. 
Редиректы веб-сервисов
Все используемые порты для публикации веб-сервисов и веб-страниц должны быть уникальны в пределах кластера.
На всех серверах кластера выполняется публикация всех зарегистрированных веб-систем и веб-приложений (UI). Если в кластере несколько серверов, то обслуживание каждого сервиса выполняется только одном из серверов, а на остальных серверах кластера выполняется редирект на рабочий URL.
Перенаправление процессов с перегруженного узла
Перенаправление процессов выравнивает нагрузку на основной узел за счет передачи сообщений на менее загруженные узлы кластера.
| Название параметра | Имя параметра | Default | Min | |
| Максимальное количество в очереди новых для модуля процессов | maxU nprocessedQueueLength | 200 | 10 | |
| % превышения количества в очереди новых для модуля процессов | excessUn processedQueuePercent | 50 | 5 | |
Каждые 20 секунд свободные узлы опрашивают другие узлы на уровень загруженности сервиса процессов. В логах появляются следующие сообщения:
2020-11-12 18:29:15,410 [121] VERBOSE ALL NodeWorkloadCollector - Запрос загрузки очереди сервиса процессов f9a8517a-6dc4-473a-9eb6-35752bc8dfa5 с машины (a833296d-41b6-4a43-8b2d-1a20c174435a, 192.168.101.14:7800) 2020-11-12 18:29:15,430 [121] VERBOSE ALL NodeWorkloadCollector - Получена загрузка очереди сервиса процессов с машины (a833296d-41b6-4a43-8b2d-1a20c174435a, 192.168.101.14:7800) : 0%
Если есть загруженный сервис процессов, то более свободный узел забирает у него часть сообщений и обрабатывает их на своем сервисе процессов, отправляя обратно квитанцию с результатом. Свободный узел забирает себе сообщения только в случае, если:
- Cам свободный узел в этот момент ничего не обрабатывает. 
- На узле есть сервис процессов. 
- Необработанные сообщения не помещены в очередь сервиса процессов загруженного узла. Объем доступной памяти сервиса процессов определяется параметром узла maxUnprocessedQueueLength. Для включения логов по перенаправлению необходимо внести параметры кластера в разделе globalDiagnosticParams: «features»: [«NodeBalancing»].