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