Балансировка HAProxy¶
HAProxy — балансировщик нагрузки и прокси с открытым исходным кодом, публикующий узлы кластера AFIGate под одним адресом и распределяющий трафик между ними.
В примере: HAProxy на отдельном сервере 10.10.50.30; узлы кластера —
Node1 10.10.50.21 и
Node2 10.10.50.22.
Установка (на примере Ubuntu):
Файл конфигурации обычно находится в /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
После изменения конфигурации запустите и включите автозапуск службы:
Публикация 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-протоколов.