Модуль горячего восстановления

Модуль горячего восстановления предназначен для восстановления данных очередей в случае выхода из строя одного из серверов, на котором установлена Платформа. Для выполнения функций модуля горячего восстановления Платформа должна быть развернута в кластере, содержащем более одного сервера. Если при использовании кластера один из серверов откажет в момент, когда на нем будут присутствовать сообщения, то реплики сообщений будут отправлены из резервных очередей на другие серверы. Таким образом процесс обмена с этими данными очередей не будет прерван.

Внимание

При выходе из строя одного сервера кластера в актуальном релизе гарантируется сохранность данных очередей. При последовательном выходе из строя второго сервера кластера после запуска процесса восстановления предыдущего сервера и до завершения процесса сохранность данных не гарантируется.

В актуальном релизе ранее восстановленные сообщения не реплицируются.

Принцип работы

При включении модуля горячего восстановления на серверах создаются резервные очереди, в которые будут реплицироваться сообщения при обмене данными. Количество серверов, на которые будут реплицироваться сообщения, настраивается параметром faultTolerance. Резервные очереди могут быть созданы на любом из включенных в состав кластера сервере, при этом такой сервер продолжает выполнять назначенные ему функции работы с мастер-данными.

При выходе из строя одного из серверов, указанных в настройках конфигурации кластера, копии сообщений из резервных очередей будут переданы в обработку Платформой.

Репликация настраивается на уровне сервера, а не очереди: определяется порядок репликации очередей между серверами.

Настройка

Включение и настройка модуля горячего восстановления осуществляется в конфигурации кластера:

../_images/hot_recovery1.png

Параметры для модуля горячего восстановления находятся в поле hotRecoverySettingsGlobal:

  • Параметр FaultTolerance: количество реплик для каждой из очередей. Значение должно быть меньше количества рабочих серверов кластера. В случае выхода из строя серверов, значение будет быть понижено системой автоматически, если количества рабочих серверов недостаточно для выполнения указанного количество реплик. Может принимать значения от 0 (модуль горячего восстановления выключен) до любого значения, которое будет меньше количества серверов в кластере.

  • Параметр nodes: указываются серверы, сообщения которых будут реплицироваться, и серверы, которые будут выступать в роли резервных.

  • Параметр replicateByDefault: влияет на настройки modules. Если значение true, все сообщения в очередях сервисов и систем будут реплицироваться по умолчанию. Если значение false, все сообщения в очередях сервисов и систем не будут реплицироваться по умолчанию.

  • Параметр modules: указываются сервисы и системы, сообщения в очередях которых будут реплицироваться (если replicateByDefault:false) или не будут реплицироваться (если replicateByDefault:true).

  • Параметр replicateOnlyWithinNodeGroup: влияет на выбор сервера. По умолчанию false

Если параметр replicateOnlyWithinNodeGroup отключён (значение false) и в кластере используются группы серверов, при автоматическом выборе резервного сервера:

  • В первую очередь система ищет подходящий сервер в пределах той же группы, что и исходный сервер;

  • Если в группе нет подходящих серверов, осуществляется поиск по всему кластеру

    Примечание

    Несмотря на приоритет группы, гарантии резервирования только в рамках группы нет - особенно при динамическом изменении состава группы серверов.

Если параметр включён, резервные серверы могут быть выбраны только из той же группы, что и основной сервер. Поиск за пределами группы в этом случае не выполняется.

Пример конфигурации:

"hotRecoverySettingsGlobal": {
"$type": "DT.MdmCommon.HotRecoverySettings, DT_Core",
"replicateByDefault": true,
"modules": {
"$type": "System.Collections.Generic.Dictionary`2[[System.Guid, System.Private.CoreLib],[System.Boolean, System.Private.CoreLib]], System.Private.CoreLib"
},
"replicateOnlyWithinNodeGroup": true,
"faultTolerance": 0,
"nodes": {
"$type": "System.Collections.Generic.Dictionary`2[[System.Guid, System.Private.CoreLib],[System.Collections.Generic.List`1[[System.Guid, System.Private.CoreLib]], System.Private.CoreLib]], System.Private.CoreLib",
"d67bcf81-ab4d-491c-bdfc-cec32a642386": [],
"5d77e4f6-623a-4e24-aa20-fe9b688f2474": [],
"fce58a75-dcdc-4b18-bbbf-3d1a25f2cf8e": []
}
}

