Балансировка нагрузки: основные алгоритмы и методы
Перегрузка инфраструктуры — проблема, с которой может столкнуться любой проект, особенно в стадии активного роста, в период активной рекламной кампании или, например, в случае DDoS атаки.
Чтобы сервер «не падал», а пользователи получали запрошенный контент, недостаточно просто наращивать мощности инфраструктуры. Рано или поздно, наступит момент, когда для повышения отказоустойчивости системы понадобится кластеризация, резервирование и балансировка нагрузки.
Балансировщик нагрузки — это инструмент, который распределяет входящие запросы между несколькими серверами. Его применение помогает повысить отказоустойчивость системы, снизить задержки и справиться со всплесками трафика. С балансировщиком вы также сможете оптимизировать использование ресурсов и более плавно масштабировать инфраструктуру.
Если объяснять максимально просто, как работает балансировщик нагрузки, то этот «посредник» выполняет следующие функции:
- постоянно проверяет доступность серверов. Если один из них перестаёт отвечать, задействуется альтернативный;
- корректирует настройки соединений: количество и разные типы тайм-аутов.
Собственно, мониторинг доступности и настройка соединений – основные методы балансировки, которые применяются на разных уровнях сети.
Уровни балансировки
Взаимодействие сетевых устройств принято рассматривать по модели OSI (Open System Interconnection). В ней 7 уровней: от физического, где происходит передача битов между «железом», до прикладного, на котором взаимодействуют приложения.
Работа балансировщиков нагрузки происходит на сетевом (L3), транспортном (L4) и прикладном (L7) уровнях.
На каждом из этих трёх уровней балансировку нагрузки можно настроить по разным параметрам — в зависимости от требований вашей системы.
Балансировка на сетевом уровне
На уровне L3 выполняется маршрутизация трафика и объединение данных в пакеты. Именно с IP-пакетами и работают здесь балансировщики нагрузки: распределение трафика идёт на основе IP-адресов отправителя или получателя.
На сетевом уровне балансировка нагрузки применяется для маршрутизации и распределения трафика между подсетями.
Пример — DNS-балансировка, когда к одному домену привязывают несколько IP-адресов. Или технология AnyCast, которая позволяет отправлять запросы на ближайший сервер с точки зрения географического местоположения.
Сетевой уровень даёт меньше гибкости, чем транспортный или прикладной, но может быть полезен для распределения трафика по крупным сетевым сегментам.
Балансировка на транспортном уровне
Уровень L4 находится ровно в середине модели OSI и отвечает за связность при передаче информации от сетевых устройств на устройства пользователей. Здесь используются протоколы TCP и UDP, которые помогают максимально уменьшить задержку при передаче информации и отвечают за её целостность.
На транспортном уровне балансировщик нагрузки выполняет функцию прокси, то есть выступает посредником между пользователем и сервером. Распределение запросов происходит на основе информации об IP-адресах и портах отправителя и получателя, но без анализа содержимого. Это самый простой и быстрый способ распределения трафика.
Балансировка на прикладном уровне
Верхний уровень по модели OSI называют прикладным или уровнем приложений (L7). На нём происходит взаимодействие пользовательских приложений с сетью.
Балансировка на прикладном уровне более сложная: здесь балансировщик нагрузки анализирует и содержание запросов, например, HTTP-заголовки, URL, файлы cookie или другие данные пользовательской сессии. В результате можно перенаправлять запросы на один или несколько портов в каждом сервере вашего пула.
Этот вариант подходит для веб-сервисов, где требуется более гибкое распределение нагрузки, например, для маршрутизации трафика по различным URL или методам HTTP. Самый простой и понятный пример — выбор языковой версии сайта.
Алгоритмы и методы балансировки
От выбора алгоритма балансировки нагрузки зависит путь распределения трафика в системе. Если алгоритм подобран верно, производительность серверов будет выше, а количество отказов — меньше.
На что стоит обратить внимание:
- условия, необходимые для равномерной загрузки серверов;
- скорость и очерёдность обработки запросов;
- время отклика;
- масштабируемость.
Именно эти параметры должны быть максимально оптимизированы в результате работы алгоритма балансировки.
Рассмотрим самые распространённые варианты.
Round Robin (Круговой метод)
Этот простой алгоритм распределяет запросы между серверами по очереди. То есть первый запрос — на первый сервер, второй — на второй и так далее, а затем по второму кругу. В результате каждый узел получает новые запросы равномерно, независимо от своей текущей загрузки.
Метод балансировки Round Robin эффективен в виртуальных средах, в которых работают машины примерно одинаковой мощности. Но если параметры серверов разные, могут возникнуть проблемы: балансировщик проигнорирует возможную перегрузку на конкретном сервере и будет дальше отправлять на него запросы в порядке «живой очереди».
Плюсы:
- Простая настройка правила балансировки.
- Работает быстро, поскольку требует меньше ресурсов, чем более сложные алгоритмы.
- Равные веб-узлы получают одинаковую нагрузку.
Минусы:
- Не учитывает состояние виртуальных машин в реальном времени.
- Неэффективен для серверов, отличающихся по своим характеристикам. Если есть «слабое звено» по производительности, алгоритм никак это не учтёт.
Алгоритм Round Robin хорошо работает в системах, где достаточно учитывать статическую загрузку вычислительных мощностей. Часто используется в веб-серверах и базовых сетевых решениях.
Weighted Round Robin (Взвешенный круговой метод)
Апгрейд классической версии предыдущего алгоритма. В нём можно выполнить более тонкие настройки: присвоить каждому элементу «вес», который зависит от производительности. Чем больше вес сервера, тем больше количество запросов будет направлять на него балансировщик. Так, узел с весом «2» получит в два раза больше запросов, чем с весом «1».
Плюсы:
- Учитывает индивидуальные параметры серверов: более мощные получают больше трафика.
- Просто настраивать: нужно только определить веса для каждой машины.
Минусы:
- Не отслеживает загрузку серверов в текущий момент. А значит, не может предотвратить перегрузку.
Метод балансировки Weighted Round Robin подходит для схем с веб-узлами разной мощности. Используется в распределённых приложениях и кластерах баз данных. Но если нужен динамический подход, стоит выбрать другие варианты.
Least Connections (Метод наименьшего количества соединений)
Алгоритм мониторит количество активных соединений на каждом сервере и направляет новый запрос на ту машину, которая «свободнее». Таким образом учитываются показания устройств в реальном времени, и балансировка происходит динамически. Если какой-то из серверов перегружен или недоступен, новые запросы на него поступать не будут, пока ситуация не изменится. Динамический подход — главное достоинство метода по сравнению с предыдущими.
Плюсы:
- Балансирует загрузку с учётом изменений в режиме онлайн.
Минусы:
- Нужно организовать синхронизацию показателей серверов и балансировщика.
- Более сложная настройка, при некорректности которой может возникнуть дисбаланс.
Метод балансировки Least Connections используется в приложениях, работа которых зависит от числа активных соединений. Например, в системах с длинными HTTP-сессиями, видеосервисах или базах данных.
Методы с хешированием: по адресу назначения или источника
При балансировке с хешированием IP-адреса преобразуются с помощью специальной функции в число, или хеш-код. Все запросы с одинаковым хеш-кодом направляются на один и тот же веб-узел.
Основные методы балансировки с хешированием:
- Destination Hash Scheduling: балансировщик хеширует адрес назначения запроса.
- Source Hash Scheduling, или Source IP: балансировщик хеширует IP-адрес клиента.
Плюсы:
- Устанавливает связь между источником запроса и конкретным сервером.
- Отлично подходит, когда нужно сохранять пользовательские сессии между запросами.
Минусы:
- Не учитывает, что IP-адреса могут отправлять разный объём. Это может вызвать перегрузку на отдельных серверах.
- Нет гибкости. Если машин станет больше или меньше, хеширование, не сможет автоматически изменить распределение запросов.
Метод балансировки с хешированием используются, когда важна стабильность маршрутизации. Например, для кеширующих веб-узлов или приложений, где необходимо, чтобы запросы от одного клиента всегда попадали на один и тот же сервер.
Sticky Sessions (Сессии, привязанные к серверу)
Sticky Sessions, или Session Persistence, — это опция, которая дополняет другие алгоритмы, а не является отдельным алгоритмом сама по себе. Она привязывает пользователя к конкретному серверу на время всей сессии. Это делается через cookie либо анализ сессий на уровне программы.
Плюсы:
- Запросы пользователя обрабатываются одним и тем же сервером. Это позволяет возвращать данные пользователю быстрее.
- Подходит для систем, в которых трудно хранить сессии вне серверов.
Минусы:
- Высокий риск перегрузки, когда на один сервер создано слишком много сессий.
- При выходе системы из строя сессия теряется или выдаёт ошибку.
Sticky sessions применяют в обслуживании веб-приложений, которые не могут сохранять состояние сессии на клиентской стороне или в распределённом хранилище. Например, в интернет-магазинах, чтобы корзина покупок сохранялась для каждого пользователя.
Заключение
Балансировка нагрузки — это ключевой процесс, который помогает системам работать эффективно даже во время пиковых нагрузок. Разные алгоритмы и современные технологии помогают гибко распределять трафик. При правильном выборе метода балансировки можно повысить доступность и отказоустойчивость системы и улучшить масштабируемость в самых разных условиях.
Балансировщик нагрузки для Облака EdgeЦентр можно настроить для работы в публичных и частных сетях с использованием алгоритмов Round Robin, Least Connection или Source IP.
Как быстро настроить балансировщик, узнайте в Базе знаний.