Перейти к основному содержимому
Версия: 1.12

Отказоустойчивость и балансировка нагрузки

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

Обеспечение отказоустойчивости​

Отказоустойчивая балансировка между сервисами Sage (межсервисная балансировка) достигается за счёт использования internal-доменов. Internal-домен представляет собой имя сервиса под общим поддоменом, например manul.internal.sage.example.com, celestia-mage.internal.sage.example.com и т.д. Далее реализация балансировки может различаться.

Самая простая реализация – за счёт использования алиасов для контейнеров в Docker-сети. Это не является продуктовым решением, но подходит для тестовых инсталляций, чтобы ознакомиться с функционалом системы. Подробная схема работы описана далее.

Продуктовым решением является обеспечение отказоустойчивой доставки трафика до балансировщиков Sage. Это возможно реализовать только за счёт инфраструктуры клиента. Поддерживаются следующие решения:

  • При помощи Virtual IP или Anycast IP. В таком случае домен, используемый для подключения к Sage, а также все internal-домены должны разрешаться в Virtual IP или Anycast IP, указывающий на балансировщики Sage (Nginx).

  • При помощи сетевого L4-балансировщика. В таком случае домен, используемый для подключения к Sage, а также все internal-домены должны разрешаться в публичный IP-адрес L4-балансировщика. Подробная схема работы описана далее.

Балансировка через алиасы в Docker-сети​

На каждый хост с приложениями Sage устанавливается контейнер с балансировщиком Sage (Nginx). В Docker-сети создаются алиасы, которые разрешают internal-домены в IP-адреса локального контейнера Nginx.

Чтобы контейнерам Nginx назначились алиасы в Docker-сети, укажите в инвентаре переменную со следующим значением:

sage_enable_nginx_aliases: true # По умолчанию false

Схема балансировки через Docker-алиасы:

схема балансировки через Docker-алиасы

Обратите внимание

При использовании этого типа балансировки убедитесь, что Nginx установлен на всех хостах с приложениями Sage.

Балансировка через L4-балансировщик​

В данной схеме доставка трафика до балансировщиков Sage осуществляется через управляемый клиентом L4-балансировщик. Настройка и поддержка L4-балансировщика остаётся на стороне клиента.

Для настройки балансировки через L4-балансировщик:

  • Настройте ваш DNS так, чтобы домен, используемый для подключения к Sage, и все internal-домены разрешались в публичный IP-адрес L4-балансировщика;

  • В качестве бекендов укажите адреса балансировщиков Sage. Балансировщики Sage устанавливаются на все хосты ansible группы nginx и слушают на 443 порту;

  • Для вывода из балансировки неактивных инстансов балансировщиков Sage используйте эндпоинт /health, который возвращает HTTP 200 для активного инстанса; в противном случае запрос не будет успешно завершён (соединение оборвётся или истечёт по таймауту);

  • Настройте использование PROXY-протокола между вашим L4-балансировщиком и балансировщиками Sage. Это необходимо, чтобы приложения Sage могли видеть реальный IP адрес клиента, а не адрес PROXY. Ваш L4-балансировщик должен отправлять PROXY-протокол, а балансировщики Sage должны его обрабатывать. Настроить балансировщики Sage на приём PROXY-протокола нужно добавлением в ваш инвентарь переменной со следующим значением:

    nginx_enable_proxy_protocol: true # По умолчанию false

Схема с использованием внешнего L4-балансировщика:

схема балансировки через L4 балансировщик

Если вы используете собственный балансировщик, убедитесь, что он работает в режиме stream/TCP, не терминируя TLS-подключения и просто перенаправляя трафик на балансировщики Sage: роутинг и терминирование TLS выполняются на балансировщиках Sage. Использовать L7-балансировщики с Sage невозможно.

Также не допускается использование DNS-based балансировки до балансировщиков Sage (когда доменные имена разрешаются напрямую в IP адреса балансировщиков Sage, без использования внешнего L4-балансировщика, Virtual IP или Anycast IP): такой режим не обеспечивает отказоустойчивый режим работы Sage.

Отказоустойчивая балансировка через Virtual IP (VIP)​

