Я использую haproxy для балансировки нагрузки на веб-серверы. Я использую постоянство сеанса с дополнительными файлами cookie, поскольку некоторые приложения используют файлы сеанса, и они не синхронизируются между серверами.
Я хочу отключить сервер для обслуживания, но без прерывания сеансов. Поэтому я хотел бы разрешить существующим клиентам продолжать сеанс работы с приложением, но не принимать новых клиентов.
Как вы думаете, это возможно с помощью некоторой конфигурации haproxy? Или есть хитрый способ сделать это?
Неполный список других способов достижения этой потребности:
Я использую такую конфигурацию:
frontend https-in
bind xxx.xxx.xxx.xxx:443 ssl crt /etc/haproxy/ssl/_default.pem crt /etc/haproxy/ssl
reqadd X-Forwarded-Proto:\ https
acl APP1 hdr(host) -i APP1.atac.local
use_backend APP1 if APP1
default_backend _default
backend APP1
redirect scheme https if !{ ssl_fc }
mode http
balance roundrobin
cookie HAPROXY_SESSION insert indirect
option httpchk HEAD /haproxy_test_page.php HTTP/1.0\nUser-Agent:\ HAProxy
server SRV1 SRV1_IP:PORT cookie SRV1 check
server SRV2 SRV2_IP:PORT cookie SRV2 check
Если я просто отключу SRV1 (с помощью команды haproxy cli), я думаю, что все сеансы приложений, открытые на SRV1, прервутся после завершения текущего HTTP-сеанса. Это правильно?
Если вы используете сокат для связи с вашими конфигурациями haproxy вы можете перевести сервер в состояние утечки следующим образом:
echo "set server backend/serv state drain" | sudo socat stdio /etc/haproxy/haproxysock
Больше команд Вот! Для установки socat в Ubuntu перейдите по этой ответ
Я тестирую это с версией haproxy 1.6.3 :)
Переведите сервер в режим слива с помощью веб-интерфейса управления. Это обеспечивает именно ту функциональность, которую вы ищете.
Другие способы
синхронизировать файлы сеанса между серверами (требуется способ синхронизации файлов между несколькими серверами или общая единственная точка монтирования)
Если ваши внутренние серверы используют PHP для приложений, вы можете использовать Memcache для синхронизации сеансов между ними.
Также Couchbase-Сервер может выполнять репликацию кэша памяти из коробки.
Конечно, использование couchbase-server только для репликации сессий - излишество :)
Для будущего читателя, который хочет слить бэкэнд из контейнера HAProxy ...
docker exec $(docker ps | grep haproxy | awk '{print $1}') bash -c 'echo "set server backend_name/svc_name state drain" | nc -U /haproxy.sock'
Примечание:
В /haproxy.sock
путь - это тот, который вы указали в haproxy.cfg
файл [например stats socket /haproxy.sock mode 660 level admin
]