Алгоритмы и методы распределения нагрузки на сервер

Обсудить
Алгоритмы и методы распределения нагрузки на сервер

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

Балансировка нагрузки

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

Как работает

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

Какие проблемы решает

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

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

Три уровня балансировки

Выделяют балансировку на трех уровнях: сетевом, транспортном и прикладном. Можно распределять нагрузку как на одном уровне, так и на нескольких сразу.

Сетевой

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

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

На сетевом уровне можно настроить распределение нагрузки на сервер такими методами:

  • Выравнивание через DNS. За доменным именем закрепляются несколько IP-адресов.
  • NLB-кластер. Несколько физических серверов объединяют в кластер, состоящий из входных и вычислительных узлов. Обычно этот метод используется в Microsoft.
  • IP-адрес. К сети добавляется маршрутизатор, который и распределяет нагрузку по адресам.

Транспортный

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

В чем принципиальная разница между сетевыми и транспортными методами? Первые просто перенаправляют запросы. Затем выбранный сервер напрямую обменивается данными с клиентом. Транспортные методы работают как прокси — они сами обмениваются данными с сервером, а не связывают клиента и сервер напрямую.

Транспортное снижение нагрузки на сервер

Прикладной

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

Для прикладного и транспортного методов подходят как физические, так и виртуальные серверы. Оптимальный вариант — зарезервировать виртуальный VDS сервер под эти нужды.

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

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

Общие принципы

Выбирая или разрабатывая алгоритм, нужно придерживаться трех принципов:

  • Справедливость. Каждый запрос должен обрабатываться. Нельзя допустить, чтобы запросы стояли в очереди друг за другом. Поэтому перед разработкой алгоритма балансировки нужно проверить нагрузку на сервер в динамике, чтобы знать, к каким скачкам нужно готовиться.
  • Рациональность. Все серверы из пула должны работать. Желательно — всегда и на полную мощность. Это не всегда достижимо, и задача алгоритма — распределить нагрузку максимально равномерно.
  • Скорость. Хороший балансирующий алгоритм обеспечивает быструю обработку запросов.

Round Robin

Самый простой способ снизить нагрузку на сервер — это отправлять каждый запрос поочередно. Предположим, у вас есть три VDS. Запросы направляются поочередно на первый, второй, а затем третий сервер. Следующий запрос снова вернется к первому серверу, и цикл начнется заново. Плюсы подхода очевидны: простота, дешевизна, эффективность. При этом серверы из пула могут не быть связаны между собой — через DNS и этот алгоритм можно перенаправлять запросы на любые машины. Главная проблема этого подхода — нерациональное распределение ресурсов. Даже если все машины обладают примерно одинаковыми характеристиками, реальная нагрузка будет сильно различаться в пуле.

Weighted Round Robin

Этот алгоритм аналогичен предыдущему, но он дополнительно берет во внимание производительность сервера. Чем мощнее машина, тем больше запросов она обрабатывает. Это не идеальный подход, но он значительно лучше обычного Round Robin.

Least Connections

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

Sticky Sessions

В этом алгоритме запросы распределяются в зависимости от IP-адреса пользователя. Sticky Sessions предполагает, что обращения от одного клиента будут направляться на один и тот же сервер, а не скакать в пуле. Клиент сменит сервер только в том случае, если ранее использовавшийся больше не доступен.

Комментарии