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

Выбор правильного алгоритма балансировки — это не просто техническое решение, а стратегический выбор.

Критерии выбора: что действительно важно
  1. Утилизация ресурсов (Максимум от каждого сервера): Неравномерное распределение — бич многих систем. Один сервер может работать на 90% CPU, пока соседний простаивает на 20%. Это потенциальная точка отказа.
  2. Адаптивность (Статика против динамики): Статические алгоритмы (как Round Robin) работают по жестким правилам. Динамические — принимают решения на основе актуальных метрик (CPU, соединения). Компромисс очевиден: статика быстрее, динамика умнее, но требует ресурсов на мониторинг.
  3. Session Persistence (Sticky Sessions): Удобное для stateful-приложений, но создает проблемы при неправильном использовании.
  4. Вычислительная сложность: При высоких нагрузках каждая секунда критична. Сложные алгоритмы могут стать узким местом самого балансировщика. Сравни метрики: Round Robin делает ~50,000 решений в секунду, Least Connections — ~35,000 (тратит время на polling), Consistent Hashing — ~40,000.

Пример из практики: В 2018 году GitHub столкнулся с каскадным отказом во время DDoS-атаки. Их Round-Robin направлял равное количество запросов на все серверы, не учитывая, что некоторые обрабатывали сложные Git-операции, а другие — простые веб-запросы.

Разбираем алгоритмы в действии
1. Weighted Round Robin
  • Плюсы: Простота, предсказуемость, нет лишних вычислений.
  • Минусы (Статичность): Не реагирует на изменения нагрузки.

Кейс Netflix: они использовали WRR для распределения трафика по Availability Zones. Когда в одной зоне начались проблемы с сетью, алгоритм продолжал упрямо слать туда трафик пропорционально весам, игнорируя увеличившуюся латентность.

2. Least Connections / Least Response Time

Динамический подход. Балансировщик отслеживает количество активных соединений. Идеально подходит для WebSocket-приложений, где соединения могут жить часами.

Продвинутая вариация (Least Response Time) комбинирует количество соединений с актуальным временем отклика. Минус подхода: высокая техническая сложность. Частый опрос (polling) серверов сам по себе создает огромную нагрузку на сеть.

3. Power of Two Choices

Когда серверов тысячи, сканировать их все (O(N)) — слишком долго. Алгоритм берет 2 случайных сервера, сравнивает их метрики и отправляет запрос на наименее загруженный. Это компромисс между простотой рандома и эффективностью аналитики.

Преимущество: Математически доказано, что выбор из двух опций предотвращает поведение, когда несколько балансировщиков одновременно кидают весь трафик на один освободившийся сервер. Amazon активно использует этот алгоритм в своих Application Load Balancers.

А есть ли еще?

Да! Есть Hashing и Consistent Hashing (Консистентное хеширование). Это важный алгоритм, но он применяется чаще не для балансировки классических API-серверов, а для распределения данных по шардам в базах данных и кэшах.