Как работает load balancer уровня L4 и L7?
L4 (уровень транспортный) — как работает и что делает
L4-балансировщик оперирует на уровне транспортного протокола (TCP/UDP). Он смотрит на IP-адреса и порты, не заглядывая в содержимое пакетов (payload). При поступлении соединения балансировщик выбирает бэкэнд-сервер и либо перенаправляет (DNAT) поток на его IP:port, либо выступает в роли прозрачного прокси и терминирует TCP/UDP, создавая своё соединение к бэкенду.
Основные детали:
-
маршрутизация по IP/портам; не разбирает HTTP-заголовки;
-
использует алгоритмы round-robin, least-connections, source IP hash и т.д.;
-
health-check обычно простой — TCP-handshake (порт открыт) или UDP probe;
-
поддерживает очень низкую задержку и высокую пропускную способность (меньше CPU-затрат на обработку пакетов);
-
может работать в режиме passthrough (TLS/SSH шифрование проходит насквозь, бэкенд расшифровывает) или proxy (терминирует соединение).
Применение: базы данных, SMTP, SSH, игровые сервера, любые нестандартные TCP/UDP-протоколы, где важна производительность и прозрачность трафика.
L7 (уровень прикладной) — как работает и дополнительные возможности
L7-балансировщик — это reverse proxy, который полностью понимает протокол (чаще всего HTTP/HTTPS). Он парсит заголовки, метод, URL, тело запросов, и на основе этого принимает решения о маршрутизации.
Типичные возможности:
-
host- и path-based routing (направить api.example.com/v1 в один сервис, а static.example.com — в другой);
-
SSL/TLS termination (расшифровывает HTTPS) и SSL offloading; поддержка SNI и client certs; также возможен TLS passthrough;
-
вставка/удаление заголовков (X-Forwarded-For, X-Real-IP), URL-rewrite, redirectы;
-
sticky sessions: cookie-based affinity или application cookie insertion;
-
HTTP/2 и WebSocket-прокси (терминирует и проксирует вышеуровневые протоколы);
-
rate-limiting, WAF (Web Application Firewall), caching, compression, auth-hooks;
-
health checks глубокие — HTTP endpoint с кодом 200/204 и проверкой payload/заголовков.
Применение: веб-API, микросервисы, CDN-передняя логика, маршрутизация на основе контента, security-фильтры.
Ключевые различия (коротко)
-
осведомлённость о протоколе: L4 — нет, L7 — да;
-
гранулярность маршрутизации: L4 — IP/порт, L7 — URL/заголовки/методы;
-
TLS: L4 часто passthrough или простая трансляция, L7 — может терминировать и управлять сертификатами;
-
производительность: L4 быстрее и легче по CPU, L7 даёт богатые возможности, но дороже в ресурсах и с большей задержкой;
-
сохранение IP клиента: L7 обычно добавляет X-Forwarded-For; L4 для сохранения оригинального IP требует proxy protocol или transparent routing.
Алгоритмы балансировки
-
Round-robin — по очереди; прост и часто достаточен.
-
Least connections — отдаёт новым соединениям сервера с наименьшим количеством активных сессий; лучше при долгоживущих соединениях.
-
Source IP hash — привязка по IP клиента (affinity); полезно при stateful backend.
-
Weighted — сервера с разной «весом» (мощностью).
-
Consistent hashing — полезно для кэш-кластеров, чтобы минимизировать перекомпонование ключей при добавлении/удалении нод.
Практические нюансы и рекомендации
-
Для статичных HTTP-сервисов и сложных правил маршрутизации берите L7; для высокопроизводительных TCP/UDP-нагрузок — L4.
-
Sticky sessions удобны, но лучше переводить приложение на stateless (сессии в Redis), чтобы не зависеть от привязки.
-
При использовании TLS-termination помните о безопасности: закрывайте доступ к бэкендам по HTTPS/TLS или используйте mTLS между LB и бэкендами.
-
Если нужен оригинальный IP клиента на бэкенде и вы используете L4 passthrough, применяйте proxy protocol или делайте transparent routing; для L7 — считайте X-Forwarded-For.
-
Планируйте drain/connection-draining: при выводе инстанса из пула LB должен дать время завершить текущие соединения.
-
Health checks делайте как поверхностные (TCP) для L4, так и глубокие (HTTP endpoint /health) для L7, чтобы LB корректно исключал нездоровые ноды.