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 — «клиент через нас во внешний мир». | Чётко определять направление трафика и кто инициирует запрос. |