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

Проблема

Я использую 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 "сессия". Это правильно?

13
задан 16 July 2015 в 10:28
4 ответа

Переведите сервер в режим утечки с помощью веб-интерфейса управления. Это обеспечивает именно ту функциональность, которую вы ищете.

6
ответ дан 2 December 2019 в 21:26

Другие способы

синхронизации файлов сеанса между серверами (требуется способ синхронизации файлов между несколькими серверами или общая единственная точка монтирования)

Если ваши внутренние серверы используют PHP для приложения ( s) вы можете использовать Memcache для синхронизации сеансов между ними.

Также Couchbase-Server может выполнять репликацию кэша памяти из коробки.
Конечно, использование couchbase-server только для репликации сессий - излишество :)

1
ответ дан 2 December 2019 в 21:26

Если вы используете socat для связи с вашими конфигурациями гапрокси, вы можете поставить сервер в состояние утечки следующим образом:

echo "set server backend/serv state drain" | sudo socat stdio /etc/haproxy/haproxysock

More commands here! Для установки соката в Ubuntu перейдите к этому ответу

Я проверяю это с помощью гапрокси 1.6.3 версии :)

.
9
ответ дан 2 December 2019 в 21:26

Для будущих читателей, которые хотят слить серверную часть из контейнера 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]

2
ответ дан 23 June 2020 в 11:14

Теги

Похожие вопросы