Назад | Перейти на главную страницу

haproxy: как подготовить обслуживание сервера, не прерывая сеансы приложения?

Проблема

Я использую haproxy для балансировки нагрузки на веб-серверы. Я использую постоянство сеанса с дополнительными файлами cookie, поскольку некоторые приложения используют файлы сеанса, и они не синхронизируются между серверами.

Я хочу отключить сервер для обслуживания, но без прерывания сеансов. Поэтому я хотел бы разрешить существующим клиентам продолжать сеанс работы с приложением, но не принимать новых клиентов.

поведение haproxy

Как вы думаете, это возможно с помощью некоторой конфигурации 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]