Проблема
Я использую haproxy для балансировки нагрузки веб-серверов. Я использую постоянство сеанса с дополнительными файлами cookie, поскольку некоторые приложения используют файлы сеанса, и они не синхронизируются между серверами.
Я хочу отключить сервер для обслуживания, но не прерывая сеансы. Поэтому я хотел бы разрешить существующим клиентам продолжить сеанс приложения, но не принимать новых клиентов.
поведение haproxy
- Я настроил сервер на «обслуживание»
- если у клиента установлен файл cookie, используйте сервер, даже если он помечен как «входящий в обслуживание»
- если приходит новый клиент (без cookie), он направляется на другой сервер
- после того, как все клиенты завершат свои сеансы приложений, больше ни у одного клиента не будет установлен 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-сеанса. Это правильно?