Рекомендации по балансировке
Назначение и ограничения
Балансировщик распределяет клиентские запросы к S3 API и Admin UI/Management API между узлами Закрома.Хранение. Все доступные экземпляры Закрома.Хранение принимают клиентский трафик, поэтому балансировщик должен проверять их доступность и исключать недоступные узлы из распределения запросов.
В статье не рассматривается механизмы межузлового трафика ZDS, PostgreSQL и Kafka, где балансировка выполняется средствами самого ПО, либо сторонними средствами. Для CDN в мультикластерной конфигурации поставки 7.2.3 используется отдельная схема с Nginx, описанная в статье Настройка Nginx.
Компоненты инфраструктурыHAProxy, Keepalived и другие внешние балансировщики не входят в состав продукта. Их установка, настройка и сопровождение выполняются средствами инфраструктуры предприятия.
Выбор схемы балансировки
| Схема | Где применять | Особенности |
|---|---|---|
| Один HAProxy | Тестовые и простые среды, в которых допустим перерыв при отказе балансировщика | Простая настройка, но балансировщик остаётся единой точкой отказа |
| HAProxy и Keepalived с одним VIP-адресом | Базовая отказоустойчивая конфигурация в пределах одного L2-сегмента | При отказе активного узла VIP-адрес переходит на резервный |
| Несколько VIP-адресов и DNS RR | Продуктивные среды, где требуется распределить входящие подключения между несколькими отказоустойчивыми группами балансировщиков | Один FQDN разрешается в несколько VIP-адресов; каждый VIP-адрес должен иметь собственный механизм переключения |
| Внешний Application Delivery Controller (ADC), облачный балансировщик, GSLB или балансировщик платформы контейнеризации | Среды с принятыми корпоративными платформами балансировки или несколькими площадками | Возможности и отказоустойчивость определяются выбранным решением |
Один HAProxy
Один HAProxy можно использовать для функциональных испытаний и некритичных сред. Он предоставляет единые точки входа для S3 API и Admin UI/API, но при его отказе оба сервиса становятся недоступны через балансировщик.

HAProxy и Keepalived с одним VIP-адресом
Для отказоустойчивой точки входа используйте минимум два узла с HAProxy и Keepalived. HAProxy должен быть запущен на каждом узле, а клиентские DNS-имена должны указывать на общий VIP-адрес.
Для каждого VRRP-инстанса настройте:
- одинаковый VIP-адрес на участвующих узлах;
- разные приоритеты основного и резервного узлов;
- локальную проверку состояния сервиса HAProxy;
- освобождение VIP-адреса при отказе HAProxy;
- уникальный VRID в пределах L2-сегмента.
Keepalived проверяет состояние локального HAProxy и переносит VIP-адрес между узлами. HAProxy отдельно проверяет доступность узлов Закрома.Хранение и исключает недоступные backend-серверы. Если multicast VRRP запрещён политиками сети, используйте unicast VRRP в соответствии с требованиями сетевой инфраструктуры.

