Гид по технологиям

Балансировка нагрузки: руководство по алгоритмам и практике

9 min read Сети Обновлено 19 Dec 2025
Балансировка нагрузки: алгоритмы и практика
Балансировка нагрузки: алгоритмы и практика

Фотография оптоволоконных сетевых кабелей, подключённых к серверу

Быстрые ссылки

  • Что делают балансировщики нагрузки

  • Алгоритмы балансировки

  • Другие характеристики балансировщиков

  • Балансировка на уровне 4 и уровне 7

  • Как выбрать и внедрить

Что делают балансировщики нагрузки

Балансировщики нагрузки выступают как обратный прокси перед группой серверов приложения. Клиенты подключаются к единой точке входа, а балансировщик решает, какому бэкенду отправить каждый запрос. Это прозрачно для внешнего клиента и даёт инфраструктуре возможность масштабироваться и оставаться доступной при отказе отдельных узлов.

Балансировщики бывают программными и аппаратными. В ПО роль балансировщика часто выполняют NGINX, HAProxy или специализированные модули в облачных сетевых сервисах. Аппаратные решения поставляются отдельными устройствами или виртуальными appliances от провайдеров сетевой инфраструктуры.

Обычно балансировщики проверяют здоровье бэкендов. Если узел перестаёт отвечать или возвращает ошибки, он исключается из пула и не получает новый трафик. Это снижает вероятность простоя и повышает доступность сервиса.

Важно: цель балансировщика — максимизировать пропускную способность и эффективное использование ресурсов. Горизонтальное масштабирование (добавление узлов) обычно предпочтительнее вертикального (увеличение CPU/памяти на одном узле): оно даёт лучшую избыточность и гибкость.

Основные понятия

  • Балансировка нагрузки — распределение входящих запросов между несколькими серверами.
  • Бэкенд/сервер пул — набор серверов, способных обслуживать запросы.
  • Sticky session (прикрепление сессии) — механизм, гарантирующий, что клиент продолжает обращаться к одному и тому же бэкенду.
  • SSL termination — расшифровка HTTPS на балансировщике.

Алгоритмы балансировки

Алгоритмы можно разделить на две фундаментальные группы:

  • Статические — используют заранее заданные правила и не ориентируются на текущее состояние бэкендов. Прогнозируемы, просты в отладке, но могут посылать трафик на перегруженные узлы.
  • Динамические — принимают решения на основе текущей телеметрии: количества подключений, загрузки CPU, пропускной способности и т.п. Более гибкие, но требуют метрик и немного больше накладных расходов.

Далее — разбираем популярные стратегии и их характерные случаи использования.

Статические стратегии

  • Round robin — простой цикл по списку бэкендов (A, B, C, A…). Подходит для однотипных серверов и равномерного трафика.

  • Взвешенный round robin — каждой ноде присваивают вес; более мощные серверы получают больше запросов. Применимо при смешанной инфраструктуре.

  • Random — выбор случайного бэкенда. Прост, но непредсказуем при пиковых нагрузках.

  • Hashed (по IP или по ключу) — хеширует IP клиента или определённый атрибут запроса и всегда направляет клиента на тот же бэкенд. Удобно для сохранения привязки без использования cookies.

Динамические стратегии

  • Fewest connections — направляет запросы на сервер с наименьшим числом открытых соединений. Эффективен в сценариях с долгоживущими соединениями.

  • Highest available bandwidth — выбирает сервер с наибольшим доступным сетевым пропуском. Полезно для потоковой передачи мультимедиа и больших файлов.

  • Health/load endpoint — балансировщик опрашивает кастомные метрики (CPU, память, очередь задач) и принимает решения на их основе. Требует дополнительной интеграции между приложением и балансировщиком.

Когда какой алгоритм выбирать

Примеры:

  • Небольшой веб-сайт с одинаковыми серверами: round robin.
  • Смесь виртуалок и мощных машин: weighted round robin.
  • Реaltime-сервисы с долгими соединениями: fewest connections.
  • Необходима привязка клиента к серверу без cookie: hashed.

Другие характеристики балансировщиков

Балансировщик может привнести дополнительные сложности и возможности. Ниже — практические аспекты и рекомендации.

Sticky sessions (фиксация сессий)

Проблема: некоторые приложения хранят состояние на локальном сервере. Если запросы клиента пойдут к разным бэкендам, состояние потеряется.

Варианты решения:

  • Использовать hashed алгоритм или ip-hash для привязки клиента.
  • Включить опцию sticky sessions, которая смотрит на cookie или специальный заголовок.
  • Лучше решение — вынести состояние в централизованное хранилище (Redis, Memcached, база данных). Это уменьшает зависимость от конкретного бэкенда.

Важно: привязка по IP ненадёжна для клиентов за NAT или мобильных пользователей.

