На каких уровнях (уровнях OSI/сетевой модели) возможна балансировка нагрузки?

«На каких уровнях (уровнях OSI/сетевой модели) возможна балансировка нагрузки?» — вопрос из категории Архитектура, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Балансировка нагрузки (Load Balancing) может быть реализована на разных уровнях сетевого взаимодействия, каждый из которых решает свои задачи. Основные уровни с точки зрения QA/тестирования производительности и отказоустойчивости:

Уровень (OSI) Название Принцип работы Инструменты/Примеры Что важно для тестирования
L7 (Прикладной) HTTP/HTTPS балансировка Балансировщик анализирует содержимое HTTP-запроса (URL, заголовки, cookies, тело). Позволяет маршрутизировать запросы на основе бизнес-логики. Nginx, HAProxy (режим http), AWS ALB. Проверка корректности маршрутизации (например, запросы к /api идут на один бэкенд, а к /static — на другой), обработка sticky sessions (сессионных cookie).
L4 (Транспортный) TCP/UDP балансировка Балансировщик работает с IP-адресами и портами, не анализируя содержимое пакетов. Быстрее, но менее гибко. HAProxy (режим tcp), AWS NLB, IPVS. Тестирование отказоустойчивости: при падении одного бэкенда TCP-соединения должны переключаться на живой. Проверка работы с long-lived соединениями (например, WebSocket).
L3 (Сетевой) IP-балансировка (Anycast) Распределение трафика на уровне IP-адресации, часто используется в DNS. BGP Anycast, Cloudflare. Для QA это чаще внешняя инфраструктура. Тестируется геораспределение и время отклика из разных регионов.

С точки зрения QA-инженера:

  1. При тестировании производительности (нагрузочном тестировании) важно понимать, на каком уровне работает балансировщик, чтобы корректно интерпретировать метрики и распределение запросов между серверами.
  2. При тестировании отказоустойчивости нужно моделировать сбои бэкенд-серверов и проверять, как балансировщик перенаправляет трафик и восстанавливается ли сервис.
  3. Пример конфигурации Nginx (L7) для тестового стенда:

    upstream backend_servers {
        server backend1.example.com:8080;
        server backend2.example.com:8080;
        # Метод балансировки
        least_conn;
    }
    
    server {
        listen 80;
        location / {
            proxy_pass http://backend_servers;
            # Для тестирования sticky sessions можно добавить cookie
            # proxy_cookie_path / "/; Secure; HttpOnly";
        }
    }

    Выбор уровня балансировки напрямую влияет на стратегию тестирования сценариев высокой доступности и производительности.