Балансировка нагрузки
Балансировка нагрузки — распределение трафика и задач между серверами.
Сначала все компоненты веб-приложения могут быть на одном сервере, но потом его мощности может не хватить.
Тогда можно улучшить сервер, добавить CPU/RAM (вертикальное масштабирование) или разделить задачи на несколько серверов (горизонтальное масштабирование).
В случае горизонтального масштабирования появляется несколько серверов, которые работают над одной задачей. Когда пользователь отправляет запрос, какой именно сервер должен взять на себя задачу обработки запроса? Именно для этого и нужна балансировка нагрузки.
Принцип работы балансировщика
Клиенты отправляют запросы на балансировщик:
- он выбирает сервер по заданному алгоритму
- сервер обрабатывает запрос и отправляет ответ
Что даёт балансировка нагрузки
Предотвращает перегрузку серверов
Балансировщик распределяет входящие запросы между серверами с помощью алгоритмов (см. подробнее ниже).
- Пример: в интернет-магазине, если один сервер обслуживает 1000 пользователей, а другой – 50, балансировщик направляет новые запросы на менее загруженный сервер
Минимизирует задержки
Использует географическое распределение трафика (GSLB) или кэширование статического контента.
- Пример: в видеостриминговом сервисе балансировщик направляет пользователей к ближайшему к ним серверу → уменьшается время загрузки видео
Повышает отказоустойчивость
При отказе одного из серверов балансировщик исключает его из доступных, перенаправляет трафик на рабочие узлы.
- Пример: если выходит из строя один сервер БД, балансировщик перенаправляет запросы к реплике → непрерывная работа сервиса
Улучшает масштабируемость системы
Можно добавлять / удалять серверы без остановки работы приложения.
-
Пример: в периоды высокого трафика добавляются новые с ерверы, а по окончанию нагрузки – убираются, без влияния на пользователей
-
Защита от DDoS-атак. Ее обеспечивает задержка ответа, когда фоновые серверы не видят клиента до подтверждения по TCP
Три уровня распределения нагрузки (в модели OSI)
Сетевой (L3, IP)
За один IP-адрес сервера отвечают разные физические машины. К сетевому уровню относятся решения, которые не терминируют на себе пользовательские сессии. Они просто перенаправляют трафик и не работают в проксирующем режиме. На сетевом уровне балансировщик просто решает, на какой сервер передавать пакеты. Сессию с клиентом осуществляет сервер.
Примеры ПО: BIRD, Keepalived, PVS (IP Virtual Server), РБК NLB
Транспортный (L4, TCP/UDP)
Маршрутизация запросов по номерам портов и соединениям, без анализа содержимого пакетов.
Выбор сервера, на котором будет обрабатываться запрос, может осуществляться в соответствии с алгоритмами: путём простого кругового перебора, путём выбора наименее загруженного сервера из пула и т.п.
Примеры ПО: HAProxy, Nginx (stream module, балансировка TCP и UDP-трафика), LVS, CyberProtect
Прикладной (L7, HTTP/HTTPS)
Анализ HTTP-запросов и маршрутизация на основе URL, заголовков или cookies.
Пример L7-балансировщика - pgpool, который распределяет запросы к PostgreSQL по их содержанию: чтение — один сервер, запись — другой.
Примеры ПО: pgpool, Nginx, Traefik, Envoy, F5 BIG-IP, РБК NLB