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

При использовании этого типа балансировки убедитесь, что 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-балансировщика:

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