Популярность любого веб-ресурса это всегда хорошо – чем больше посещений, тем более популярен контент, представленный на данном ресурсе. Однако, у всего есть обратная сторона и высокая посещаемость не является исключением. Большое количество посетителей рано или поздно приведет к сбоям в работе веб сервера, если своевременно не проводить масштабирование ресурсов. Но лучшим решением является балансировка нагрузки между несколькими узлами. В таком случае мы, во-первых, можем распределить запросы пользователей между всеми узлами равномерно, а во-вторых, в случае отказа одного из узлов веб ресурс будет по-прежнему доступен, так как остальные серверы продолжат свою работу. Таким образом, балансировщик нагрузки – это распределитель рабочей нагрузки, который обеспечивает бесперебойную работу, хорошую производительность и доступность ваших веб-сайтов в условиях всплеска трафика.
Собственно, выполнять балансировку можно различными методами: с помощью аппаратных средств, политик DNS или с помощью программной балансировки нагрузки.
Аппаратная балансировка построена на основе специализированных устройств для распределения трафика. При правильном выборе самих устройств и грамотных политиках это может оказаться наиболее надежным вариантом
Использование DNS предполагает, что обращения пользователей будут отправляться на разные узлы при разрешении доменных имен. Просто одному имени будут соответствовать несколько адресов и запросы, как правило циклично, будут распределяться между всеми узлами, связанными с данным именем. Здесь серьезным недостатком является то, что в случае возникновения каких-либо сбоев или ошибок в сети может значительно пострадать надежность вашей системы. DNS не отслеживает неполадки маршрутизации на IP-адресе получателя, в связи с чем он продолжает направлять трафик получателю еще какое-то время, даже если он недоступен.
При использовании программной балансировки нагрузки распределение нагрузки осуществляется программным способом с помощью различных алгоритмов. Одним из наиболее распространенных решений является HAProxy. Это бесплатное решение входит в состав большинства дистрибутивов Linux. Не является исключением и российский дистрибутив Astra Linux, о котором мы и будем говорить далее. Данный дистрибутив не нуждается в особом представлении, на Хабре о нем написано множество статей, поэтому мы перейдем сразу к настройке HAProxy.
Необходимые пакеты
Для того, чтобы начать использовать HAProxy необходимо установить на основном сервере, отвечающем за прием и распределение запросов соответствующий пакет haproxy.
Это можно сделать с помощью команды:
sudo apt install haproxy
Далее нам необходимо выполнить некоторые настройки непосредственно на веб серверах, участвующих в процессе балансировки нагрузки.
Установим пакет apache2 и перезапустим службу:
sudo apt install apache2
sudo apachectl restart
Настройка HAproxy
Далее вернемся на наш основной сервер балансировщик и выполним настройки в конфигурационном файле /etc/haproxy/haproxy.cfg.
Начнем с раздела Global. Здесь необходимо указать настройки логирования:
log <address> <facility> [max level [min level]]
Например, для локального сохранения событий необходимо указать:
log 127.0.0.1 local0 notice
Далее укажем максимальное количество подключений
maxconn 1000
Задает количество процессов haproxy. По умолчанию создается только один процесс haproxy.
nbproc 2
Параметр daemon устанавливает процессу haproxy режим работы <<daemon>>.
Кроме того, нам нужно указать пользователя и группу, от имени которых работает процесс haproxy. За это отвечают параметры user
и group
.
Установим окружение процесса haproxy.
chroot /var/lib/haproxy
Режимы работы
Отдельно остановимся на режимах работы HAProxy. Возможны два режима: TCP, когда распределение пакетов между нодами осуществляется на транспортном уровне и HTTP, когда выполняется анализ на уровне приложений. Данный вариант подходит для распределения http-трафика. Так как мы хотим обеспечивать балансировку для веб ресурса то укажем режим http.
mode http
Укажем еще несколько важных параметров. Начнем с количества попыток определить состояние обслуживающего сервера после сбоя подключения.
retries 3
В случае сбоя обслуживающих серверов нам необходимо перераспределять запросы
option redispatch
Далее зададим имя фронтенда, его адрес и порт:
frontend frontend http
bind *:80
Алгоритмы распределения
И еще один важный - параметр это алгоритм распределения. На этом пункте мы также остановимся отдельно. HAProxy предлагает несколько алгоритмов.
Round Robin --- направляет новые подключения к следующему серверу в циклическом списке, который видоизменяется при помощи веса сервера, на основании которого идет распределение запросов. Вес сервера можно изменить <<на лету>>. Параметр включается при помощи команды balance roundrobin;
Least Connected --- направляет новые подключения к серверу с наименьшим числом соединений. Параметр включается при помощи команды balance leastconn;
Static Round Robin --- направляет новые подключения к следующему серверу в циклическом списке, который видоизменяется при помощи веса сервера, на основании которого идет распределение запросов. В отличие от стандартной реализации Round Robin, в данном алгоритме нельзя изменить вес сервера <<на лету>>. Изменение веса сервера требует перезагрузки HAProxy. Параметр включается при помощи команды balance static-rr;
Source --- выбирает сервер исходя из хеша, построенного на основе IP-адреса пользователя. Таким образом, пользователь всегда обращается к одному и тому же серверу.
Соответственно, в параметре balance указываем нужное значение:
balance (roundrobin/leastconn/static-rr/uri/source)
Обслуживающие узлы
В параметре server мы указываем необходимые данные для взаимодействия с обслуживающими серверами. В частности: имя сервера, IP-адрес: порт, задание cookie, необходимого для правильного распределения сессий клиентов, интервал времени, через который проводится проверка доступности, количество ошибок, после которого сервер считается недоступным, количество одновременно обрабатывающихся запросов, вес сервера (от 1 до 100).
Вот пример записи с соответствующими параметрами:
server srv-1.3.my.com 21.86.21.20:80 cookie site113ha check inter 2000 fall 3 minconn 30 maxconn 70 weight 100
На самом деле нет необходимости править конфигурационный файл с нуля. Вместо этого можно использовать стандартный конфигурационный файл, добавив в него инструкции по приему и распределению запросов, например добавив в файл следующие строки:
![](https://habrastorage.org/getpro/habr/upload_files/f58/0c5/aae/f580c5aae98e385710bb5e8a8420e072.png)
После внесения всех необходимых изменений в конфигурационный файл перезапустить службу haproxy:
sudo systemctl restart haproxy
Простое тестирование
Для проверки правильности настройки распределения нагрузке на сайте Астры предлагается выполнить следующий скрипт
for i in {1..1000} ; do
wget --no-cache -qO- http://IP_балансировщика/index.html > /dev/null &
done
wait
В результате выполнения сценария на основном сервере в журнале службы haproxy (файл /var/log/haproxy.log) должны появиться записи, сообщающие о перераспределении нагрузки, следующего вида:
![](https://habrastorage.org/getpro/habr/upload_files/499/294/ddf/499294ddfcb26f7e4c2228b04de69592.png)
Как видно, балансировщик получает запросы и перераспределяет их между узлами host1 и host2, тем самым обеспечивая распределение нагрузки между двумя узлами.
Заключение
В этой небольшой статье мы рассмотрели установку и настройку HAProxy на российской ОС Astra Linux. Использование балансировщиков при грамотной настройке позволяет существенно увеличить надежность и производительность ресурсов.
Научиться профессиональному подбору конфигураций, управлению процессами, обеспечению безопасности, развертыванию, настройке и обслуживанию сетей можно на странице курса "Administrator Linux. Professional".
Комментарии (3)
Testman2023
23.08.2024 19:55Вольный пересказ статьи из wiki astralinux? Даже скрины совпадают.
Haproxy масштабирование TCP- и HTTP-приложений
panfilovalexey
А в астра-линуксе уже починили этот баг, когда в консоли написано «нажмите да/нет», а нажать нужно «y/n”?
kvazimoda24
Это не только в Астра линукс. Аналогичное видел и в Дебиане.