Перейти к основному содержимому

Балансировка нагрузки

Балансировка нагрузки — распределение трафика и задач между серверами.
Сначала все компоненты веб-приложения могут быть на одном сервере, но потом его мощности может не хватить.
Тогда можно улучшить сервер, добавить 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

Балансировка или проксирование?

Балансировку нагрузки часто называют проксированием. Однако это не совсем так.
Всякий балансировщик – это прокси-сервер, но не всякое проксирование является балансировкой.
Прокси – посредник между клиентом и сервером. Он принимает запрос от клиента и отправляет серверу, а затем получает ответ от сервера и передаёт клиенту. Прокси имеют другое назначение и функции: служат для повышения безопасности и производительности (путем кэширования часто используемого контента и скрытия идентификации и местоположения серверов от клиентов).

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

Round Robin (L4, L7)

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

Weighted Round Robin (L4, L7)

Запросы распределяются по кругу между всеми доступными серверами, но с учетом их веса, который отражает их мощность или приоритет. Отправляется больше запросов на более производительные сервера.
Например, Server A (мощный) получает 60% трафика, Server B – 40%.

Least Connections (L4, L7)

Запросы направляются на тот сервер, который наименее загружен в данный момент. Позволяет избегать перегрузки одного сервера.
Например, если Server A обслуживает 50 соединений, а Server B – 10, новый запрос отправляется на Server B.

Least Response Time

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

Sticky Sessions (L7)

Запросы одного и того же клиента будут передаваться на один и тот же сервер. Если закреплённый за конкретным адресом сервер недоступен, запрос будет перенаправлен на другой сервер.
Например, если пользователь авторизовался на Server A, все его следующие запросы направляются туда, чтобы не потерять состояние сессии.

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

Аппаратные (Hardware Load Balancer, HLB)

  • физические устройства с сетевыми процессорами (ASIC), которые обрабатывают пакеты быстрее, чем программные решения
  • часто используются в крупных дата-центрах
    Примеры: F5 Big-IP, Citrix NetScaler

Как работают:

  • клиент отправляет запрос на IP-адрес балансировщика
  • балансировщик обрабатывает запрос на аппаратном уровне
  • трафик направляется на нужный сервер с минимальными задержками

Программные (Software Load Balancer, SLB)

  • ПО на сервере, которое выполняет функции балансировки
  • гибкое, дешевле аппаратных решений, но требует мощностей сервера
    Примеры: Nginx, HAProxy, Envoy

Как работают:

  • SLB развернут на виртуальной машине / физическом сервере
  • принимает входящие запросы и перенаправляет их на сервера по заданным алгоритмам
  • может использовать L4 или L7-балансировку

Виртуальные (Virtual Load Balancer, VLB)

  • программные балансировщики, которые работают в виртуальных средах или в облаке
  • поддерживают авто-масштабирование (динамическое изменение количества серверов)
    Примеры: AWS ELB, Azure Load Balancer, Yandex Network Load Balancer

Как работают:

  • облачный балансировщик получает запрос
  • в зависимости от нагрузки создает новые инстансы или перераспределяет трафик
  • автоматически масштабируется и настраивается
  • Инстанс (Instance) – виртуальная / физическая машина, которая обрабатывает запросы

Методы балансировки

DNS-балансировка (уровень L3)

DNS-сервер возвращает разные IP-адреса на один DNS-запрос.

  • не учитывает загрузку серверов и может кэшироваться клиентами (могут быть задержки в обновлении маршрутов)
  • например, api.example.com может вести на разные серверы

Балансировка через прокси-сервер (L7)

Запросы поступают на прокси → он анализирует содержимое и перенаправляет на нужные серверы

Прямая балансировка (L4)

Изменяет MAC-адреса пакетов, направляет их напрямую на backend-серверы

NAT-балансировка (L3-L4)

Изменяет IP-адреса и порты пакетов, направляет трафик на разные серверы онлайн

Примеры методов балансировки для разных типов нагрузки

Статический контент (изображения, видео, CSS, JavaScript)

→ DNS-балансировка, кэширование через CDN (подробнее)
Пример: пользователь запрашивает изображение с сайта
DNS-балансировщик (Cloudflare, Nginx) направляет запрос на ближайший географически сервер CDN
CDN отдает изображение из кэша, без загрузки с основного сервера

API-запросы (REST, GraphQL)

Пример: REST API с /auth и /data:
→ L4-балансировщик (NAT, или HAProxy) направляет трафик API на пул серверов, распределяет нагрузку
→ L7-балансировщик (например, Nginx) перенаправляет по URL или заголовкам:
/auth — на серверы аутентификации
/data — на серверы обработки данных

Веб-приложения (динамический контент, пользовательские сессии)

→ L7-балансировка с Sticky Sessions для привязки пользователя к одному серверу
Пример: L7-балансировщик (F5 BIG-IP) определяет пользователя по cookie и направляет его запросы на один и тот же сервер, чтобы не потерялись данные сессии (корзина, авторизация)

Базы данных

