Популярность любого веб-ресурса это всегда хорошо – чем больше посещений, тем более популярен контент, представленный на данном ресурсе. Однако, у всего есть обратная сторона и высокая посещаемость не является исключением. Большое количество посетителей рано или поздно приведет к сбоям в работе веб сервера, если своевременно не проводить масштабирование ресурсов. Но лучшим решением является балансировка нагрузки между несколькими узлами. В таком случае мы, во-первых, можем распределить запросы пользователей между всеми узлами равномерно, а во-вторых, в случае отказа одного из узлов веб ресурс будет по-прежнему доступен, так как остальные серверы продолжат свою работу. Таким образом, балансировщик нагрузки – это распределитель рабочей нагрузки, который обеспечивает бесперебойную работу, хорошую производительность и доступность ваших веб-сайтов в условиях всплеска трафика.

Собственно, выполнять балансировку можно различными методами: с помощью аппаратных средств, политик 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

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

После внесения всех необходимых изменений в конфигурационный файл перезапустить службу 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) должны появиться записи, сообщающие о перераспределении нагрузки, следующего вида:

Как видно, балансировщик получает запросы и перераспределяет их между узлами host1 и host2, тем самым обеспечивая распределение нагрузки между двумя узлами.

Заключение

В этой небольшой статье мы рассмотрели установку и настройку HAProxy на российской ОС Astra Linux. Использование балансировщиков при грамотной настройке позволяет существенно увеличить надежность и производительность ресурсов.


Научиться профессиональному подбору конфигураций, управлению процессами, обеспечению безопасности, развертыванию, настройке и обслуживанию сетей можно на странице курса "Administrator Linux. Professional".

Комментарии (3)


  1. panfilovalexey
    23.08.2024 19:55

    А в астра-линуксе уже починили этот баг, когда в консоли написано «нажмите да/нет», а нажать нужно «y/n”?


    1. kvazimoda24
      23.08.2024 19:55
      +1

      Это не только в Астра линукс. Аналогичное видел и в Дебиане.


  1. Testman2023
    23.08.2024 19:55

    Вольный пересказ статьи из wiki astralinux? Даже скрины совпадают.
    Haproxy масштабирование TCP- и HTTP-приложений