На каких уровнях архитектуры может располагаться балансировщик нагрузки (Load Balancer)?

«На каких уровнях архитектуры может располагаться балансировщик нагрузки (Load Balancer)?» — вопрос из категории Архитектура, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Балансировщик нагрузки (Load Balancer, LB) может быть реализован на разных уровнях сетевой модели OSI, решая различные задачи:

Уровень Назначение Технологии/Примеры
DNS-уровень Распределение запросов между географически разными центрами обработки данных (GSLB). Простой Round Robin или с учетом здоровья. Route 53 (AWS), Cloud DNS (GCP).
Сетевой (L4) Балансировка на основе IP-адресов, портов и протоколов (TCP/UDP). Не анализирует содержимое пакетов. Nginx (stream), HAProxy (mode tcp), AWS Network Load Balancer (NLB).
Прикладной (L7) Балансировка на основе содержимого HTTP/HTTPS запросов (URL, заголовки, cookies). Позволяет маршрутизировать запросы к разным сервисам. Nginx (http), HAProxy (mode http), AWS Application Load Balancer (ALB), Ingress-контроллеры в Kubernetes (например, ingress-nginx).
Внутри кластера Балансировка трафика между экземплярами (подами) одного сервиса внутри платформы оркестрации. Kubernetes Service (тип ClusterIP с селектором), Istio (sidecar-прокси).
На стороне клиента Клиент (микросервис) сам выбирает экземпляр сервера из списка, полученного от service discovery. Ribbon (в стеке Spring Cloud Netflix), gRPC-клиенты с балансировкой.

Пример конфигурации Nginx (L7) для балансировки между двумя бэкендами:

http {
    upstream backend_servers {
        # Алгоритм балансировки (по умолчанию round-robin)
        server 10.0.1.1:8080 weight=3; # Сервер с большим весом
        server 10.0.1.2:8080;
        server 10.0.1.3:8080 backup;   # Резервный сервер
    }

    server {
        listen 80;
        location / {
            proxy_pass http://backend_servers;
            # Передаем заголовок с реальным IP клиента
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

Выбор уровня: L4 — для производительности и непрозрачных протоколов (базы данных, игровые серверы). L7 — для интеллектуальной маршрутизации в веб-приложениях и API.