Балансировка нагрузки и горизонтальное масштабирование
Как из одного сервера сделать пул и равномерно раскидать на него трафик.
Балансировщик нагрузки (load balancer) — компонент, распределяющий входящие запросы между несколькими серверами, чтобы ни один не был перегружен.
Вертикально или горизонтально
Вертикальное масштабирование — поставить сервер мощнее. Просто, но упирается в потолок железа и не даёт отказоустойчивости. Горизонтальное — добавить много обычных серверов за балансировщиком. Сложнее, но масштабируется почти линейно и переживает падение узла.
| Вертикальное | Горизонтальное |
| Мощнее одна машина | Много машин |
| Простота | Отказоустойчивость |
| Жёсткий потолок | Почти линейный рост |
| Точка отказа | Нет единой точки отказа |
Схема с балансировщиком
+--> App #1
Клиент -> LB --+--> App #2
+--> App #3Алгоритмы распределения
- Round-robin — по кругу; просто, не учитывает нагрузку.
- Least connections — на наименее загруженный сервер.
- IP hash — клиент всегда на тот же сервер (sticky).
Как работает под капотом
Главное условие горизонтального масштабирования — stateless-сервисы: сервер не хранит состояние сессии у себя, иначе балансировщик обязан слать клиента всегда на тот же узел (sticky session), и падение узла теряет сессии. Поэтому состояние выносят наружу: сессии — в Redis, файлы — в объектное хранилище. Тогда любой запрос может обслужить любой сервер, и пул расширяется добавлением одинаковых инстансов.
Частые ошибки
- Хранить сессию в памяти сервера и потом удивляться, почему нельзя масштабироваться.
- Полагаться только на вертикальный рост до упора в потолок.
- Забыть, что сам балансировщик тоже нуждается в резервировании.
Итог
- Горизонтальное масштабирование = балансировщик + пул одинаковых серверов.
- Ключ — stateless-сервисы; состояние выносится в Redis/объектное хранилище.
- Балансировщик распределяет трафик и сам должен быть отказоустойчив.