Внимание

Параметр replicateOnlyWithinNodeGroup не влияет на явно заданные настройки резервирования. Если вручную указано соответствие узлов в разделе nodes, они будут использоваться независимо от включённости данного параметра.

Пример явной настройки:

"nodes": {
"$type": "System.Collections.Generic.Dictionary`2[[System.Guid, System.Private.CoreLib],[System.Collections.Generic.List`1[[System.Guid, System.Private.CoreLib]], System.Private.CoreLib]], System.Private.CoreLib",
"5d77e4f6-623a-4e24-aa20-fe9b688f2474": [
"b4b2476e-f460-4acf-b1e4-22f7ee9870f1"
],
"b4b2476e-f460-4acf-b1e4-22f7ee9870f1": [
"a509b4bf-75ff-4001-93e8-91a71fa34f12"
],
"a509b4bf-75ff-4001-93e8-91a71fa34f12": [
"5d77e4f6-623a-4e24-aa20-fe9b688f2474"
]
}

Примечание

При значении FaultTolerance больше нуля следует обязательно указать серверы, сообщения которых будут реплицироваться. Резервные серверы указывать необязательно, они будут автоматически выбираться из доступных в текущий момент.

Примеры конфигурации

  1. Резервные сервера указаны вручную. Каждый из серверов является и реплицируемым, и резервным для другого сервера.

    • 5d77e4f6-623a-4e24-aa20-fe9b688f2474 - EntityId Srv-1

    • b4b2476e-f460-4acf-b1e4-22f7ee9870f1 - EntityId Srv-2

    • a509b4bf-75ff-4001-93e8-91a71fa34f12 - EntityId Srv-3

                "nodes": {
    
    "$type": "System.Collections.Generic.Dictionary`2[[System.Guid, System.Private.CoreLib],[System.Collections.Generic.List`1[[System.Guid, System.Private.CoreLib]], System.Private.CoreLib]], System.Private.CoreLib",
    "5d77e4f6-623a-4e24-aa20-fe9b688f2474": [
        "b4b2476e-f460-4acf-b1e4-22f7ee9870f1"
    ],
    "b4b2476e-f460-4acf-b1e4-22f7ee9870f1": [
        "a509b4bf-75ff-4001-93e8-91a71fa34f12"
    ],
    "a509b4bf-75ff-4001-93e8-91a71fa34f12": [
        "5d77e4f6-623a-4e24-aa20-fe9b688f2474"
    ]
                }
    

В данном примере будут реплицироваться следующие узлы 5d77e4f6-623a-4e24-aa20-fe9b688f2474, b4b2476e-f460-4acf-b1e4-22f7ee9870f1 и a509b4bf-75ff-4001-93e8-91a71fa34f12 на b4b2476e-f460-4acf-b1e4-22f7ee9870f1, a509b4bf-75ff-4001-93e8-91a71fa34f12 и 5d77e4f6-623a-4e24-aa20-fe9b688f2474 соответственно.

При этом, если сервер 5d77e4f6-623a-4e24-aa20-fe9b688f2474 откажет, из сервера b4b2476e-f460-4acf-b1e4-22f7ee9870f1 реплики сообщений отправятся в соответствующие очереди.

../_images/hs_scheme1.png
  1. Резервные сервера указаны вручную. Для двух реплицируемых серверов третий является резервным.

    • 5d77e4f6-623a-4e24-aa20-fe9b688f2474 - EntityId Srv-1

    • b4b2476e-f460-4acf-b1e4-22f7ee9870f1 - EntityId Srv-2

    • a509b4bf-75ff-4001-93e8-91a71fa34f12 - EntityId Srv-3

                "nodes": {
    
    "$type": "System.Collections.Generic.Dictionary`2[[System.Guid, System.Private.CoreLib],[System.Collections.Generic.List`1[[System.Guid, System.Private.CoreLib]], System.Private.CoreLib]], System.Private.CoreLib",
    "5d77e4f6-623a-4e24-aa20-fe9b688f2474": [
        "b4b2476e-f460-4acf-b1e4-22f7ee9870f1"
    ],
    "a509b4bf-75ff-4001-93e8-91a71fa34f12": [
        "b4b2476e-f460-4acf-b1e4-22f7ee9870f1"
    ]
                }
    

