Ваш единственный сервер, пытающийся обслужить многочисленные запросы, в конечном итоге будет обречен на медленную работу или падение. Рано или поздно вам потребуются дополнительные ресурсы: процессорное время, оперативная память, дисковое пространство, пропускная способность. Используя несколько серверов, вы сможете масштабировать, разделять и защищать ресурсы в соответствии с потребностями бизнеса. А координировать работу серверов будет балансировщик нагрузки — специализированный сетевой компонент, распределяющий между ними входящий трафик. В статье мы рассмотрим, что это за устройство (или функция), зачем оно нужно и как работает.

Что такое балансировка нагрузки

Представьте себе ситуацию: ваш сайт стал популярным, и тысячи пользователей одновременно пытаются получить к нему доступ. Если все запросы будут поступать только на один сервер, то он может просто «упасть» от их большого количества. Здесь разумным решением представляется балансировка нагрузки — распределение входящего трафика по доступным серверам. Цель такого распределения — оптимально использовать доступные вычислительные ресурсы и не допускать перегрузки одного или нескольких серверов. А управляет распределением т. н. балансировщик — специализированное сетевое устройство или программное обеспечение.

Что такое балансировка нагрузки
Image by d3images on Freepik.

Почему без балансировщика не обойтись

Балансировщик нагрузки по своей сути — интеллектуальный диспетчер, который следит за тем, чтобы все серверы работали с оптимальной эффективностью. Надо понимать, что балансировщик сегодня — незаменимый инструмент для любого серьезного веб-ресурса, без него современным проектам просто не выжить. Рассмотрим основные причины, по которым большинство сайтов не может обойтись без эффективного распределения нагрузки между серверами.

Высокая доступность

Балансировщик нагрузки постоянно мониторит состояние серверов в группе. Если один сервер выйдет из строя (аппаратный сбой, обновление, перезагрузка), балансировщик мгновенно перенаправит новый трафик на исправные машины. Скорее всего пользователи даже не заметят проблемы — сайт или приложение продолжит работать. Без механизма балансировки падение единственного сервера означало бы полную недоступность сервиса для всех.

Масштабируемость

Когда ваш проект растет и нагрузка увеличивается, можно просто добавить новые серверы в кластер «за» балансировщиком. Балансировщик автоматически начнет включать их в распределение входящего трафика. Это горизонтальное масштабирование (scale-out) гораздо гибче и часто экономичнее, чем постоянная замена единственного сервера на всё более мощный (т. е. чем вертикальное масштабирование, scale-up).

Производительность и отказоустойчивость

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

Как видим, балансировщик нагрузки — не роскошь, он необходим веб-сервисам, для которых важны скорость, стабильность и перспективы роста. Теперь давайте углубимся в техническую сторону вопроса и рассмотрим, каким образом балансировщики выполняют свою работу на практике.

Как работает балансировщик нагрузки

Чтобы понять, как именно балансировщики выполняют свои функции, нужно для начала разобраться в их архитектуре и принципах работы. Конкретные реализации могут отличаться в зависимости от уровня модели OSI, на котором работает устройство или ПО, однако основная идея остаётся неизменной: принимать входящие запросы и балансировать нагрузку — распределять трафик между серверами.

Архитектура

Обычно балансировщик располагается на сетевом уровне перед кластером серверов и образует единую точку входа для клиентов. Пользователи отправляют свои запросы на виртуальный IP-адрес (VIP), принадлежащий балансировщику, а не на реальные IP-адреса серверов.

Принцип работы

  1. Входящий запрос. Пользователь отправляет запрос (например, открыть страницу сайта) на виртуальный IP балансировщика.
  2. Принятие решения. Балансировщик нагрузки, используя выбранный алгоритм распределения (об алгоритмах поговорим ниже), определяет, на какой конкретный сервер из группы лучше всего направить этот запрос. Он учитывает текущую нагрузку на серверы, количество активных подключений, их «здоровье» и иные факторы.
  3. Перенаправление. Балансировщик перенаправляет запрос пользователя на выбранный бэкенд-сервер. Это перенаправление может происходить по-разному (например, на сетевом уровне или с переподключением).
  4. Обработка и ответ. Бэкенд-сервер обрабатывает запрос и отправляет ответ обратно, но обычно не напрямую пользователю, а снова через балансировщик нагрузки (особенно при работе на L7). Балансировщик передает ответ исходному клиенту.

