Для построения надежной отказоустойчивой инфраструктуры необходимо равномерное распределение нагрузки на серверы. За эту функцию отвечает балансировщик нагрузки — сервис дистрибуции заданий внутри кластера, гарантирующий работу системы даже в случае отказа одного из серверов.
Из статьи вы узнаете, как устроены алгоритмы и методы балансировки, какие существуют точки отказа, в чем разница между Load balancer и прокси.
Что такое балансировка сетевой нагрузки
Балансировка нагрузки — метод распределения сетевого трафика и задач между сетевыми устройствами.
На старте развития сервиса все компоненты (Frontend, Backend, база данных) могут находиться на одном сервере. Если нагрузка растет, его можно масштабировать вертикально: поменять конфигурацию сервера на более мощную или быстро добавить ресурсов в облачный сервер — добавить число vCPU или объем памяти.
На какое-то время этого будет достаточно, но в конечном итоге мощности сервера может не хватить, и задачи разделятся на несколько серверов. Так, фронтенд уйдет на отдельный сервер, бэкенд — на второй, а база данных будет храниться еще на одной машине. Причем каждый из серверов тоже можно «проапгрейдить» вертикально.
Горизонтальное масштабирование, при котором растет количество серверов, заточенных под одну задачу, — это следующий шаг развития инфраструктуры. Оно требуется, чтобы лучше справляться с нагрузками и достичь большей гибкости в организации инфраструктуры.
При горизонтальном масштабировании появляется необходимость в новом элементе инфраструктуры — балансировщике нагрузки, распределяющем трафик.
Балансировка применима к следующему оборудованию:
- кластер,
- прокси-сервер,
- брандмауэр,
- коммутатор,
- система DPI,
- DNS-сервер,
- сетевой адаптер.
Для чего нужен балансировщик нагрузки
Рост числа пользователей и объема трафика влечет за собой увеличение нагрузки на инфраструктуру сервиса. Балансировщик гарантирует, что сервер не будет перегружен трафиком и данные будут эффективно перемещаться между компонентами кластера.
Отказоустойчивость — главная цель. Сложность приложений растет, количество точек отказа увеличивается, они могут располагаться на разных уровнях инфраструктуры, будь то серверы или сети. Балансировщик позволяет избегать единой точки отказа — части системы, в случае выхода из строя которой вся работа будет остановлена. Если один сервер откажет, балансировщик распределит трафик между остальными элементами инфраструктуры.
Балансировщик позволяет более оптимально использовать ресурсы и быстрее обслуживать запросы. Например, если у вас два сервера под базы данных, балансировщик сделает так, чтобы оба были равно нагружены.
Также балансировщик обеспечит более плавное масштабирование инфраструктуры: при горизонтальном росте — добавлении нового сервера в кластер — он быстро и аккуратно загрузит новое «звено» инфраструктуры.
Другая важная функция балансировщика — защита от DDoS-атак. Ее обеспечивает задержка ответа, когда фоновые серверы не видят клиента до подтверждения по TCP. Балансировщик нагрузки Selectel проводит исходящий трафик через специальные алгоритмы, которые фильтруют TCP ACK/FIN/RST-атаки до 99,9%.
Примеры точек отказа
- Выход в интернет и обеспечение доступа пользователей к сервису: IP-адрес и сетевое оборудование, через которое проходит трафик до целевых серверов.
- Физические серверы или виртуальные машины, на которых развернут сервис. Они резервируются для предотвращения падения системы.
- Сам балансировщик. Оборудование, которое настроено под балансировщик, тоже может стать слабым звеном. Поэтому компании, для которых отказоустойчивость критична, резервируют и балансировщики.
Готовый универсальный балансировщик нагрузки от Selectel зарезервирован из «коробки» в дата-центрах в Санкт-Петербурге и Москве. Для каждого дата-центра используется своя подсеть. Ошибки в одном сегменте не влияют на другой. Подробнее о работе балансировщика читайте по ссылке.
Уровни балансировки на модели OSI
Open System Interconnection (OSI) — модель стека взаимодействия сетевых протоколов. По модели OSI сетевые устройства выстраиваются в отличные по функционалу уровни. Балансировка происходит на уровнях L4 и L7.
L1. Физический уровень выполняет обмен сигналами между физическими устройствами. На начальном уровне сигналы представлены в битах.
L2. Канальный уровень отвечает за физическую адресацию, биты трансформируются в кадры и получают адреса отправитель-получатель.
L3. Сетевой уровень выполняет построение маршрута и логическую адресацию между устройствами, кадры объединяются в пакеты данных. На этом уровне учитываются все возможные неполадки в сети. За эту функцию отвечает маршрутизатор.
L4. Транспортный уровень обслуживает связь между конечными устройствами. Главные функции L4 — минимизировать задержку передачи данных и добиться целостности доставленной информации. В зависимости от протокола на транспортном уровне пакеты данных делятся по двум принципам.
Сегментирование (протокол TCP) — деление пакета на части при превышении пропускной способности сети. Деление на датаграммы (протокол UDP) — метод, при котором появляется автономная часть пакета с заголовками и адресами назначения. Датаграммы независимо доходят до конечного адресата.
Транспортный уровень — связующее звено между двумя группами:
- Media layers, или уровни среды. L1 — L3. На них информация передается между сетевыми устройствами.
- Host layers, или уровни хоста. L4 — L7. Работают непосредственно на стационарных компьютерах или мобильных устройствах.
На четвертом уровне работает балансировщик нагрузки, в его функции входит трекинг сетевой информации о протоколах и портах приложений, комбинирование данных с алгоритмами балансировки, подбор целевого сервера с наименьшим временем ответа.
L5. Сеансовый уровень управляет сеансом связи. В его функционале синхронизация задач, создание, поддержка в период неактивности и завершение сеансов. Начиная с L5, уровни используют чистые данные.
L6. Уровень представления выполняет шифрование и преобразование данных в понятный для сервера и пользователя вид.
L7. Прикладной уровень обслуживает взаимодействие пользователей и сети. Верхний уровень обеспечивает доступ к сетевым службам. Работающий на L7 протокол HTTP идентифицирует клиентские сеансы и на основе файлов cookie обеспечивает доставку запросов пользователя на один сервер.
Верхний уровень модели OSI взаимодействует с предыдущими уровнями: проверяет трафик L4, отправляет отчеты об ошибках и запросы к уровню L6, передает служебную информацию.
Методы балансировки
Проверка доступности. Балансировщик мониторит статусы серверов и перенаправляет соединения в случае падения одного из них. Существует несколько параметров оценки состояния сервера:
- ответы на проверяющие запросы, интервал настраивается в секундах,
- время ожидания сети,
- ожидаемые коды ответа для протоколов проверки HTTP и HTTPS,
- порог успеха/неуспеха — количество отправленных подряд запросов, после которых сервер продолжает работу или приостанавливается.
Настройка соединений. Проходят по схеме: входящий запрос → балансировщик → сервер. Задаваемые настройки:
- ограничение количества соединений,
- таймаут соединения определяет время ожидания ответа,
- таймаут неактивности — время, когда подключение считается активным, даже если данные не передаются,
- TCP-таймаут — время ожидания передачи данных для инспекции по установленному соединению.
Алгоритмы балансировки
Алгоритм планирования
По нему распределяются входящие запросы через серверы в кластере. Данный алгоритм помогает решить несколько задач: оптимизация использования ресурсов и достижение максимальной пропускной способности, уменьшение времени отклика и предотвращение перегрузки одного из компонентов системы.
BGP Anycast
Преимущество этого протокола маршрутизации — один IP-адрес для нескольких серверов. При любом запросе может ответить наименее загруженный сервер. Таким образом минимизируются задержки при получении трафика. Данный протокол поддерживает гибкое выведение и добавление новых серверов. BGP Anycast используют в Selectel.
Round Robin
Алгоритм кругового обслуживания, используемый балансировщиком. RR равномерно и циклично распределяет запросы по серверам в соответствии с заданным весом.
Least connections
Алгоритм, учитывающий количество подключений к серверу. Каждый поступивший запрос отправляется серверу с наименьшим количеством активных подключений. Уязвимое место — необходимость балансировки между несколькими Frontend-серверами. Когда пользователь устанавливает соединение с Frontend-сервером, все запросы будут отправляться именно на него. При соблюдении алгоритма Least connections другой Frontend-сервер может быть менее нагружен, и пользователь подключится к нему — ему придется заново авторизоваться.
Впрочем, данную проблему решает Sticky Sessions. Функция алгоритма состоит в том, что сервер, обработавший запрос, закрепляется для сессии пользователя. Сессия начнется на другом сервере, только если первоначальный сервер будет недоступен.
Балансировка нагрузки и проксирование
Обратные прокси-серверы и балансировщики работают как посредники в коммуникации между клиентами и серверами. Термины «балансировщик« и «прокси-сервер» часто используют как взаимозаменяемые. Так, например, отказоустойчивый балансировщик нагрузки Selectel — это обратный прокси-сервер (reverse proxy), который распределяет трафик между различными услугами компании, находящимися в разных регионах и зонах доступности.
Обратный прокси-сервер принимает запрос от клиента, направляет его на сервер, который может его выполнить, и возвращает ответ. Развертывание обратного прокси имеет смысл даже при наличии только одного веб-сервера или сервера приложений. Не все прокси-серверы — это балансировщики, но первичная функция подавляющего большинства — именно балансировка нагрузки.
Балансировщик нагрузки распределяет входящие запросы клиентов между группой серверов, в каждом случае возвращая ответ от выбранного сервера соответствующему клиенту. Балансировщики используются, когда объем запросов слишком велик для эффективного выполнения одним сервером. Развертывание нескольких серверов также устраняет проблему единой точки отказа.
Преимущества облачного балансировщика
Балансировщики нагрузки долгое время были аппаратными, под них настраивали «железное» оборудование. Сейчас популярностью пользуются именно облачные балансировщики, поскольку они имеют ряд преимуществ:
- Быстрое развертывание балансировщика в новой конфигурации. В Selectel это можно сделать за несколько минут в интерфейсе панели управления.
- «Железные» балансировщики могут не выдержать нагрузку и выйти из строя. Облачные Load balancer в этом плане более выносливы. Кроме того, их легче вертикально масштабировать.
- Облачные балансировщики дешевле. Так, оплата балансировщиков в Selectel производится по модели pay-as-you-go (оплата за потребленные мощности). Решение можно подключить на время «жаркого» периода для бизнеса и отключить, когда потребность в балансировке перестанет быть острой.
Создать балансировщик нагрузки легко в панели управления Selectel. Там можно выбрать нужный тип балансировщика — с резервированием и без, а также добавить необходимое число правил.
Для тех, кто работает с Terraform, есть возможность создать балансировщик через описание инфраструктуры, загрузку конфигурационных файлов.
В облачных балансировщиках доступны различные комбинации протоколов, которые имеют дело с нагрузкой L4 и нагрузкой L7-уровней.
- TCP–TCP — классическая L4-балансировка,
- TCP–PROXY — информация о клиенте не теряется и передается в отдельном заголовке соединения,
- UDP–UDP — UDP-протокол быстрее, чем TCP, но менее надежен,
- HTTP–HTTP — L7-балансировка,
- HTTPS–HTTP — L7-балансировка с шифрованием и терминацией SSL-сертификата на балансировщике.
Заключение
На этом мы закончим обзор балансировщиков нагрузки. Мы рассмотрели современные подходы балансировки сетевой нагрузки, изучили функционал Load balancer и алгоритмы балансировки.
Балансировщики нагрузки — обязательный элемент сложной инфраструктуры, которая состоит из нескольких серверов и требует «умных» подходов к управлению трафиком.