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

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

Типы балансировки

1. Клиентская балансировка

Клиент сам выбирает сервер из списка доступных (например, по IP), используя свой алгоритм (случайный выбор или правило).

  • Плюсы: минимальная задержка, нет промежуточного звена.
  • Минусы: клиент должен знать о серверах и обновлять список при изменениях, сложнее поддерживать в больших системах.

Когда использовать: небольшие системы или сценарии, где критична минимальная задержка.

2. Серверная балансировка

Специальный компонент (балансировщик) принимает запросы и распределяет их по серверам.

  • Алгоритмы: Random, Round Robin, Weighted Round Robin, Least Connections, Hash-based (для sticky sessions).
  • Sticky Sessions: запросы от одного клиента всегда идут на один сервер (по хешу IP или ID сессии). Нужны для stateful-систем; минус — возможна неравномерная нагрузка.
  • Плюсы: клиенту достаточно одного адреса, легко добавлять серверы в пул.
  • Минусы: балансировщик — потенциальная точка отказа, небольшая дополнительная задержка.

Когда использовать: большинство современных высоконагруженных систем (NGINX, HAProxy, AWS ELB).

3. L4 и L7

  • L4 (транспортный уровень): работа с TCP/UDP, перенаправление соединения целиком без разбора содержимого. Быстрее и проще, но нельзя маршрутизировать по URL или заголовкам.
  • L7 (прикладной уровень): разбор HTTP (заголовки, URL, cookies), маршрутизация по контенту, sticky sessions. Гибче, но медленнее и нагружает балансировщик сильнее.

Когда использовать: L4 — простые сценарии и низкая задержка; L7 — сложные приложения с маршрутизацией по содержимому.

4. DNS-балансировка

DNS возвращает разные IP для одного домена, распределяя клиентов по серверам или дата-центрам.

  • GeoDNS: учёт геолокации клиента и направление на ближайший дата-центр (снижение latency).
  • Плюсы: нет единого балансировщика как точки отказа, подходит для распределённых систем.
  • Минусы: ограниченный контроль, кэширование DNS на клиенте может давать неравномерную нагрузку.

Когда использовать: глобальные системы с несколькими дата-центрами или для устранения SPOF балансировщика.

Проблема единой точки отказа

Если балансировщик падает, система становится недоступной. Решения: несколько балансировщиков с DNS-балансировкой, активный/резервный режим (active-passive), GeoDNS между дата-центрами. В крупных системах на входе — несколько L4-балансировщиков, внутри дата-центра — L7 (например, NGINX) между серверами.