Перейти к содержанию

Балансировка HAProxy

HAProxy — балансировщик нагрузки и прокси с открытым исходным кодом, публикующий узлы кластера AFIGate под одним адресом и распределяющий трафик между ними.

В примере: HAProxy на отдельном сервере 10.10.50.30; узлы кластера — Node1 10.10.50.21 и Node2 10.10.50.22.

Установка (на примере Ubuntu):

sudo apt install haproxy -y

Файл конфигурации обычно находится в /etc/haproxy/haproxy.cfg.

Пример конфигурации

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
    option                  dontlognull
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

listen stats
    bind *:8080
    mode http
    stats enable
    stats uri /haproxy                      # страница мониторинга: http://10.10.50.30:8080/haproxy
    stats refresh 5s
    stats realm haproxy-status
    stats auth admin:KXOeyNgDeTdpeu9q       # учетная запись и пароль доступа к странице мониторинга

#---------------------------------------------------------------------
# check/inter/rise/fall — параметры проверки активности backend-сервера:
# inter — интервал проверки (мс), rise — число успешных проверок подряд
# для перевода сервера в рабочее состояние, fall — число неудачных проверок
# подряд для перевода сервера в нерабочее состояние.
# Пример: inter 2s rise 2 fall 3 — проверка каждые 2 секунды, 2 успеха
# подряд считаются нормой, 3 неудачи подряд — отказом сервиса.
#
# server <имя> <адрес>:<порт> weight 1 cookie <cookie>
# <имя> — произвольный идентификатор сервера в статистике HAProxy;
# <адрес>:<порт> — фактический адрес и порт узла AFIGate;
# weight — вес сервера при распределении нагрузки;
# cookie — идентификатор, закрепляющий клиента за конкретным узлом.
#---------------------------------------------------------------------

listen afigate-web
    bind *:80                               # публикация Web на порту 80
    mode http

    # redirect scheme https if !{ ssl_fc }  # перенаправление на https
    # bind *:443 ssl crt /opt/ssl.pem       # публикация по https

    option httpchk GET /api/health/         # проверка активности Core

    stick-table type ip size 200k expire 30m
    stick on src

    balance leastconn
    server node1 10.10.50.21:80 weight 1 cookie web01 check inter 2s rise 2 fall 3
    server node2 10.10.50.22:80 weight 1 cookie web02 check inter 2s rise 2 fall 3

listen afigate-ssh
    bind *:2222                             # нативные SSH-клиенты через Koko
    mode tcp

    option tcp-check

    fullconn 500
    balance source
    server node1 10.10.50.21:2222 weight 1 check inter 2s rise 2 fall 3 send-proxy
    server node2 10.10.50.22:2222 weight 1 check inter 2s rise 2 fall 3 send-proxy

listen afigate-koko
    mode http                               # веб-SSH/SFTP (Koko)

    option httpclose
    option forwardfor
    option httpchk GET /koko/health/ HTTP/1.1\r\nHost:\ 10.10.50.30  # проверка активности Koko; в Host укажите адрес HAProxy

    cookie SERVERID insert indirect
    hash-type consistent
    fullconn 500
    balance leastconn
    server node1 10.10.50.21:80 weight 1 cookie web01 check inter 2s rise 2 fall 3
    server node2 10.10.50.22:80 weight 1 cookie web02 check inter 2s rise 2 fall 3

listen afigate-lion
    mode http                               # веб-RDP и виртуальные приложения (Lion)

    option httpclose
    option forwardfor
    option httpchk GET /lion/health/ HTTP/1.1\r\nHost:\ 10.10.50.30  # проверка активности Lion; в Host укажите адрес HAProxy

    cookie SERVERID insert indirect
    hash-type consistent
    fullconn 500
    balance leastconn
    server node1 10.10.50.21:80 weight 1 cookie web01 check inter 2s rise 2 fall 3
    server node2 10.10.50.22:80 weight 1 cookie web02 check inter 2s rise 2 fall 3

listen afigate-db
    bind *:30000                            # нативный DB-прокси afigate_db (пример для одного порта/СУБД)
    mode tcp

    option tcp-check

    fullconn 500
    balance source
    server node1 10.10.50.21:30000 weight 1 check inter 2s rise 2 fall 3 send-proxy
    server node2 10.10.50.22:30000 weight 1 check inter 2s rise 2 fall 3 send-proxy

После изменения конфигурации запустите и включите автозапуск службы:

sudo systemctl enable haproxy
sudo systemctl start haproxy

Публикация afigate_db и afigate_rdp

afigate_db слушает разные порты в зависимости от типа СУБД (PostgreSQL, MySQL/MariaDB, MongoDB, Redis, ClickHouse, Oracle JDBC), нативный RDP-клиент подключается через afigate_rdp на порту 3389, а Git — через добавьте отдельный listen-блок в режиме tcp с option tcp-check и send-proxy, аналогично блоку afigate-db выше, указав соответствующий порт на обоих узлах.

Предупреждение

Подключения SSH, RDP, DB и Git — долгоживущие. Не применяйте к ним короткие HTTP-тайм-ауты и не используйте режим http для TCP-протоколов.