Все статьи

Балансировка нагрузки между серверами: уровни, методы и алгоритмы

7 ноя 20211852

В погоне за сокращением time to market веб-проектов вопрос планирования нагрузки нередко откладывается на потом. В будущем, когда нагрузка на сервер будет постоянно расти, это может привести к крайне нежелательным последствиям, ведь при «падении» сервера пострадают не только нервы технических специалистов, но и прибыль.

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

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

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

Уровни балансировки

Процесс происходит на трех уровнях модели OSI:

  • Сетевой (L3);
  • Транспортный (L4);
  • Прикладной (L7).

Посмотрим, чем отличаются методы балансировки в зависимости от выбранного уровня.

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

Суть балансировки нагрузки на L3 — привязать несколько физических серверов к одному IP-адресу. Существует несколько способов решить эту задачу.

  • DNS-балансировка — выделение сразу нескольких IP-адресов для одного доменного имени.
  • Создание NLB-кластера — объединение нескольких серверов в единый кластер из входных и вычислительных узлов с последующей балансировкой нагрузки в соответствии со специальным алгоритмом.
  • Балансировка по IP с использованием дополнительного маршрутизатора.
  • По территориальному признаку — при этом способе балансировки размещается сразу несколько «клонов» сервиса с идентичными адресами, но каждый — в отдельном регионе интернета. Кстати, на базе такого метода работают многие сети доставки контента. Наиболее активно он используется в сервисах с огромным количеством пользователей из разных стран и даже континентов.

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

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

Балансировка на транспортном уровне — эффективный и простой способ распределения нагрузки. Принцип достаточно прост: запрос клиента не идет сразу на сервер, а поступает балансировщику нагрузки серверов (load balancer), который определяет, какая именно машина будет его обрабатывать и перенаправляет его дальше. Для выбора сервера могут применяться самые разные способы: определение наиболее свободного, перебор по очереди, учет количества активных подключений и другие.

Схема баллансировщика нагрузки серверов

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

Распределение нагрузки на прикладном уровне тоже работает через проксирование запросов. Однако, в отличие от транспортной балансировки, здесь запросы распределяются с учетом запрашиваемого контента или действий. Например, создание веб-страницы будет происходить через сервер А, а ее чтение — через сервер B. В некоторых случаях балансировка осуществляется в зависимости от того, какой тип контента запросил пользователь. Условно говоря, видеоматериалы будут «отдаваться» одним сервером, картинки другим, а текст третьим.

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

Выбор конкретного метода и алгоритма балансировки зависит от особенностей веб-проекта и целей, которые вы планируете достичь.

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

Отлично, если вам удалось подобрать метод, который не только учитывает специфику веб-проекта, но и соответствует озвученным выше условиям. Но не забывайте, по мере развития сайта или веб-приложения нагрузка на него будет расти, и не факт, что это будет равномерный и предсказуемый рост. Чтобы выбранный алгоритм балансировки не стал с течением времени «мал» вашему проекту проверьте, насколько надежно он работает при увеличении нагрузки.

Рассмотрим наиболее популярные методы распределения нагрузки.

Round Robin

Наверное, вы уже догадываетесь, по какому принципу алгоритм распределяет нагрузку, даже если никогда о нем не слышали. В основе Round Robin — перебор доступных серверов по кругу (отсюда и Round в названии): первый запрос уходит на сервер #1, второй — на сервер #2 и так по далее.

Weighted Round Robin

Фактически это то же самое, что и обычный Round Robin, с единственным отличием. Алгоритм учитывает производительность серверов. Эта особенность позволяет обрабатывать запросы намного эффективнее: чем «сильнее» сервер, чем выше его производительность, тем больше запросов он получает и обрабатывает.

Least Connections (LeastConn)

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

Например, возможна такая ситуация. К серверу #1 подключено меньше пользователей, чем к серверу #2, но загрузка на нем все равно выше. Это вполне реальная ситуация, если сервер #1 поддерживает подключения пользователей дольше, чем сервер #2.

Избежать таких проблем помогает алгоритм Least Connections. В отличие от Round Robin и его «старшего брата» он учитывает количество активных подключений и «отдает»»запрос серверу, где их меньше.

Существует несколько усовершенствованных вариантов реализации метода LeastConn, например:

  • Locality-Based Least Connection Scheduling;
  • Locality-Based Least Connection Scheduling with Replication Scheduling;

Destination Hash Scheduling (планирование по хэшу назначения) и Source Hash Scheduling (планирование по хэшу источника)

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

Согласно этому алгоритму, сервер для обработки запроса выбирается из таблицы по IP-адресу получателя.

Sticky Sessions (липкие сессии)

Этот алгоритм балансировки нагрузки используется в хорошо знакомом многим администраторам веб-сервере Nginx. Работает он следующим образом. Пользовательская сессия закрепляется за конкретным сервером с помощью метода IP hash. Все запросы в рамках одной сессии передаются строго на эту машину. Запрос отправится на другой сервер только в одном случае: если изначально выбранный сервер станет недоступен.

Балансировка нагрузки есть и в облаке. Например, для выравнивания нагрузки в Elastic Cloud мы используем VMware DRS. Его возможности доступны всем пользователям публичного облака #CloudMTS.