Базовая конфигурация HAProxy
Следующий пример создаёт отдельные точки входа и пулы backend-серверов для S3 API и Admin UI/Management API. TCP-проверки подходят как базовый вариант независимо от того, используется ли HTTP или TLS на узлах Закрома.Хранение.
TCP-проверка подтверждает только доступность сетевого порта. Если выбранный балансировщик поддерживает проверку готовности приложения, используйте согласованный L7 health-check для установленной версии Закрома.Хранение.
Замените значения в угловых скобках. Порты <S3_API_PORT> и <MANAGEMENT_PORT> должны соответствовать параметрам zakroma_storage_gateway.s3api_port и zakroma_storage_gateway.management_port в конфигурации конкретной инсталляции.
1global 2 log /dev/log local0 3 log /dev/log local1 notice 4 maxconn 10000 5 6defaults 7 log global 8 mode tcp 9 option tcplog 10 timeout connect 5s 11 timeout client 1h 12 timeout server 1h 13 14frontend zakroma_s3 15 bind <BALANCER_IP>:<S3_PUBLIC_PORT> 16 default_backend zakroma_s3_nodes 17 18backend zakroma_s3_nodes 19 balance roundrobin 20 option tcp-check 21 server storage-1 <STORAGE_NODE_1_IP>:<S3_API_PORT> check inter 2s fall 3 rise 2 22 server storage-2 <STORAGE_NODE_2_IP>:<S3_API_PORT> check inter 2s fall 3 rise 2 23 server storage-3 <STORAGE_NODE_3_IP>:<S3_API_PORT> check inter 2s fall 3 rise 2 24 25frontend zakroma_admin 26 bind <BALANCER_IP>:<ADMIN_PUBLIC_PORT> 27 default_backend zakroma_admin_nodes 28 29backend zakroma_admin_nodes 30 balance roundrobin 31 option tcp-check 32 server storage-1 <STORAGE_NODE_1_IP>:<MANAGEMENT_PORT> check inter 2s fall 3 rise 2 33 server storage-2 <STORAGE_NODE_2_IP>:<MANAGEMENT_PORT> check inter 2s fall 3 rise 2 34 server storage-3 <STORAGE_NODE_3_IP>:<MANAGEMENT_PORT> check inter 2s fall 3 rise 2
При выборе тайм-аутов учитывайте размер объектов, скорость соединения и длительность multipart-загрузок. Балансировщик не должен завершать активную передачу объекта из-за слишком короткого тайм-аута.
Проверка доступности через /healthz
Закрома.Хранение и сервис gateway предоставляет специальный эндпоинт для проверки состояния - GET /healthz на отдельном management-порту, который указывается переменной zakroma_storage_gateway.management_port. Протокол доступа(HTTP или HTTPS) зависит от параметра zakroma_storage_gateway.tls.enabled: при false используется HTTP, при true — HTTPS.
Ответ с кодом 200 и телом {} означает, что HTTP-сервер gateway работает и принимает запросы.
Проверка состояния сервиса, используя TCP, также может применяться при балансировке. Если политика предприятия требует L7 health-check, используйте эндпоинт /healthz как отдельный вариант проверки.
Следующий фрагмент показывает проверку работопособности S3-бекенда через <MANAGEMENT_PORT>: клиентский трафик при этом продолжает поступать на <S3_API_PORT>.
1backend zakroma_s3_nodes 2 mode tcp 3 balance roundrobin 4 option httpchk GET /healthz 5 http-check expect status 200 6 server storage-1 <STORAGE_NODE_1_IP>:<S3_API_PORT> check port <MANAGEMENT_PORT> inter 2s fall 3 rise 2 7 server storage-2 <STORAGE_NODE_2_IP>:<S3_API_PORT> check port <MANAGEMENT_PORT> inter 2s fall 3 rise 2 8 server storage-3 <STORAGE_NODE_3_IP>:<S3_API_PORT> check port <MANAGEMENT_PORT> inter 2s fall 3 rise 2
Если TLS включён на узлах Закрома.Хранение, health-check должен подключаться к management_port по HTTPS, передавать SNI и проверять сертификат через доверенный центр сертификации. Для каждой строки server можно добавить параметры:
1check port <MANAGEMENT_PORT> check-ssl check-sni <ADMIN_UI_FQDN> verify required ca-file <CA_CERT_PATH> verifyhost <ADMIN_UI_FQDN>
Можно применить аналогичный метод проверки доступности Admin UI, если он настраивается отдельно. Этот пример является рекомендацией и не заменяет базовые конфигурации HAProxy из предыдущего раздела.
TLS-терминация
TLS можно терминировать на балансировщике или передавать до узлов Закрома.Хранение без шифрования.
| Вариант | Размещение сертификатов | Маршрутизация | Особенности |
|---|---|---|---|
| TLS-терминация на балансировщике | На каждом узле балансировщика | По HTTP Host и другим параметрам HTTP-запроса | Упрощает централизованное управление сертификатами; до backend-серверов можно использовать HTTP или повторное TLS-шифрование |
| TLS passthrough | На каждом узле Закрома.Хранение | По SNI в ClientHello или по отдельным IP-адресам и портам | Балансировщик не расшифровывает трафик и не может анализировать HTTP-запрос |
Настройка публичного URL Admin UI
Если Admin UI необходимо сделать доступным через внешний балансировщик по TLS, укажите в zakroma_storage_admin.path его внешний FQDN и включите формирование URL через reverse proxy. Параметр port должен содержать внешний порт балансировщика, а не внутренний zakroma_storage_gateway.management_port.
Для роли zakroma-storage версии 10.0.5 и новее используйте:
1zakroma_storage_admin: 2 # Внешний FQDN Admin UI без схемы и порта. 3 path: "zakroma-admin.zakroma.internal" 4 reverse_proxy: 5 enabled: true 6 # Внешний порт балансировщика. 7 port: 443
При enabled: true роль формирует для Admin UI параметр basepath вида https://<path>:<port>. Если оставить enabled: false, URL формируется с внутренним портом zakroma_storage_gateway.management_port и может не соответствовать адресу, доступному клиентам через балансировщик.
Настройка необходима как при TLS-терминации на балансировщике, так и при TLS passthrough с SNI, если внешний порт отличается от внутреннего порта Admin UI. При TLS-терминации без маршрутизации по SNI укажите в path и port публичный адрес Admin UI на внешнем балансировщике. В режиме TLS passthrough без SNI опубликуйте Admin UI через отдельный IP-адрес или порт и укажите эти внешние значения.
Совместимость с поставкой 7.2.3В поставке 7.2.4 переменная
zakroma_storage_admin.reverse_proxyзаменит блок zakroma_storage_nginx_proxy. Для текущей версии задайте внешний FQDN вzakroma_storage_admin.pathи включите совместимый параметр:1zakroma_storage_admin: 2 path: "zakroma-admin.zakroma.internal" 3 4zakroma_storage_nginx_proxy: true

