Отказоустойчивость и балансировка нагрузки
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-алиасы:

Балансировка через 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-балансировщика:

Если вы используете собственный балансировщик, убедитесь, что он работает в режиме 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
- VRRP (Virtual Router Redundancy Protocol) — протокол резервирования, позволяющий нескольким серверам совместно использовать один виртуальный IP-адрес (VIP).
- Группа узлов объединяется в
virtual_routerс уникальнымVRID(1-255). - У каждого узла есть приоритет (1-254). Узел с наибольшим приоритетом становится MASTER, остальные — BACKUP.
- MASTER отпра вляет в мультикаст (224.0.0.18) объявления (advertisements) раз в секунду.
- BACKUP слушает эти объявления. Если они пропадают (обычно >3 сек), BACKUP с наивысшим приоритетом захватывает VIP через gratuitous ARP.
- Клиенты подключаются всегда к одному VIP — переключение прозрачно для них.
Схема балансировки через 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_domain | sage.nspk.ru | Основной внешний домен Sage (точка входа для пользователей) |
*.internal.sage.[domain] | sage_internal_subdomain | *.internal.sage.nspk.ru | Wildcard для внутреннего взаимодействия сервисов |
Детализация доменов для 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]) выполняется на стороне клиента