HAProxy (High Availability Proxy) – это популярный и открытый балансировщик нагрузки TCP/HTTP и прокси-сервер для систем Linux. Он позволяет улучшить производительность и отказоустойчивость серверного окружения путём распределения рабочей нагрузки между несколькими серверами (например, между веб-сервером, сервером баз данных и сервером приложений). HAProxy используют различные проекты с высокой нагрузкой: GitHub, Spotify, Instagram, Facebook и Twitter.

Установка

для Ubuntu / Debian

apt install haproxy

для Centos / Fedora / RedHat

yum install haproxy
systemctl start haproxy
systemctl enable haproxy

Конфигурирование

Конфигурирование HAProxy выполняется в файле /etc/haproxy/haproxy.cfg. Все основные настройки находятся в 4-х секциях:

  1. global. Глобальные настройки, распространяемые на все публикации.
  2. defaults. Настройки, применяемые по умолчанию, если они не указаны явно в публикации.
  3. frontend. Правила обработки запросов, приходящих на сервер и передачи этих запросов серверам backend. Может быть несколько.
  4. backend. Настройка конечных серверов, которые обрабатывают запросы и возвращают результаты. Может быть несколько.

Также есть возможность создать дополнительные секции, например userlist.

Настройка frontend

При настройке прослушивания внешних запросов, основное, что мы указываем:

  • IP-адрес и порт прослушивания.
  • Правила, по которым обрабатываются запросы.
  • Группы серверов, на которые будет перекинут запрос.

Пример:


frontend balance_http
bind 192.168.0.15:80
acl url_stat       path_end       -i .css .js
use_backend static          if url_stat
default_backend webserver

в данном случае мы слушаем веб-запросы и если они идут на файлы с расширениями .css или .js, передаем запрос на бэкэнд с название static. Все остальные запросы передаем на бэкэнд webserver.

  • где balance_http — название фронтэнда; bind 192.168.0.15:80 — слушаем на адресе 192.168.0.15, порту 80; url_stat — название правила; use_backend static if url_stat — правило обработки, при котором запросы, попавшие под действие правила url_stat, должны быть обработаны бэкэндом static; default_backend — указывает, какой бэкэнд будет использоваться по умолчанию.

Настройка backend

При настройке указываем:

  1. Как распределяется нагрузка между серверами. Доступны варианты:
    • roundrobin — серверы используются по очереди. Нагрузка распространяется равномерно, в зависимости от указанного веса. Вес может быть изменен на лету.
    • static-rr — серверы используются по очереди. Нагрузка распространяется равномерно, в зависимости от указанного веса. Вес не может быть изменен на лету.
    • lessconn — запросы идут к серверу с наименьшим количеством активных подключений.
    • source — запросы от одного и того же IP-адреса идут на один и тот же сервер.
    • uri — запросы с одним и тем же URL (до знака вопроса) будут переправляться на один и тот же сервер.
    • url_param — запросы с одинаковыми параметрами GET (все, что после знака вопроса) будут переправляться на один и тот же сервер.
  2. На какие именно серверы передавать запросы.

Пример:


backend webserver
balance     roundrobin
server  server1 192.168.0.20:80 check
server  server2 192.168.0.30:80 check
  • где webserver — название бэкэнда; balance — опция определения алгоритма распределения запросов между серверами; server — указывает имя и IP-адрес сервера, на который передается запрос; check — указываем, что необходимо проверять состояние сервера.для работы достаточно и одного сервера, но несколько добавят отказоустойчивости.

После внесения изменений в настройку HAProxy, необходимо перезапустить сервис:


systemctl restart haproxy
# или просто перечитать настройки:
systemctl reload haproxy

Виды балансировки нагрузки

  • roundrobin - каждый сервер получает запросы пропорционально своему весу, при этом веса серверов могут меняться на лету;
  • static-rr - то же, что и roundrobin, только изменение весов на лету не даст никакого эффекта;
  • leastconn - выбирает сервер с наименьшим количеством активных соединений;
  • first - выбирает первый сервер с доступными слотами для соединенияsource - на основе хэша IP-адреса отправителя запроса и весов серверов назначается сервер для соединения;
  • uri - сервер выбирается на основе адреса (без параметров) страницы;
  • url_param - сервер выбирается на основе GET-параметров запроса;
  • hdr - сервер выбирается на основе заголовков запроса;
  • rdp-cookie - сервер выбирается на основе cookie (если они не установлены, то применяется обычный roundrobin);