TLS-терминация на балансировщике
При TLS-терминации сертификат и закрытый ключ размещаются на каждом узле балансировщика. HAProxy принимает HTTPS-запросы, определяет Admin UI по HTTP Host и направляет остальные запросы в backend S3 API.
Следующий пример предполагает HTTP-соединения между HAProxy и узлами Закрома.Хранение. Параметр crt должен указывать на PEM-файл, содержащий сертификат, цепочку сертификатов и закрытый ключ.
1global 2 log /dev/log local0 3 log /dev/log local1 notice 4 maxconn 10000 5 6defaults 7 log global 8 timeout connect 5s 9 timeout client 1h 10 timeout server 1h 11 12frontend zakroma_https 13 bind <BALANCER_IP>:443 ssl crt <PEM_CERTIFICATE_PATH> 14 mode http 15 option httplog 16 17 acl is_zakroma_admin hdr(host) -i <ADMIN_UI_FQDN> 18 use_backend zakroma_admin_http if is_zakroma_admin 19 default_backend zakroma_s3_http 20 21backend zakroma_s3_http 22 mode http 23 balance roundrobin 24 server storage-1 <STORAGE_NODE_1_IP>:<S3_API_PORT> check 25 server storage-2 <STORAGE_NODE_2_IP>:<S3_API_PORT> check 26 server storage-3 <STORAGE_NODE_3_IP>:<S3_API_PORT> check 27 28backend zakroma_admin_http 29 mode http 30 balance roundrobin 31 server storage-1 <STORAGE_NODE_1_IP>:<MANAGEMENT_PORT> check 32 server storage-2 <STORAGE_NODE_2_IP>:<MANAGEMENT_PORT> check 33 server storage-3 <STORAGE_NODE_3_IP>:<MANAGEMENT_PORT> check
Не изменяйте заголовок Host, URI и query-параметры клиентского запроса: они используются для адресации S3 и проверки подписи запроса. Если между балансировщиком и узлами требуется TLS, настройте повторное шифрование и обязательную проверку сертификатов backend-серверов доверенным центром сертификации.
TLS passthrough и SNI
В режиме TLS passthrough HAProxy работает на уровне TCP. Значение SNI из TLS ClientHello позволяет направить запросы Admin UI в отдельный backend без расшифровки трафика. Остальные TLS-запросы направляются в S3 API.
1global 2 log /dev/log local0 3 log /dev/log local1 notice 4 maxconn 10000 5 6defaults 7 log global 8 mode tcp 9 option tcplog 10 timeout connect 5s 11 timeout client 1h 12 timeout server 1h 13 14frontend zakroma_tls 15 bind <BALANCER_IP>:443 16 mode tcp 17 option tcplog 18 tcp-request inspect-delay 5s 19 tcp-request content accept if { req.ssl_hello_type 1 } 20 21 acl is_zakroma_admin req.ssl_sni -i <ADMIN_UI_FQDN> 22 use_backend zakroma_admin_tls if is_zakroma_admin 23 default_backend zakroma_s3_tls 24 25backend zakroma_s3_tls 26 mode tcp 27 balance roundrobin 28 option tcp-check 29 server storage-1 <STORAGE_NODE_1_IP>:<S3_API_PORT> check 30 server storage-2 <STORAGE_NODE_2_IP>:<S3_API_PORT> check 31 server storage-3 <STORAGE_NODE_3_IP>:<S3_API_PORT> check 32 33backend zakroma_admin_tls 34 mode tcp 35 balance roundrobin 36 option tcp-check 37 server storage-1 <STORAGE_NODE_1_IP>:<MANAGEMENT_PORT> check 38 server storage-2 <STORAGE_NODE_2_IP>:<MANAGEMENT_PORT> check 39 server storage-3 <STORAGE_NODE_3_IP>:<MANAGEMENT_PORT> check
Маршрутизация по SNI доступна только для TLS-соединений, в которых клиент передаёт имя сервера. Для клиентов без SNI требуется отдельный IP-адрес или порт. При TLS passthrough HAProxy не проверяет сертификат, который узел Закрома.Хранение возвращает клиенту. Необходимые DNS-имена должны присутствовать в сертификате каждого backend-узла.
DNS Round-Robin
DNS Round-Robin (DNS RR) возвращает несколько IP-адресов для одного DNS-имени. Такой подход распределяет новые клиентские соединения без отдельного устройства балансировки, но сам по себе не проверяет доступность адресов и не гарантирует немедленное переключение клиента.
Прямые DNS-записи на узлы
Прямые A-записи на узлы Закрома.Хранение допустимы для тестовых и некритичных сред. При отказе узла его адрес может оставаться в DNS-ответах и клиентском кэше до истечения TTL. Кроме того, порядок и способ выбора адреса зависят от DNS-резолвера и клиента.
Все узлы, указанные в DNS, должны принимать запросы к одному FQDN и предоставлять подходящий TLS-сертификат. Для продуктивной среды используйте DNS-сервис с проверкой доступности или сочетайте DNS RR с отказоустойчивыми VIP-адресами.
DNS RR и несколько VIP-адресов
В отказоустойчивой схеме один FQDN разрешается в два или более VIP-адреса. Каждый VIP-адрес обслуживается независимой группой HAProxy и защищён Keepalived. Группы балансировщиков используют одинаковые FQDN, сертификаты и пулы backend-серверов.
Распределите основное владение VIP-адресами между разными узлами или группами, чтобы задействовать ресурсы нескольких балансировщиков. Низкий TTL сокращает время хранения DNS-ответа в кэше, но не заменяет health-check и не гарантирует мгновенное переключение уже подключённых клиентов.

