Load balancing (L4/L7)

Тема дорожной карты · DevOps Engineer

Балансировка нагрузки распределяет входящий трафик между несколькими backend-инстансами, чтобы ни один не перегружался и при падении любого из них пользователи не замечали проблем. Различают L4-балансировку (по транспортному уровню — IP и порт; так работают HAProxy в TCP-режиме, nftables, AWS NLB) и L7-балансировку (с разбором HTTP — Nginx, HAProxy в HTTP-режиме, Envoy, AWS ALB). L7 даёт больше возможностей (роутинг по URL, заголовкам, cookies), но обходится дороже по CPU.

Как это работает

L4-балансировщик видит только TCP/UDP-пакет: source IP, dest IP, dest port, флаги. Он выбирает upstream-инстанс (например, по hash от source IP) и пробрасывает соединение целиком — никакого разбора содержимого. L7-балансировщик разбирает HTTP/HTTPS, читает path, headers, body, и принимает решение на каждый запрос (а не на соединение). Алгоритмы выбора: round-robin (по очереди), least-connections (тому, у кого меньше открытых), ip_hash (один клиент = один backend, sticky sessions), weighted (с разными весами для разных инстансов). Health-check периодически опрашивает upstream'ы (HTTP-200 на /healthz или TCP-connect), и мёртвые исключаются из ротации до восстановления.

Когда применять

L4 — когда вам нужна максимальная пропускная способность и минимальная latency, контент не нужно разбирать (TCP-протоколы типа SMTP, базы данных, gRPC без mesh). L7 — когда есть HTTP/HTTPS и нужны: роутинг по /api/* vs /static/*, sticky-sessions по cookie, rate-limiting по user-id из заголовка, blue-green/canary деплои с управлением через заголовок. Большинство современных приложений используют L7 (Nginx, AWS ALB, Cloudflare Load Balancing). L4 остаётся для baremetal-сетапов с экстремальным RPS или для не-HTTP протоколов.

Типичные ошибки

Грабли: использовать round-robin при разной мощности инстансов (новые в 2× мощнее, но получают столько же трафика — используйте weighted); забыть health-check (мёртвая реплика принимает запросы и возвращает 500); sticky sessions без учёта падений (клиент привязан к упавшему инстансу до timeout'а); slow drain при rolling-update (новые соединения идут в свежеуходящий backend); cross-zone traffic в облаке без необходимости (платите за межзонный трафик там, где локального хватило бы); один балансировщик без HA-pair (single point of failure).

Связанные понятия

Полезные ресурсы