HAProxy – прокси сервер

High Availability Proxy или HAProxy – популярный прокси сервер для Linux, Solaris и FreeBSD с возможностью балансировки нагрузки TCP/HTTP с открытым программным кодом. Его основная задача – повышение производительности серверной среды путем распределения рабочей нагрузки среди нескольких серверов (web, приложения, базы данных). Им пользуются такие известные проекты как GitHub, Imgur, Instagram и Twitter.

Установка

HAProxy доступен в репозиториях большинства дистрибутивов Linux. Если вы пользователь FreeBSD, то ниже будут предоставлены нужные  порты. Также вы можете установить HAProxy  с помощью менеджера пакетов.

  • Для  DEB-based дистрибутивов, например Debian и Ubuntu, выполните следующую команду:

$ sudo apt-get install haproxy

  • Для RPM-based дистрибутивов, например Red Hat, Fedora и CentOS, выполните следующую команду:

$ sudo yum install haproxy

  • Для SUSE-based дистрибутивов, например SUSE Enterprise Linux и openSUSE, выполните следующую команду:

$ sudo zypper install haproxy

  • Для FreeBSD и подобных операционных систем, HAProxy  можно установить из коллекции  портов и путь до него следующий: /usr/ports/net/haproxy. В качестве альтернативы, вы можете установить его с помощью менеджера пакетов:

$ sudo pkg install net/haproxy

Это установит HAProxy  на вашу систему. В том случае, если команда для вашего дистрибутива или операционной системы не работает, проверьте документацию или репозиторий вашей системы, для правильной установки  HAProxy.

Конфигурация

Параметры конфигурации для HAProxy настраиваются с помощью файла haproxy.cfg. Вышеуказанные команды установки обычно помещают данный файл в директорию  /etc/haproxy/, однако этот путь может быть совсем другим(это зависит от вашей операционной системы).

Чтобы настроить HAProxy для работы с Galera кластером, добавьте следующие строки в конфигурационный файл haproxy.cfg:

# Load Balancing for Galera Cluster
listen galera 192.168.1.10:3306
balance source
mode tcp
option tcpka
option mysql-check user haproxy
server node1 192.168.1.1:3306 check weight 1
server node2 192.168.1.2:3306 check weight 1
server node2 192.168.1.3:3306 check weight 1

Создай прокси для Galera кластера с помощью параметра listen. Это дает HAProxy произвольное имя для прокси-сервера и определяет IP-адрес и порт, на котором вы хотите прослушивать входящие соединения. В этом файле под параметром listen, после отступа есть и другие опции. Ниже кратко описывается  их предназначение.

  • balance определяет политику выбора пункта назначения, то есть какой сервер должен распределять входящие соединения.
  • mode tcp  определяет тип соединений, которые он должен распределять. Galera кластер использует TCP соединения.
  • option tcpka включает активную функцию для поддержания TCP соединения.
  • option mysql-check user <username> включает проверку сервера базы данных, чтобы определить, является ли в настоящее время узел действующим.
  • server <server-name> <IP_address> check weight 1 определяет узлы, которые необходимы HAProxy для их дальнейшего использования в маршрутизации соединений.

Политика выбора пункта назначения

Когда HAProxy получает новое соединение, существует целый ряд алгоритмов, с помощью которых он выбирает куда направить эту связь. Этот алгоритм выбирается параметром balance, который описывался выше.

  • Round Robin направляет новые подключения к следующему месту назначения в циклическом списке, который видоизменяется  при помощи так называемого веса сервера, на основании которого идет распределение запросов. 
  • Static Round Robin  направляет новые подключения к следующему месту назначения в циклическом списке, который видоизменяется  при помощи так называемого веса сервера, на основании которого идет распределение запросов. В отличие от стандартной реализации  round robin  вы не можете изменить вес сервера на “лету”. Изменение веса сервера требует перезагрузки HAProxy. Вы можете включить данную опцию при помощи balance static-rr
  • Least Connected направляет новые подключения к серверу с наименьшим числом доступных соединений. Вы можете включить данную опцию при помощи balance leastconn.
  • First направляет новые подключения к первому же серверу, на котором доступен слот подключения.  Они будут выбираться из интервала от самого маленького числового идентификатора до самого максимального.  После того как сервер достиг максимального значения соединения, HAProxy переходит к следующему в списке.  Вы можете включить данную опцию при помощи balance first.
  • Source Tracking делит IP-адрес источника на суммарный вес всех запущенных серверов. Вы можете включить данную опцию при помощи  balance source.

В приведенном выше примере конфигурации HAProxy настроен на использование политики выбора источника сигнала. Для ваших собственных реализаций, выберите политику, которая лучше всего работает с инфраструктурой и нагрузкой.

Проверка базы данных Сервера

В дополнение к маршрутизации TCP соединений к Galera кластеру, HAProxy может также выполнять основные проверки работоспособности на сервере базы данных. Если это разрешено, то HAProxy попытается установить соединение с узлом и разберет полученный ответ или ошибки, чтобы определить находится ли этот узел в рабочем состоянии. Вы можете включить данную опцию при помощи mysql-check. Тем не менее, она требует чтобы вы создали пользователя в кластере HAProxy, которого вы будете использовать при подключении.

$ CREATE USER ‘haproxy’@’192.168.1.10’;

Определите имя пользователя так же, как указано в конфигурационном файле haproxy.cfg для опции mysql-check. Замените IP-адрес на адрес сервера, на котором работает HAProxy.

Использование HAProxy

После завершения настройки HAProxy и узлов, чтобы начать работать с HAProxy  вы должны запустить его на сервере.  Для серверов, использующих init, запустите следующие команды:

$ service haproxy start

Для серверов, использующих systemd, выполните другую команду:

$ systemctl start haproxy

Теперь HAProxy работает. Когда новые соединения обращаются к этому серверу, то он направляет их через узлы в кластере.

В качестве примера выкладываю отличный конфигурационный файл:

#———————————————————————
# Global settings
#———————————————————————
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
log global
retries 2
mode http
timeout connect 30000
timeout server 50000
timeout client 50000
listen myql_cluster 0.0.0.0:3306
balance source
mode tcp
option tcpka
server node1 85.34.56.45 check weight 1
server node2 85.34.56.45 check weight 1
server node2 85.34.56.45 check weight 1
listen stats *:1936
stats enable
stats uri /
stats hide-version
stats auth admin:MakeAmericaGreatAgain