VRRP рассчитан на переключение адреса в пределах общей сетевой инфраструктуры. Не растягивайте VRRP между центрами обработки данных. Для выбора доступной площадки используйте GSLB или другой DNS-сервис с проверкой состояния endpoint.
Другие балансировщики и подходы
Внешние балансировщикиДопускается использовать внешние балансировщики в соответствии со стандартами вашего предприятия.
Выбранный балансировщик должен обеспечивать:
- балансировку TCP или HTTP в соответствии с выбранным вариантом TLS-терминации;
- L4- или L7-проверки доступности узлов Закрома.Хранение и исключение недоступных узлов;
- TLS-терминацию или TLS passthrough, а при маршрутизации зашифрованного трафика — поддержку SNI;
- сохранение заголовка Host, URI и query-параметров S3-запросов;
- тайм-ауты, достаточные для длительных операций и передачи больших объектов;
- корректную работу с multipart-загрузками;
- отключение нежелательной буферизации запросов и ответов.
Для нескольких площадок рекомендуется GSLB с проверкой доступности. В контейнерной среде можно использовать балансировщик или ingress-контроллер платформы, если он выполняет перечисленные требования. Выбор производителя и конкретной реализации определяется стандартами предприятия.
Проверка балансировки
После настройки выполните следующие проверки.
-
Убедитесь, что DNS-имена S3 API и Admin UI возвращают ожидаемые VIP-адреса:
1dig +short <S3_FQDN> 2dig +short <ADMIN_UI_FQDN> -
Если используется TLS, проверьте сертификат и выбор имени по SNI:
1openssl s_client -connect <VIP_ADDRESS>:443 -servername <S3_FQDN> 2openssl s_client -connect <VIP_ADDRESS>:443 -servername <ADMIN_UI_FQDN> -
Проверьте синтаксис конфигурации HAProxy на каждом узле балансировщика:
1haproxy -c -f /etc/haproxy/haproxy.cfg -
В согласованное окно испытаний сделайте один backend-сервер недоступным и убедитесь, что HAProxy исключил его из распределения, а S3 API и Admin UI продолжают работать через оставшиеся узлы.
-
Для схемы с Keepalived проверьте перенос VIP-адреса при остановке HAProxy или отказе активного узла, а затем — возврат узла в рабочее состояние. Клиентские DNS-имена должны продолжать разрешаться в тот же VIP-адрес.
-
Через используемый S3-клиент выполните запись, чтение и удаление объекта, а также multipart-загрузку. Проверьте доступ к Admin UI и выполнение операций через Admin API, если он используется.