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

7. Load Balancing и Proxy


L4 vs L7 балансировка, алгоритмы (round-robin, least connections), health checks и типы прокси (reverse/forward/transparent) + типичные решения (Nginx, HAProxy, Envoy).


Load Balancing (балансировка нагрузки)

L4 vs L7

Уровень Что видит балансировщик Решения Плюсы / минусы
L4 IP, порт, протокол (TCP/UDP). Содержимое пакетов не разбирает. Выбор бэкенда по IP:порт; один поток — один бэкенд. Быстро, мало нагрузки, подходит для любого протокола. Нельзя маршрутизировать по URL, заголовкам, cookie.
L7 HTTP/HTTPS: метод, URL, заголовки, тело (при терминации TLS — и Host, путь). Маршрутизация по path, Host, заголовкам; sticky session по cookie; A/B. Гибкость, один порт — много приложений по пути. Выше нагрузка и сложность; нужна терминация TLS или передача на L7.

В облаках часто комбинируют: внешний L4 (или L7) балансировщик (ALB, NLB) и внутренний L7 (Nginx, Envoy) для маршрутизации по правилам приложения.

Алгоритмы распределения

  • Round-robin — запросы по очереди на бэкенды. Просто, но не учитывает разную загрузку и длительность запросов.
  • Least connections — запрос направляется на бэкенд с наименьшим числом активных соединений. Подходит для разной длительности запросов (долгие vs короткие).
  • Weighted — веса бэкендам; часть трафика пропорционально весу. Для постепенного ввода новых версий или разной мощности нод.
  • Hash (по IP, по заголовку, по cookie) — один и тот же клиент или сессия всегда идут на один бэкенд (sticky session). Важно при состоянии на сервере.

Health checks

Health check — периодическая проверка бэкенда (HTTP GET на /health, TCP-подключение, или кастомный скрипт). Бэкенд, не отвечающий на проверку, исключается из пула (или переводится в drain). Без health check трафик продолжит уходить на «мёртвый» или перегруженный узел. Настройка: интервал, таймаут, порог успехов/неудач (например, 2 из 3 проверок failed → out of rotation).


Proxy (прокси)

Reverse proxy (обратный прокси)

Клиент обращается к одному адресу (прокси); прокси выбирает бэкенд и отдаёт ответ от его имени. Клиент не знает о бэкендах. Используется для: балансировки, терминации TLS, кэширования, сжатия, единой точки входа (один порт 443 — много приложений по Host/path). Nginx, HAProxy, Envoy в режиме «принимаем снаружи, отдаём на бэкенды» — reverse proxy.

Forward proxy (прямой прокси)

Клиент настраивает использование прокси (или трафик прозрачно уходит на прокси). Прокси от имени клиента ходит во внешние сервисы (интернет). Используется для: контроля доступа, кэша, анонимизации. Пример: корпоративный Squid, прокси в браузере.

Transparent proxy (прозрачный прокси)

Клиент не настраивает прокси; трафик перенаправляется на прокси правилами маршрутизации/firewall (например, REDIRECT в iptables). Для клиента выглядит как прямое соединение. Применяется для фильтрации и учёта без смены настроек на клиентах; сложнее с TLS (нужна терминация и подстановка сертификата для HTTPS).


Примеры: Nginx, HAProxy, Envoy

Nginx

Веб-сервер и reverse proxy L7: маршрутизация по server_name (Host), location (path), proxy_pass на upstream. Поддержка балансировки (round-robin, least_conn, ip_hash), health check через max_fails и fail_timeout. Часто ставят перед приложениями и как единая точка входа с TLS.

HAProxy

Балансировщик L4 и L7: высокая производительность, гибкая конфигурация backend/frontend, ACL, health checks (HTTP, TCP). Широко используется перед веб- и API-бэкендами и в качестве входа в кластер.

Envoy

Прокси и балансировщик с акцентом на observability и динамическую конфигурацию (xDS). L4 и L7, поддержка gRPC, HTTP/2, мTLS. Часто используется в сервисных сетках (Istio) и как edge/ingress-прокси в Kubernetes. Конфигурация через статический конфиг или управляющая плоскость (Control Plane).

!!! tip "Практика"

При выборе: нужна ли маршрутизация по URL/заголовкам и TLS на одном порту → L7 (Nginx, HAProxy, Envoy). Нужна только равномерная раздача по бэкендам без разбора HTTP → достаточно L4. Обязательно настраивать health checks и понимать, как исключаются нерабочие бэкенды.

Паттерны и антипаттерны

Паттерн Описание
Health checks обязательны Без них упавший бэкенд продолжит получать трафик.
Знать L4 vs L7 От этого зависит, можно ли маршрутизировать по path/Host и где терминировать TLS.
Один вход — прокси, за ним пул бэкендов Масштабирование и замена бэкендов без смены адреса для клиента.
Антипаттерн Почему плохо Что делать
Балансировать без health check Трафик на мёртвые ноды, рост ошибок и таймаутов. Всегда настраивать проверки и пороги снятия с балансировки.
Путать reverse и forward proxy Reverse — «клиент к нам, мы к бэкендам»; forward — «клиент через нас во внешний мир». Чётко определять направление трафика и кто инициирует запрос.

Дополнительные материалы