SSL/TLS: termination vs passthrough

  • Termination: балансировщик завершает TLS-сеанс и пересылает трафик на бэкенды по HTTP. Упрощает инспекцию и маршрутизацию по заголовкам, снижает нагрузку на бэкенды.
  • Passthrough: балансировщик пересылает зашифрованный трафик как есть. Без расшифровки он не может принимать решения по заголовкам/куки. Подходит, если политика безопасности требует end-to-end шифрования.

Решение зависит от политики безопасности: для критичных данных часто выбирают passthrough или повторное шифрование (TLS между LB и бэкендом).

Проверки работоспособности (health checks)

Типы проверок:

  • TCP-проверка — проверяет, открыт ли порт.
  • HTTP-проверка — запрашивает конкретный URL и анализирует код ответа.
  • Пользовательская проверка — вызывает /health или /ready, возвращая детализированный статус.

Рекомендуется разделять readiness и liveness: readiness определяет, готов ли узел принимать трафик, liveness позволяет перезапускать зависшие процессы.

Масштабирование пула

Балансировщик должен поддерживать динамическое добавление и удаление бэкендов. При автоскейлинге важно корректно интегрировать регистрацию/дегистрацию узлов и обеспечить стабильную проверку здоровья.

Балансировка на уровне 4 и уровне 7

Понимание разницы помогает выбирать подходящий инструмент.

L4 — транспортный уровень

Работает на уровне TCP/UDP. Решения принимаются по информации транспортного уровня (IP, порт). L4 быстрый и эффективный, не декодирует содержимое пакета.

Плюсы:

  • Низкая задержка и высокая пропускная способность.
  • Работает с зашифрованным трафиком (passthrough).

Минусы:

  • Нет доступа к HTTP-заголовкам, кукам и телу запроса.
  • Ограниченная возможность гибкой маршрутизации.

L7 — уровень приложения

Понимает структуру HTTP/HTTPS и может принимать решения по заголовкам, uri, cookies и содержимому.

Плюсы:

  • Точная маршрутизация на основе содержимого запроса.
  • Возможность реализации A/B-тестирования, Canary, маршрутизации по заголовкам.

Минусы:

  • Более высокий overhead: парсинг и обработка каждого запроса.
  • Если выполняется расшифровка TLS, требуется управление сертификатами и безопасностью.

Выбор между L4 и L7 зависит от требуемого уровня контроля над трафиком и допустимого влияния на производительность.

Как выбрать и внедрить: практическое руководство

Ниже — пошаговый мини-процесс для принятия решения и развёртывания балансировщика.

  1. Определите требования к маршрутизации. Нужна ли инспекция заголовков, cookies, URL?
  2. Оцените требования безопасности: требуется ли end-to-end шифрование?
  3. Определите характеристики нагрузки: много коротких запросов или мало длительных соединений?
  4. Выберите алгоритм (статический или динамический) на основе предыдущих ответов.
  5. Настройте health checks и readiness/liveness endpoints.
  6. Подготовьте тестовый стенд и нагрузочные тесты.
  7. Разверните в стадии Canary и мониторьте метрики.
  8. Автоматизируйте регистрацию/удаление бэкендов и ротацию сертификатов.

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

Конфигурационные примеры

Пример простого upstream в NGINX с round robin и проверкой через /health:

upstream app_backend {
    server 10.0.0.1:8080;
    server 10.0.0.2:8080;
    server 10.0.0.3:8080;
}

server {
    listen 80;

    location / {
        proxy_pass http://app_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location /health {
        proxy_pass http://app_backend/health;
    }
}

Пример HAProxy с балансировкой по наименьшему количеству подключений:

frontend http_in
    bind *:80
    default_backend app_pool

backend app_pool
    balance leastconn
    server app1 10.0.0.1:8080 check
    server app2 10.0.0.2:8080 check
    server app3 10.0.0.3:8080 check

Mermaid-диаграмма для выбора между L4 и L7:

flowchart TD
  A[Нужна проверка заголовков/куки/URL?] -->|Да| B[Выберите L7]
  A -->|Нет| C[Выберите L4]
  B --> D{Требуется end-to-end шифрование}
  D -->|Да| E[Выберите L7 с TLS passthrough или повторным шифрованием]
  D -->|Нет| F[Выберите L7 с termination]
  C --> G{Нужна высокая пропускная способность}
  G -->|Да| H[Оптимизированный L4]
  G -->|Нет| I[L4 достаточно]

Роли и задачи при внедрении

Роль: DevOps / Инженер по развёртыванию

  • Настроить и протестировать health checks.
  • Интегрировать автоскейлинг с реестром бэкендов.
  • Автоматизировать ротацию сертификатов.

Роль: Разработчик приложения

  • Предоставить endpoint readiness и health.
  • Минимизировать хранение сессий на локальном диске.

