img

Как выполнить балансировку нагрузки с помощью HAProxy

21 ноября
20:00
Бесплатный вебинар
Введение в Docker
Ведущий — Филипп Игнатенко.
Руководитель центра разработки
Записаться
img
img

 

Введение

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

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, вам нужно сделать следующее:

 

  1. Обновите список пакетов:
sudo apt update
  1. Установите HAProxy с помощью следующей команды:
sudo apt install haproxy

sudo apt install haproxy terminal output

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

  • Если мы говорим о системах, основанных на CentOS и RHEL, которые используют менеджер пакетов yum, вам нужно сделать следующее:

 

  1. Обновите список репозитория yum:
sudo yum update

 

  1. Установите HAProxy с помощью следующей команды:
sudo yum install haproxy

Дождитесь завершения процесса установки. После чего вы можете перейти к настройке. 

Настройка начальной конфигурации

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

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

sudo nano /etc/haproxy/haproxy.cfg

В файле есть два основных раздела:

  • Раздел global. В нем содержится конфигурация HAProxy, например, расположение SSL, информация о ведении журналов, а также пользователь и группа, которые ответственны за работу HAProxy. В файле конфигурации есть всего один раздел global, и его значения не должны меняться.

 

haproxy.cfg global section default

 

  • Раздел defaults . Здесь задаются значения по умолчанию для всех узлов, которые определены ниже. Таких разделов может быть несколько. Каждый последующий переопределяет значения из предыдущего.

 

haproxy.cfg defaults section default

Также есть дополнительные разделы, которые относятся к балансировке нагрузки:

  • Раздел 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

haproxy load balancer defaults section

Код содержит следующее:

  • Раздел 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

haproxy load balancer frontend section

Эти новые строки содержат следующую информацию:

  • 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

restart haproxy curl 503 error

В качестве ответа вам вернется ошибка 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

haproxy load balancer backend setup

Каждая строка несет в себе определенную информацию:

  • 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

python3 -m http.server bind port 8001 terminal output

3. Откройте третье окно терминала и отправьте запрос для того, чтобы убедиться, что соединение установлено:

curl 127.0.0.1

curl 127.0.0.1 response

Сервер обрабатывает запрос, полученный от клиента, и отвечает. В результате отображается содержимое каталога, в котором был запущен сервер.

Для того, чтобы увидеть запрос, проверьте окно терминала запущенного сервера.

server get request http response 200

В результате вы увидите 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

haproxy load balancer rules multiple backends

Код выполняет следующие функции:

  • Привязывает адрес к трем портам (8182 и 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

haproxy load balancer monitoring global and listen sections

Вот, что мы добавили в файл:

  • Раздел 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.

127.0.0.1 port 8000 haproxy monitoring login

4. На экране отобразится страница мониторинга, на которой показаны различные статистические параметры для каждого узла.

haproxy load balancer stats monitoring page

Статистический отчет отображает подробную информацию, касающуюся клиента и сервера, а итоговая таблица – их общую статистическую информацию.

Заключение

Прочитав это руководство, вы узнали, как можно настроить самый простой балансировщик нагрузки с помощью HAProxy. Здесь продемонстрировано не только как можно настроить балансировщик нагрузки, но и как производить мониторинг узлов.

Ссылка
скопирована
Получите бесплатные уроки на наших курсах
Все курсы
DevOps
Скидка 25%
DevOps-инженер с нуля
Научитесь использовать инструменты и методы DevOps для автоматизации тестирования, сборки и развертывания кода, управления инфраструктурой и ускорения процесса доставки продуктов в продакшн. Станьте желанным специалистом в IT-индустрии и претендуйте на работу с высокой заработной платой.
Получи бесплатный
вводный урок!
Пожалуйста, укажите корректный e-mail
отправили вводный урок на твой e-mail!
Получи все материалы в telegram и ускорь обучение!
img
Еще по теме:
img
Git Flow - это специальная система ветвления для Git. Она помогает команде лучше контролировать и добавлять различные версии про
img
Docker — популярная платформа виртуализации на уровне ОС. Она поставляет приложения в пакетах (контейнерах), которые, представля
img
Хуки в Git — это bash-скрипты, которые запускаются до или после команд Git, например, коммитов и пушей. Они позволяют автоматизи
img
  Nomad и Kubernetes – это две самые популярные платформы оркестровки, предназначенные для оркестровки динамических рабочих нагр
img
  Давайте узнаем о новом Ops-течении – GitOps! DevOps поспособствовал цифровизации многих компаний. Речь идет о командах разрабо
img
  Канареечное (canary) развёртывание – это метод разработки и развертывания программного обеспечения, который позволяет выпускат
21 ноября
20:00
Бесплатный вебинар
Введение в Docker