Балансировка нагрузки и горизонтальное масштабирование

Как из одного сервера сделать пул и равномерно раскидать на него трафик.

Балансировщик нагрузки (load balancer) — компонент, распределяющий входящие запросы между несколькими серверами, чтобы ни один не был перегружен.

Вертикально или горизонтально

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

ВертикальноеГоризонтальное
Мощнее одна машинаМного машин
ПростотаОтказоустойчивость
Жёсткий потолокПочти линейный рост
Точка отказаНет единой точки отказа

Схема с балансировщиком

             +--> App #1
Клиент -> LB --+--> App #2
             +--> App #3

Алгоритмы распределения

  • Round-robin — по кругу; просто, не учитывает нагрузку.
  • Least connections — на наименее загруженный сервер.
  • IP hash — клиент всегда на тот же сервер (sticky).

Как работает под капотом

Главное условие горизонтального масштабирования — stateless-сервисы: сервер не хранит состояние сессии у себя, иначе балансировщик обязан слать клиента всегда на тот же узел (sticky session), и падение узла теряет сессии. Поэтому состояние выносят наружу: сессии — в Redis, файлы — в объектное хранилище. Тогда любой запрос может обслужить любой сервер, и пул расширяется добавлением одинаковых инстансов.

Частые ошибки

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

Итог

  • Горизонтальное масштабирование = балансировщик + пул одинаковых серверов.
  • Ключ — stateless-сервисы; состояние выносится в Redis/объектное хранилище.
  • Балансировщик распределяет трафик и сам должен быть отказоустойчив.
Проверьте себя
1. Какое условие критично для горизонтального масштабирования сервисов?
AСервисы должны быть stateless, состояние вынесено наружу
BСерверы должны быть как можно мощнее
CНужно хранить сессии в памяти каждого сервера
DБалансировщик должен быть единственным
2. В чём главный недостаток вертикального масштабирования?
AОно невозможно технически
BЖёсткий потолок железа и сохраняется единая точка отказа
CОно всегда дороже горизонтального в разы
DОно требует балансировщика
3. Какой алгоритм балансировки привязывает клиента к одному и тому же серверу?
ARound-robin
BLeast connections
CIP hash (sticky)
DСлучайный выбор