Роль: SRE / Инженер по надёжности

  • Определить SLI/SLO, влияющие на настройку балансировщика.
  • Проработать план реагирования на отказ балансировщика.

План приёма и тесты

Критерии приёмки (пример):

  • Балансировщик корректно распределяет трафик по выбранному алгоритму.
  • Узел, помеченный как unhealthy, получает 0% нового трафика.
  • При включении нового узла он начинает принимать трафик в течение X секунд (настройка).
  • TLS сертификаты корректно обслуживаются после ротации.

Тест-кейсы:

  • Функциональный: добавить/удалить бэкенд и убедиться, что трафик перераспределяется.
  • Нагрузочный: провести нагрузочный тест, имитируя рабочую пиковую нагрузку.
  • Отказ: принудительно отключить узел и проверить отсутствие влияния на клиентов.
  • Безопасность: проверить сценарии MITM и корректность passthrough/termination.

Инцидентный план и откат

Шаги при ухудшении состояния после изменения конфигурации:

  1. Откатить конфигурацию балансировщика на последнюю рабочую версию.
  2. Временно перевести трафик на резервный балансировщик или на минимальный набор бэкендов.
  3. Проанализировать логи и метрики (latency, error rate, CPU, connections).
  4. Восстановить изменение только после устранения первопричины и тестирования в staging.

Рекомендации по безопасности

  • Минимизируйте число людей и сервисов с доступом к управлению балансировщиком.
  • Шифруйте управление (API, конфигурации) и храните секреты в защищённом хранилище.
  • Используйте повторное шифрование трафика (TLS между LB и бэкендом), если бэкенды обрабатывают критичные данные.
  • Обеспечьте мониторинг и оповещения на увеличенную латентность и ошибочные коды ответа.

Конфиденциальность и соответствие требованиям (GDPR и др.)

  • Если балансировщик логирует данные о клиентах (IP, заголовки), убедитесь, что хранение логов соответствует требованиям по защите персональных данных.
  • Рассмотрите маскирование или агрегирование адресов в логах, если в вашей юрисдикции это требуется.
  • Документируйте, где и как хранятся данные сессий и кто имеет к ним доступ.

Матрица совместимости: L4 vs L7 (кратко)

ФункцияL4L7
Маршрутизация по URLнетда
Маршрутизация по cookieнетда
Поддержка passthrough TLSдаограничено
Затраты на CPUнизкиевыше
Поддержка долгих соединенийдада

Примеры когда балансировщик не решит проблему

  • Приложение не масштабируется горизонтально из-за жёсткой зависимости от локального состояния. Решение — рефакторинг, перенос состояния в внешнее хранилище.
  • Узкая шина в базе данных: балансировщик распределит запросы, но узкое место останется. Решение — оптимизация БД или шардирование.

Шаблон чек-листа для развёртывания

  • Определены требования к маршрутизации (L4/L7).
  • Настроены health checks (readiness/liveness).
  • Выбрана стратегия балансировки.
  • Протестирован сценарий отказа бэкенда.
  • Настроен мониторинг и алерты.
  • Проведён Canary/blue-green rollout.
  • Документирована процедура отката.

Ментальные модели и эвристики

  • Правило малого цикла: начните с простой стратегии (round robin), наблюдайте и улучшайте по необходимости.
  • Разделяй и властвуй: требования к маршрутизации и безопасности решают выбор L4/L7.
  • Минимизируйте stateful-зависимости от бэкенда; где возможно, используйте внешнее состояние.

Краткая сводка полезных практик

  • Разделите readiness и liveness checks.
  • Предпочитайте динамические алгоритмы для production, если у вас есть метрики.
  • Для критичных данных используйте TLS passthrough или повторное шифрование.
  • Тестируйте сценарии отказа и масштабирования заранее.

Важно: всегда документируйте свои решения и причины выбора конкретной архитектуры.

Итог

Балансировщики нагрузки — ключевой элемент современной сетевой архитектуры. Правильный выбор уровня (L4 или L7), алгоритма и политики SSL/TLS вместе с грамотными health checks и автоматизацией регистрации бэкендов даёт надёжность, гибкость и масштабируемость. Начните с простых настроек, измеряйте поведение и итеративно улучшайте конфигурацию.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Копирование файлов на USB в Windows 10
Инструкции

Копирование файлов на USB в Windows 10

Запуск игр Steam с внешнего диска
Гайды

Запуск игр Steam с внешнего диска

Как рекламодатели получают ваши данные и как их ограничить
Конфиденциальность

Как рекламодатели получают ваши данные и как их ограничить

Создать изогнутый текст в Word
Microsoft Word

Создать изогнутый текст в Word

Конвертация Google Sheets в Excel
Инструкции

Конвертация Google Sheets в Excel

Запретить отслеживание приложений на iPhone и iPad
Конфиденциальность

Запретить отслеживание приложений на iPhone и iPad