Проблема
Я использую 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-сеанса. Это правильно?
источник
Ответы:
Переведите сервер в режим с использованием интерфейса веб-управления. Это обеспечивает именно ту функциональность, которую вы ищете.
источник
stick-table
с истечением» для обеспечения устойчивости.Если вы используете socat для связи с вашими конфигурациями haproxy, вы можете перевести сервер в состояние стока следующим образом:
echo "set server backend/serv state drain" | sudo socat stdio /etc/haproxy/haproxysock
Больше команд здесь ! Для установки socat в Ubuntu перейдите к этому ответу
Я проверяю это с версией haproxy 1.6.3 :)
источник
Если ваши серверы используют PHP для приложений, вы можете использовать Memcache для синхронизации сеансов между ними.
Также Couchbase-Server может делать репликацию memcache из коробки.
Конечно, использовать couchbase-сервер для репликации сессий несколько излишне :)
источник