Схема балансировки через Virtual IP для обеспечения отказоустойчивости:

  • Два или более узлов Nginx объединяются в кластер, который разделяет один виртуальный IP-адрес (VIP).
  • При отказе активного узла VIP автоматически переходит на резервный узел.
Важно!

VIP не привязан к конкретному протоколу — можно использовать любой механизм резервирования (VRRP, keepalived, Pacemaker и др.). Ниже приведён пример на базе VRRP.

Пример реализации на базе VRRP​

  1. VRRP (Virtual Router Redundancy Protocol) — протокол резервирования, позволяющий нескольким серверам совместно использовать один виртуальный IP-адрес (VIP).
  2. Группа узлов объединяется в virtual_router с уникальным VRID (1-255).
  3. У каждого узла есть приоритет (1-254). Узел с наибольшим приоритетом становится MASTER, остальные — BACKUP.
  4. MASTER отправляет в мультикаст (224.0.0.18) объявления (advertisements) раз в секунду.
  5. BACKUP слушает эти объявления. Если они пропадают (обычно >3 сек), BACKUP с наивысшим приоритетом захватывает VIP через gratuitous ARP.
  6. Клиенты подключаются всегда к одному VIP — переключение прозрачно для них.

Схема балансировки через VIP:

Схема балансировки через Nginx и VIP:

Схема балансировки через Nginx и VIP

Health check endpoint:

Для идентификации активного инстанса Nginx используется HTTP endpoint /health. Keepalived периодически опрашивает этот endpoint и при обнаружении проблем снижает приоритет узла, что приводит к передаче VIP резервному узлу.

В роли Sage nginx healthcheck уже настроен по умолчанию:

location /health {
return 200;
}

Эндпоинт доступен на отдельном порту 8010 (переменная nginx_health):

curl http://<nginx-host>:8010/health
# Ожидаемый ответ: HTTP 200 OK

Переменная для проверки: deploy_healthcheck_uri: "http://{{ nginx_server_name }}:{{ http_ports['nginx_health'] }}/health"

PROXY протокол:

Важно!

При использовании схемы балансировки через Virtual IP PROXY протокол не требуется. Nginx работает как reverse proxy в стандартном режиме HTTP/HTTPS без необходимости передачи исходного IP-адреса клиента через PROXY протокол.

nginx_enable_proxy_protocol: false # По умолчанию значение переменной false, для VIP не требуется ничего менять

Доменные имена:

Все доменные имена Sage должны разрешаться в VIP балансировщика. Для этого нужно добавить DNS записи sage.[domain] и wildcard *.internal.sage.[domain].

Основные домены:

ДоменПеременнаяПримерНазначение
sage.[domain]sage_external_domainsage.nspk.ruОсновной внешний домен Sage (точка входа для пользователей)
*.internal.sage.[domain]sage_internal_subdomain*.internal.sage.nspk.ruWildcard для внутреннего взаимодействия сервисов

Детализация доменов для wildcard *.internal.sage.[domain]:

Получить полный список всех внутренних сервисов для текущей версии Sage можно с помощью команды:

ansible localhost -i [inventory path] -m debug -a "msg={{ nginx_component_servers_default | dict2items |
map(attribute='value') | flatten | map(attribute='server_name') | sort }}"
Пример вывода команды
- celestia-mage.internal.
- dp-connector.internal.
- dtracing-collector.internal.
- frost-rw.internal.
- grafana.internal.
- mage.internal.
- manul.internal.
- pager.internal.
- sauron.internal.
Важно
  • Все доменные имена Sage должны разрешаться в VIP балансировщика
  • Для wildcard *.internal.sage.[domain] требуется wildcard-сертификат
  • Переменная sage_internal_subdomain формируется автоматически: sage_internal_subdomain: "internal." ~ sage_external_domain

Требования к реализации VIP:

  • Конкретный механизм обеспечения отказоустойчивости VIP (VRRP, keepalived, Pacemaker и др.) выбирает и настраивает клиент
  • Health check endpoint /health используется для мониторинга активности узла Nginx
  • Настройка DNS (A-запись для sage.[domain] и wildcard для *.internal.sage.[domain]) выполняется на стороне клиента