В данном примере будут реплицироваться узлы 5d77e4f6-623a-4e24-aa20-fe9b688f2474 и a509b4bf-75ff-4001-93e8-91a71fa34f12» на b4b2476e-f460-4acf-b1e4-22f7ee9870f1.

При этом, если сервер 5d77e4f6-623a-4e24-aa20-fe9b688f2474 откажет, из сервера b4b2476e-f460-4acf-b1e4-22f7ee9870f1 реплики сообщений отправятся в соответствующие очереди. Аналогично для a509b4bf-75ff-4001-93e8-91a71fa34f12. Но если откажет b4b2476e-f460-4acf-b1e4-22f7ee9870f1, реплики не попадут в поднявшиеся очереди, так как он не добавлен в соответствующие настройки.

../_images/hs_scheme2.png
  1. Резервные сервера не указаны.

    • 5d77e4f6-623a-4e24-aa20-fe9b688f2474 - EntityId Srv-1

    • b4b2476e-f460-4acf-b1e4-22f7ee9870f1 - EntityId Srv-2

    • a509b4bf-75ff-4001-93e8-91a71fa34f12 - EntityId Srv-3

                "nodes": {
    
    "$type": "System.Collections.Generic.Dictionary`2[[System.Guid, System.Private.CoreLib],[System.Collections.Generic.List`1[[System.Guid, System.Private.CoreLib]], System.Private.CoreLib]], System.Private.CoreLib",
    "5d77e4f6-623a-4e24-aa20-fe9b688f2474": [],
    "b4b2476e-f460-4acf-b1e4-22f7ee9870f1": [],
    "a509b4bf-75ff-4001-93e8-91a71fa34f12": []
                }
    

В данном примере будут реплицироваться узлы 5d77e4f6-623a-4e24-aa20-fe9b688f2474, b4b2476e-f460-4acf-b1e4-22f7ee9870f1 и a509b4bf-75ff-4001-93e8-91a71fa34f12 на b4b2476e-f460-4acf-b1e4-22f7ee9870f1, a509b4bf-75ff-4001-93e8-91a71fa34f12 и 5d77e4f6-623a-4e24-aa20-fe9b688f2474 соответственно.

При этом, если сервер 5d77e4f6-623a-4e24-aa20-fe9b688f2474 откажет, из сервера b4b2476e-f460-4acf-b1e4-22f7ee9870f1 реплики сообщений отправятся в соответствующие очереди.

../_images/hs_scheme3.png

Мониторинг состояния

В ЦМ на вкладке Основные у серверов имеется специальный параметр Горячее восстановление.

../_images/hs_mon.png

У этого параметра имеются следующие показатели:

  • Состояние: отображает актуальное состояние модуля горячего восстановления.

  • FaultTolerance: отображает актуальное значение данного параметра, которое высчитывается из настроек конфигурации кластера и количества рабочих серверов.

  • Резервные серверы: отображает список резервных узлов для данного сервера.

  • Резервные очереди других серверов: отображает количество реплик сообщений, находящихся на этом сервере.

Дополнительно

  • При отказе сервера с настроенной системой обмена с 1С или СУБД могут возникать дубли (если сообщения уже были отправлены, но Платформа не успела получить квитанцию о доставке до момента отказа сервера).

  • На момент выхода версии 3.1.0 следует обязательно убедиться, что на всех серверах установлено корректное время UTC, иначе горячее восстановление может работать некорректно.

  • Если на момент отказа сервера в очереди необработанных сообщений оставались сообщения, их обработка начнётся заново, то есть все шаги процесса начнутся сначала, и шаги, которые были выполнены до падения, останутся выполненными, в том числе и шаг отправки.

  • Рекомендуемое количество серверов в кластере - 3.