Где используется

Области применения огромны — веб-сайты и веб-приложения (особенно с высокой посещаемостью), API-шлюзы, системы доставки контента (CDN), почтовые сервисы, игровые серверы, базы данных, VoIP-системы, короче, везде, где есть несколько серверов и нужно эффективно распределять нагрузку.

Уровни балансировки на модели OSI

В модель Open Systems Interconnection входят 7 уровней передачи данных по сети. Балансировка может осуществляться на разных уровнях этой сетевой модели — в зависимости от «интеллекта» и возможностей балансировщика. На практике чаще всего используется три уровня: L3, L4 и L7.

Сетевой уровень (L3)

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

Транспортный уровень (L4)

Здесь балансировщик нагрузки видит порты TCP/UDP и может читать информацию о сессиях. Он понимает, когда начинается и заканчивается соединение (например, запрос к сайту по TCP) — это позволяет более эффективно распределять запросы, особенно для протоколов, ориентированных на соединение. Он знает IP и порт источника и назначения, но все еще не «заглядывает» внутрь самого запроса. Подходит для распределения нагрузки на базовые сервисы, не требующие анализа содержимого.

Прикладной уровень (L7)

Самый «умный» уровень. Балансировщик нагрузки работает с содержимым самого запроса — HTTP-заголовками, URL, типом контента (HTML, картинка, видео), cookies и т. д. На этом уровне возможно:

  1. Направлять запросы к API на одни серверы, а запросы к контенту — на другие (роутинг на основе URL).
  2. Проверять подлинность пользователя на уровне балансировщика.
  3. Оптимизировать SSL/TLS терминацию (расшифровывать трафик на балансировщике, тем самым снижая нагрузку на бэкенд-серверы).
  4. Выполнять A/B тестирование, направляя части трафика на разные версии приложения.

Чем выше уровень балансировки, тем больше возможностей, но и тем выше вычислительная нагрузка на сам балансировщик.

Основные алгоритмы балансировки нагрузки

Переходя к практическим аспектам реализации, рассмотрим основные алгоритмы распределения нагрузки между серверами.

Round Robin (Циклическое распределение)

Запросы поочередно направляются на каждый сервер в списке по кругу: 1-й, 2-й, 3-й, 1-й, 2-й, 3-й... Просто, предсказуемо, обеспечивает равномерное распределение в долгосрочной перспективе. Хорошо подходит для пула однородных серверов.

Least Connections (Минимум подключений)

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

IP Hash

Алгоритм вычисляет хэш (уникальное значение) на основе IP-адреса посетителя. Этот хэш определяет, на какой сервер пойдет запрос от этого клиента. Гарантирует, что все запросы от одного пользователя будут попадать на один и тот же сервер (полезно для поддержания сессий без сложных механизмов их синхронизации между серверами).

URI Hash

Похож на IP Hash, но хэш вычисляется на основе URI (пути) запроса. Обеспечивает, что запросы к одному и тому же ресурсу (например, конкретной картинке или скрипту) будут направляться на один и тот же сервер. Полезно для кеширования.

Weighted Round Robin

Улучшение Round Robin. Каждому серверу назначается «вес» (например, 1, 2, 3). Сервер с весом 3 получит в три раза больше запросов, чем сервер с весом 1. Учитывает разную мощность серверов в кластере.

Random и Two Choices

Random — просто случайный выбор сервера (не всегда эффективен). Two Random Choices — выбирается случайным образом несколько серверов (здесь — два), а затем запрос направляется на тот из них, у которого меньше подключений (Least Connections). Такая балансировка — компромисс между случайностью и эффективностью при большой нагрузке.

Виды балансировщиков