→ L4-балансировка с Least Connections (отправка запросов на серверы с минимальной нагрузкой)
→ репликация БД (разделение нагрузки между мастером (записи) и репликами (чтение)
Пример: кластер PostgreSQL с мастером и 3 репликами.
L4-балансировщик (например, Pgpool-II) отправляет запросы на чтение (SELECT) на реплики, чтобы снизить нагрузку на мастер
Запросы INSERT/UPDATE идут на мастер

Оркестратор vs балансировщик

Балансировщик распределяет трафик между существующими серверами.
Оркестратор (Kubernetes или Docker Swarm) управляет количеством серверов в зависимости от нагрузки.

Пример работы:

В системе есть 3 сервера, балансировщик распределяет трафик между ними.
→ если нагрузка растет, Kubernetes AutoScaler создает новый сервер
→ балансировщик автоматически включает его в распределение

Распределение нагрузки и авто-масштабирование

Разные процессы, но могут работать вместе.

Распределение нагрузки: функция балансировщика. Распределяет запросы между существующими серверами.

  • не создает и не удаляет серверы, перераспределяет трафик между существующими
  • работает всегда, независимо от количества серверов
    Пример: есть 3 сервера, на них поступает 6000 RPS (запросов в секунду). Балансировщик равномерно распределяет их (по 2000 RPS на сервер)

Авто-масштабирование: процесс динамического изменения количества серверов.

Им управляет оркестратор или облачная платформа.

  • если нагрузка растет → создаются новые серверы
  • если нагрузка падает → удаляются лишние
  • балансировщик узнает о новых серверах и включает в балансировку
    Пример: запросы увеличились до 12000 RPS. Авто-масштабирование добавляет 3 новых сервера (всего теперь 6), а балансировщик перераспределяет трафик между ними (по 2000 RPS на сервер)

Балансировка и авто-масштабирование работают вместе:

— балансировщик распределяет текущий трафик
— оркестратор (Kubernetes, AWS Auto Scaling) увеличивает или уменьшает число инстансов
— балансировщик автоматически включает новые инстансы в распределение

Что учитывать при проектировании балансировщиков

Тип нагрузки

→ какой трафик распределяется: HTTP-запросы, потоковое видео, базы данных или API.

Скалируемость

→ поддержка горизонтального масштабирования без изменения бизнес-логики

Отказоустойчивость

→ обнаружение и исключение неработающих серверов из пула

Управление сессиями

→ если приложение требует сохранения состояния, нужно учитывать Sticky Sessions или использовать централизованные хранилища сессий

Безопасность

→ контроль доступа, защита от DDoS-атак, шифрование трафика

Материалы

  1. Что такое балансировщик нагрузки и как он работает
  2. Введение в современную сетевую балансировку и проксирование
  3. Балансировщик нагрузки - что это такое, как работает Load balancer
  4. Балансировка нагрузки: основные алгоритмы и методы
  5. Балансировка трафика на межсетевые экраны с помощью брокеров сетевых пакетов
  6. Как устроен балансировщик нагрузки: алгоритмы, методы и задачи
  7. Load Balancer и Reverse Proxy в микросервисной архитектуре
  8. Load Balancers для систем оркестрации
  9. Сравнение решений по балансировке высоконагруженных систем
  10. Балансировка нагрузки в Облаках
  11. Балансировка нагрузки серверов
  12. Сетевой балансировщик нагрузки
  13. DNS Балансировка нагрузки: что это такое и как ее использовать
  14. Как работает L3 балансер. Как работает L3 балансировщик нагрузки
  15. Обзор балансировки облачной нагрузки
  16. Балансировка нагрузки на L3, L4 и L7. Преимущества и отличия

Nginx и балансировка нагрузки

  1. Как настроить Nginx в качестве балансировщика нагрузки
  2. Как настроить балансировку нагрузки с помощью Nginx

Envoy Proxy

  1. Что такое Envoy, зачем он нужен и как работает
  2. Envoy. 1. Введение
  3. Envoy для самых маленьких
  4. Envoy — как писать чистый бизнес-код для микросервисной архитектуры
  5. Envoy Proxy — один за всех Load Balancer
  6. Envoy как универсальный сетевой примитив

HAProxy и другие решения

  1. Защищаем сервис от перегрузки с помощью HAProxy
  2. Настройка pgpool-II + PostgreSQL + Streaming replication + Hot standby в среде AWS
  3. Pgpool-II
  4. Балансировка нагрузки с помощью AWS ELB
  5. NSX Advanced Load Balancer – умный автомасштабируемый балансировщик нагрузки. Часть 1: архитектура и особенности | Часть 2
  6. Критика существующих методов балансировки

Видео

  1. Балансировка нагрузки NGINX. От простого к сложному
  2. LoadBalancer - балансировщик нагрузки. Что это? Как работает. HA LoadBalancer
  3. Что такое балансировщик / Урок 30 / Уровни балансировки, алгоритмы балансировки
  4. Балансировка нагрузки PostgreSQL глазами сетевого инженера — Игорь Алов, PGConf.Russia 2023
  5. Балансировщик нагрузки. Опыт разработки Яндекс.Облака (Сергей Еланцев)
  6. Сетевые сервисы: балансировщик нагрузки – Анастасия Морозова
  7. Балансировка нагрузки в Яндексе: новые проблемы роста
  8. L3 балансировка трафика на базе технологии DPDK
  9. Подкаст: Podlodka #214 – Балансировка нагрузки

Конференции

  1. HighLoad++: Российский балансировщик нагрузки / Павел Иващенко (TrafficSoft)
  2. HighLoad++: Никита Духовный — Балансировка нагрузки и отказоустойчивость в Одноклассниках
  3. HighLoad++: Как мы DNS для CDN делали / Константин Новаковский (G-Core Labs)
  4. HighLoad++: Балансировка на скорости проводов / Андрей Домась, Вячеслав Морозов