Введение
Веб-серверы с высоким трафиком активно пользуются преимуществами балансировщиков нагрузки. Балансировщик нагрузки распределяет трафик межу несколькими веб-серверами, обеспечивает, таким образом, высокий уровень доступности и поддерживает хороший уровень производительности веб-сервера в моменты всплеска трафика.
HAProxy – это популярное, надежное и недорогое решение, предназначенное для балансировки нагрузки. Это программное обеспечение славится своей устойчивостью к сбоям и независимостью от конкретных условий работы. Очень многие популярные веб-сайты используют его для балансировки нагрузки. Сюда относятся GitHub, Reddit, Slack и Twitter.
В этой статье мы расскажем, как настроить HAProxy и использовать его для балансировки нагрузки.
Обязательные требования:
- Операционная система Linux
- Возможность использования команды sudo
- Установленный Python 3
Что такое HAProxy?
HAProxy (Highly Available Proxy – прокси-сервер высокого уровня доступности) – это эффективный балансировщик сетевой нагрузки, а также программное обеспечение обратных прокси-серверов, которое написано на C. Это программное обеспечение с открытым исходным кодом может использоваться практически со всеми дистрибутивами Linux, которые есть в самых известных менеджерах пакетов.
У этого инструмента есть огромное количество сложных функций, в том числе у него есть полный набор функций, предназначенный для балансировки нагрузки.
HAProxy (как балансировщик нагрузки) может работать в двух режимах:
- Балансировщик нагрузки для TCP-соединения, где решения касательно балансировки принимаются в расчете на соединение в целом.
- Балансировщик HTTP-запросов, где решения касательно балансировки принимаются для каждого запроса отдельно.
Ниже мы продемонстрировали то, как можно создать балансировщик HTTP-запросов.
Настройка HAProxy для балансировки нагрузки
Прежде чем приступить к настройке балансировщика нагрузки, вам нужно установить HAProxy в своей системе. Вы можете найти HAProxy в репозиториях менеджеров пакетов yum и APT.
Для того, чтобы установить HAProxy, придерживайтесь следующих указаний для вашей ОС:
- Если мы говорим о системах, основанных на Ubuntu и Debian, которые используют менеджер пакетов APT, вам нужно сделать следующее:
- Обновите список пакетов:
sudo apt update
- Установите HAProxy с помощью следующей команды:
sudo apt install haproxy
По указанию, для того, чтобы продолжить, нажмите y и Enter и дождитесь, когда процесс установки завершится.
- Если мы говорим о системах, основанных на CentOS и RHEL, которые используют менеджер пакетов yum, вам нужно сделать следующее:
- Обновите список репозитория yum:
sudo yum update
- Установите HAProxy с помощью следующей команды:
sudo yum install haproxy
Дождитесь завершения процесса установки. После чего вы можете перейти к настройке.
Настройка начальной конфигурации
У HAProxy есть образец файла конфигурации, который находится в /etc/haproxy/haproxy.cfg. В этом файле содержатся стандартные настройки без всяких параметров балансировки нагрузки.
Для того, чтобы просмотреть файл конфигурации и изучить его содержимое, воспользуйтесь текстовым редактором:
sudo nano /etc/haproxy/haproxy.cfg
В файле есть два основных раздела:
- Раздел global. В нем содержится конфигурация HAProxy, например, расположение SSL, информация о ведении журналов, а также пользователь и группа, которые ответственны за работу HAProxy. В файле конфигурации есть всего один раздел global, и его значения не должны меняться.
- Раздел defaults . Здесь задаются значения по умолчанию для всех узлов, которые определены ниже. Таких разделов может быть несколько. Каждый последующий переопределяет значения из предыдущего.
Также есть дополнительные разделы, которые относятся к балансировке нагрузки:
- Раздел frontend. Этот раздел содержит информацию об IP-адресах и портах, которые используют клиенты для подключения.
- Раздел backend. Этот раздел определяет пулы серверов, которые выполняют запросы, полученные через интерфейс.
- Раздел listen. Этот раздел совмещает в себе функции двух разделов: frontend и backend. Этот раздел используется для небольших настроек или для маршрутизации к определенной группе серверов.
Вот так выглядит стандартный файл конфигурации балансировщика нагрузки:
global
# process settings { # настройки процесса }
defaults
# default values for sections below { # значения по умолчанию для разделов ниже }
frontend
# server the clients connect to { # сервер, к которому подключаются клиенты }
backend
# servers for fulfilling client requests { # серверы, которые выполняют запросы, полученные от клиентов }
listen
# complete proxy definition { # полное определение прокси-сервера }
Ниже мы подробно описали, как настроить балансировку нагрузки сервера с помощью пользовательского файла конфигурации. Удалите из него все содержимое, установленное по умолчанию, и придерживайтесь следующего примера.
Настройка defaults
Раздел defaults содержит информацию, которую используют все узлы, которые определены ниже. С помощью раздела defaults вы можете определить режим работы и время ожидания. Например,
defaults
mode http
timeout client 5s
timeout connect 5s
timeout server 5s
timeout http-request 5s
Код содержит следующее:
- Раздел mode. Это команда, которая определяет режим работы балансировщика нагрузки – http или tcp. Этот режим указывает HAProxy способ обработки входящих запросов.
- Раздел timeout. Этот раздел содержит различные предупреждающие меры, которые помогают избежать стандартных проблем с подключениями и передачей данных. В зависимости от сценария использования вы можете увеличить или уменьшить значение времени.
- timeout client – это время, в течение которого HAProxy ожидает, что клиент отправит данные.
- timeout connect – это время, которое нужно для того, чтобы установить соединение с сервером.
- timeout server – это время ожидания, которое необходимо для того, чтобы сервер отправил данные.
- timeout http-request – это время ожидания, которое необходимо для того, чтобы клиент отправил полный HTTP-запрос.
Скопируйте и вставьте этот блок кода раздела defaults в файл /etc/haproxy/haproxy.cfg. После чего переходите к настройке следующего раздела.
Настройка frontend
Раздел frontend обеспечивает доступ к веб-сайту или приложению на просторах Интернета. Узел принимает входящие запросы на подключение и направляет их в пул серверов, который находится в серверной части приложения.
Добавьте последние две строки в файл /etc/haproxy/haproxy.cfg:
defaults
mode http
timeout client 10s
timeout connect 5s
timeout server 10s
timeout http-request 10s
frontend my_frontend
bind 127.0.0.1:80
Эти новые строки содержат следующую информацию:
- frontend определяет начало раздела и задает описательное имя (my_frontend))
- bind привязывает «слушателя» к локальному хосту 127.0.0.1 порта 80, который также является адресом, откуда балансировщик нагрузки получает запросы.
Сохраните файл и перезапустите HAProxy. Для этого запустите следующую команду:
sudo systemctl restart haproxy
Соединение начнет прослушивать запросы на 127.0.0.1:80. Чтобы протестировать, отправьте запрос, используя команду curl:
curl 127.0.0.1:80
В качестве ответа вам вернется ошибка 503, а это значит, что сервер вам не ответил. Такой ответ вполне логичный, поскольку на данный момент у нас нет внутренних серверов. Следующим шагом мы настроим внутренний узел.
Настройка backend
Backend – это пул серверов, который отвечает за выполнение и разрешение запросов, поступающих от клиентов. Этот раздел определяет то, как балансировщик нагрузки распределяет рабочую нагрузку между несколькими серверами.
Добавьте в файл /etc/haproxy/haproxy.cfg информацию о серверной части:
defaults
mode http
timeout client 10s
timeout connect 5s
timeout server 10s
timeout http-request 10s
frontend my_frontend
bind 127.0.0.1:80
default_backend my_backend
backend my_backend
balance leastconn
server server1 127.0.0.1:8001
server server2 127.0.0.1:8002
Каждая строка несет в себе определенную информацию:
- default_backend в разделе frontend устанавливает соединение между клиентом и сервером
- backend содержит описательное имя (my_backend) для пула серверов, которое нам нужно для того, чтобы взаимодействовать с клиентом
- balance - это алгоритм балансировки нагрузки. Если этот параметр не указан, то по умолчанию используется циклический алгоритм
- server в каждой строке определяет новый сервер с уникальным именем, IP-адресом и портом
Чтобы протестировать, выполните следующие действия:
1. Сохраните файл и перезапустите HAProxy:
sudo systemctl restart haproxy
2. Для того, чтобы создать веб-сервер, привяжите порты серверов к адресу. Запустите команды в двух разных вкладках терминала:
python3 -m http.server 8001 --bind 127.0.0.1
python3 -m http.server 8002 --bind 127.0.0.1
3. Откройте третье окно терминала и отправьте запрос для того, чтобы убедиться, что соединение установлено:
curl 127.0.0.1
Сервер обрабатывает запрос, полученный от клиента, и отвечает. В результате отображается содержимое каталога, в котором был запущен сервер.
Для того, чтобы увидеть запрос, проверьте окно терминала запущенного сервера.
В результате вы увидите GET-запрос с ответом 200.
Настройка правил
Вы можете определить дополнительные правила, которые помогут настроить балансировщик нагрузки для того, чтобы он мог обрабатывать исключения. Допустим, у нас есть несколько серверов, к которым мы направляет запросы, полученные от клиентов, а эти правила помогают определить, когда и какой сервер будет использоваться.
Ниже представлен пример такой настройки:
defaults
mode http
timeout client 10s
timeout connect 5s
timeout server 10s
timeout http-request 10s
frontend my_frontend
bind 127.0.0.1:81, 127.0.0.1:82, 127.0.0.1:83
use_backend first if { dst_port = 81 }
use_backend second if { dst_port = 82 }
default_backend third
backend first
server server1 127.0.0.1:8001
backend second
server server2 127.0.0.1:8002
backend third
server server3 127.0.0.1:8003
Код выполняет следующие функции:
- Привязывает адрес к трем портам (81, 82 и 83)
- Устанавливает правило, которое гласит, что если в качестве порта-адресата установлен порт под номером 81, то мы используем первый (first) сервер
- Добавляет еще одно правило, которое гласит, что если в качестве порта-адресата установлен порт под номером 82, то мы используем второй (second) сервер
- Определяет сервер по умолчанию (third), который используется во всех остальных случаях
Для того, чтобы перенаправлять трафик на разные веб-сайты или приложения, используйте несколько серверов и правил.
Мониторинг
Для того, чтобы производить мониторинг всех узлов на предмет работоспособности посредством веб-приложения, вам потребуются разделы global и listen. Самая простая настройка выглядит вот так:
global
stats socket /run/haproxy/admin.sock mode 660 level admin
defaults
mode http
timeout client 10s
timeout connect 5s
timeout server 10s
timeout http-request 10s
frontend my_frontend
bind 127.0.0.1:80
default_backend my_backend
backend my_backend
balance leastconn
server server1 127.0.0.1:8001
server server2 127.0.0.1:8002
listen stats
bind :8000
stats enable
stats uri /monitoring
stats auth username:password
Вот, что мы добавили в файл:
- Раздел global подключает Runtime API stats socket. Подключение к сокету позволяет выполнять мониторинг сервера в динамическом режиме через встроенное веб-приложение.
- Раздел listen обеспечивает работу страницы мониторинга через порт 8000 с помощью URL/monitoring, а для того, чтобы получить доступ к этой странице, необходимо ввести учетные данные.
Для того, чтобы получить доступ к странице мониторинга, нужно выполнить следующее:
1. Сохраните файл конфигурации и перезапустите HAProxy:
sudo systemctl restart haproxy
2. Откройте веб-браузер и введите в качестве адреса веб-страницы 127.0.0.1:8000/monitoring.
3. Страница отобразит окно входа в систему. Введите учетные данные, которые были указаны в строке stats auth username:password, которая находится в разделе listen.
4. На экране отобразится страница мониторинга, на которой показаны различные статистические параметры для каждого узла.
Статистический отчет отображает подробную информацию, касающуюся клиента и сервера, а итоговая таблица – их общую статистическую информацию.
Заключение
Прочитав это руководство, вы узнали, как можно настроить самый простой балансировщик нагрузки с помощью HAProxy. Здесь продемонстрировано не только как можно настроить балансировщик нагрузки, но и как производить мониторинг узлов.