Балансировщики классифицируют по нескольким признакам:

  1. По форме поставки:

    • Аппаратные (Hardware). Специализированные физические устройства (от таких вендоров как F5 Networks, Citrix ADC и др.). Обеспечивают максимальную производительность и отказоустойчивость, но дороги и не вполне гибки в настройке.
    • Программные (Software). Приложения, работающие на стандартном серверном оборудовании или виртуальных машинах (например, NGINX, HAProxy, Envoy, Traefik). Гораздо гибче и дешевле аппаратных, проще масштабируются и настраиваются.
    • Виртуальные (Virtual Appliances). Программные балансировщики, упакованные как виртуальные машины, для запуска в виртуальной среде или частном облаке.
  2. По расположению:

    • Внешние (External). Расположены на границе сети, перед веб-серверами, принимают трафик из интернета.
    • Внутренние (Internal). Распределяют нагрузку внутри инфраструктуры, например, между серверами приложений и серверами баз данных или между микросервисами.
  3. По уровню работы. Как мы уже рассматривали — L3, L4, L7. Часто современные балансировщики поддерживают несколько уровней одновременно.

Преимущества облачных решений

Облачные провайдеры (в т. ч. на российском рынке — Yandex Cloud, Croc Cloud Services, VK Cloud и др.) предлагают свои балансировщики нагрузки как сервис. Плюсы этих сервисов — это:

  1. Простота и скорость — развертывание за считанные минуты через веб-интерфейс или API. Нет нужды закупать, устанавливать и настраивать железо или ПО.
  2. Автоматическое масштабирование — облачный балансировщик сам подстраивается под нагрузку, обрабатывая пики без вашего вмешательства. Вам не нужно думать о его производительности.
  3. Доступность — облачные балансировщики изначально проектируются как отказоустойчивые, с географическим распределением точек присутствия (POPs).
  4. Интеграция с экосистемой — с другими облачными сервисами (вычисления, хранилища, мониторинг, безопасность — WAF, DDoS-защита).
  5. Оплата по факту использования — только за реально обработанный трафик и время работы, без предоплат за «железо».
  6. Снижение эксплуатационных расходов (OpEx) — нет затрат на покупку оборудования, его обслуживание, обновление и ремонт.

Облачные балансировщики нагрузки стали стандартом де-факто для большинства современных проектов, особенно стартапов и быстрорастущих компаний.

Балансировка нагрузки и проксирование: в чём разница

Эти понятия часто путают, так как балансировщики нагрузки часто действуют как обратные прокси (Reverse Proxy). Поясним.

Прокси (обычный/прямой) — сервер-посредник между клиентом (пользователем) и интернетом. Клиент настраивает свое ПО на работу через прокси. Прокси может кешировать данные, фильтровать трафик, скрывать реальный IP клиента. Его основная цель — представлять клиента перед интернетом.

Обратный прокси (Reverse Proxy) — сервер-посредник между интернетом (клиентами) и внутренними серверами. Клиенты обращаются к обратному прокси, как к конечному серверу, а он уже взаимодействует с бэкендом. Балансировка нагрузки – это одна из ключевых функций обратного прокси, но она не единственная. Обратный прокси также может:

  1. Кешировать статический контент.
  2. Обеспечивать SSL/TLS терминацию.
  3. Сжимать данные.
  4. Защищать бэкенд (базовая фильтрация, сокрытие внутренней структуры сети).

Балансировщик нагрузки. Его основная и единственная цель — распределять входящий трафик между несколькими бэкенд-серверами для повышения доступности, производительности и отказоустойчивости. Он может быть реализован как обратный прокси (чаще всего на L7), но может работать и на более низких уровнях (L4, L3), где функция проксирования в классическом понимании (работа с HTTP-запросами) отсутствует.

То есть все балансировщики, работающие на L7, являются обратными прокси. Но не все обратные прокси являются только балансировщиками нагрузки (они могут выполнять и другие задачи). А балансировщики на L3/L4 прокси в HTTP-смысле не являются.

Заключение

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

Внедрение балансировщика — это разумный шаг для защиты вашей репутации и бизнеса. Инвестируя в правильную балансировку, вы получите довольных пользователей и предпосылки для успеха вашего онлайн-бизнеса.