Распределение нагрузки с помощью HAProxy

HAProxy (сокращение от High Availability Proxy) заслуженно считается одним из базовых инструментов балансировки нагрузки для веб-проектов между несколькими физическими серверами. HAProxy работает на уровне протоколов TCP/HTTP, его сборки включают версии для семейства ОС Linux, Solaris и *BSD.
Разработанный в 2000 году одним из девелоперов ядра Linux, Уилли Тэрью, как проект OpenSource – сегодня HAProxy успешно применяется на таких нагруженных проектах, как GitHub, Twitter, Stack Overflow и Instagram, является базовым ПО для многих облачных сервисов AWS и входит в стек инструментов OpenStack.

Базовые определения HAProxy

Сфера балансировки нагрузки и проксирования содержит свои специфические понятия и определения. Для HAProxy базовыми сущностями являются ACL, backend и frontend.

Выбор физического сервера, который будет обрабатывать запрос, либо принятие решение о блокировке этого запроса, осуществляется на основании списков контроля доступа (ACL).

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

acl url_blog pat_beg /blog

Если URL в запросе пользователя будет содержать строку /blog, данное правило будет применено к этому запросу (например, оно выполнится для адреса http://yourdomain.com/blog/blog-entry-1).

Сервера, которые получают перенаправленные HAProxy пользовательские запросы, называются бекэндом (Backend). и прописываются в одноименном разделе конфигурации. Ключевые параметры бекэнда – алгоритм распределения нагрузки, а также список физических серверов и их сетевых портов.

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

Правила для бэкендов blog-backend и web-backend, работающих с запросами через 80 порт, могут выглядеть так:

backend web-backend
balance roundrobin
server web1 web1.yourdomain.com:80 check
server web2 web2.yourdomain.com:80 check

backend blog-backend
balance roundrobin
mode http
server blog1 blog1.yourdomain.com:80 check
server blog1 blog1.yourdomain.com:80 check

Здесь balance roundrobin задает алгоритм балансировки нагрузки ниже, mode http определяет обработку на уровне 7-го слоя прокси. Опция check указывает, что необходимо проверять, работает ли данный сервер.

Фронтэнд (Frontend) задает правила трансляции запросов пользователей на бекэнд HAProxy. Каждое правило характеризуется:

  • комбинациями из ip-адреса и порта
  • правилами ACL
  • правилами use_backend, определяющими подходящий бекэнд в зависимости от ACL (для всех остальных случаев также может быть указан default_backend)

Для разных типов трафика можно назначать отдельный фронтэнды.

Виды распределения нагрузки настраиваются в конфигурации в соответствии с архитектурой и текущей загрузкой веб-проекта.

Низкая нагрузка

Для веб-приложений с невысокой нагрузкой балансировка не включается, поскольку используется только один веб-сервер:

веб сервер

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

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

Балансировка 4 (транспортного) уровня – простейший вариант распределения нагрузки серверов. Правила балансировки определяются диапазоном адресов IP и портов – так, при запросе http://yourdomain.com/anything, будет задействован бекэнд для порта 80 для данного домена.

Балансировка 4-го уровня HAProxy схематически выглядит так:

Балансировка 4-го уровня HAProxy

Запросы пользователей транслируются на балансировщик, откуда распределяются между web-backend серверами. Физически запрос обрабатывается на том сервере, для которого сработало правило.
При этом для “адекватности” возвращаемых пользователю данных, каждый из web-backend серверов должен обрабатывать входящие запросы одинаково – и, соответственно, они все должны быть подключены к общей базе данных.

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

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

Распределение нагрузки 7 уровня схематически выглядит так:

Распределение нагрузки 7 уровня

Здесь при запросе пользователем ресурс с адресом yourdomain.com/blog происходит перенаправление его на  web-backend, обрабатывающий адреса с /blog. Прочие обращения в рамках yourdomain.com переводятся на web-backend, который выполняется как отдельное веб-приложение. При этом, оба сервера работают с одной и той же базой данных.

Конфигурация фронтэнд для схемы выше может задаваться так:

frontend http
bind *:80
mode http

acl url_blog path_beg /blog
use_backend blog-backend if url_blog

default_backend web-backend

В этой конфигурации определен frontend с именем http, который обрабатывает трафик на 80 порту.
Маска для адреса запроса задается строкой acl url_blog path_beg /blog – соответственно, подходят все запросы, которые начинаются с /blog.
Применение ACL-правил определяется строкой use_backend blog-backend if url_blog для всего трафика.
Бэкенд по-умолчанию указан в правиле default_backend web-backend.

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

В HAProxy алгоритм распределения (балансировки) нагрузки определяет тот сервер, который будет обрабатывать конкретный пользовательский запрос. Указывается один из нескольких доступных видов алгоритма, а также весовой коэффициент для каждого из серверов.

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

Чтобы запрос был получен сервером с минимальным количеством активных соединений, применяется алгоритм leastconn. Этот алгоритм применяется на практике при длинных пользовательских сессиях.

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

Есть также и другие алгоритмы распределения нагрузки, которые описывает документация по HAProxy (также вы можете узнать их на наших учебных курсах).

Долгие сессии

Чтобы пользователь обрабатывался на одном и том же сервере, также используется флаг appsession, устанавливаемый для целевого бекэнда.

Мониторинг работоспособности

Чтобы определить доступность задействованных серверов, HAProxy мониторит отзывчивость каждого из них по 80 порту TCP. Если какой-то сервер оказывается недоступен, то он автоматически исключается из бекэнда – до тех пор, пока этот сервер вновь не подаст признаки жизни. При падении всех серверов веб-ресурс соответственно, становится недоступен для пользователей.

Такой способ проверки, однако, не подходит как минимум для серверов с базами данных.

Помимо HAProxy, распределение нагрузки между серверами веб-проекта регулируется такими приложениями, как Nginx, Linux Virtual Servers (LVS) и др. Получить расширенные знания об этих продуктах и освоить их на практике вы можете на нашем авторском курсе “L3-High Load“.

Желаем успехов в мире IT!

Залишити відповідь

Дякуємо, що поділились