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-х секциях:
- global. Глобальные настройки, распространяемые на все публикации.
- defaults. Настройки, применяемые по умолчанию, если они не указаны явно в публикации.
- frontend. Правила обработки запросов, приходящих на сервер и передачи этих запросов серверам backend. Может быть несколько.
- 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
При настройке указываем:
- Как распределяется нагрузка между серверами. Доступны варианты:
- roundrobin — серверы используются по очереди. Нагрузка распространяется равномерно, в зависимости от указанного веса. Вес может быть изменен на лету.
- static-rr — серверы используются по очереди. Нагрузка распространяется равномерно, в зависимости от указанного веса. Вес не может быть изменен на лету.
- lessconn — запросы идут к серверу с наименьшим количеством активных подключений.
- source — запросы от одного и того же IP-адреса идут на один и тот же сервер.
- uri — запросы с одним и тем же URL (до знака вопроса) будут переправляться на один и тот же сервер.
- url_param — запросы с одинаковыми параметрами GET (все, что после знака вопроса) будут переправляться на один и тот же сервер.
- На какие именно серверы передавать запросы.
Пример:
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);