Распределение нагрузки с помощью 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 схематически выглядит так:
Запросы пользователей транслируются на балансировщик, откуда распределяются между web-backend серверами. Физически запрос обрабатывается на том сервере, для которого сработало правило.
При этом для “адекватности” возвращаемых пользователю данных, каждый из web-backend серверов должен обрабатывать входящие запросы одинаково – и, соответственно, они все должны быть подключены к общей базе данных.
Балансировка 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!