Перейти к содержанию

Отказоустойчивость и масштабирование

Система поддерживает горизонтальное масштабирование и работу в кластерном режиме (Active-Active / Active-Passive). Несколько экземпляров Системы развёртываются за общим балансировщиком нагрузки, все данные хранятся в общей СУБД PostgreSQL.

Кластерное развёртывание решает две задачи:

  • отказоустойчивость — сбой одного узла не приводит к недоступности Системы
  • производительность — нагрузка распределяется между всеми узлами кластера

Режимы развёртывания

Active-Active

Все узлы кластера одновременно обрабатывают запросы. Балансировщик распределяет входящие запросы между узлами, снижая нагрузку на каждый из них. При росте нагрузки к кластеру добавляются новые узлы без изменения архитектуры.

Active-Passive

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

Режим определяется настройками балансировщика, Система работает в обоих режимах без дополнительной настройки.

Архитектура кластера

Минимальный состав отказоустойчивого развёртывания:

Компонент Кол-во Назначение
Балансировщик нагрузки 1 Распределение трафика между узлами и контроль их доступности
Допуск 2 и более Обслуживание запросов пользователей
Единая точка входа 2 и более Аутентификация пользователей
Кластер PostgreSQL 2 Хранение данных, репликация Основной-Резервный

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

Настройка узлов Системы

  1. Развернуть не менее двух узлов Системы по инструкции Установка системы, указав на каждом узле общую базу данных, адреса балансировщика и включив кластерный режим:

    docker-compose.yml
    services:
      web:
        image: docker.iis-soft.ru/iisln/dopusk
        environment:
          - JAVA_OPTS=
            -Ddb.url=jdbc:postgresql://<адрес-основного-узла-PostgreSQL>:5432/postgres
            -Dsso.url=http://sso.local/auth
            -Dapp.base-url=http://dopusk.local/dopusk
            -Dserver.cluster-mode=true
            -Duser.language=ru
            -Duser.country=RU
        restart: unless-stopped
    

Где dopusk.local и sso.local — адреса балансировщика для Системы и Единой точки входа.

  1. Развернуть не менее двух узлов Единой точки входа по той же инструкции и разместить их за балансировщиком.

  2. При необходимости в параметре -Dapp.base-url указываются дополнительные адреса, разрешённые для входа в Систему, через разделитель |.

Примечание

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

Настройка балансировщика нагрузки

Балансировщик должен:

  • контролировать доступность узлов и автоматически исключать недоступные из распределения
  • сохранять привязку сессии пользователя к одному узлу (session affinity) — сессии пользователей хранятся в памяти узла
  • передавать заголовки Host и X-Forwarded-For, как описано в разделе Использование обратного прокси-сервера

Пример настройки nginx для режима Active-Active:

/etc/nginx/conf.d/lb.conf
upstream dopusk {
    ip_hash;
    server <адрес-узла-1>:8080;
    server <адрес-узла-2>:8080;
}

upstream sso {
    ip_hash;
    server <адрес-узла-sso-1>:8080;
    server <адрес-узла-sso-2>:8080;
}

server {
    listen 80;
    server_name dopusk.local;

    location / {
        proxy_pass http://dopusk/dopusk/;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /dopusk/ {
        proxy_pass http://dopusk/dopusk/;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Для Единой точки входа настраивается аналогичный блок server с именем sso.local и proxy_pass http://sso/auth/ — см. пример в разделе Использование обратного прокси-сервера.

Для режима Active-Passive резервный узел помечается директивой backup — трафик направляется на него только при недоступности основного узла:

/etc/nginx/conf.d/lb.conf
1
2
3
4
5
upstream dopusk {
    ip_hash;
    server <адрес-узла-1>:8080;
    server <адрес-узла-2>:8080 backup;
}

Резервирование базы данных

Все узлы Системы работают с одним экземпляром базы данных PostgreSQL. Отказоустойчивость на уровне СУБД обеспечивается штатной репликацией PostgreSQL в режиме Основной-Резервный (Master-Slave) с автоматическим переключением при отказе основного узла.

Для построения кластера PostgreSQL применяются: