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