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

13

Проблема

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

Кристоф Древет-Дроге
источник
Ваш сервер работает в режиме HTTP или TCP?
австралиец
1
@austinian; Скорее всего, в режиме http видно, как он говорит о балансировке и постоянстве на основе файлов cookie (режим TCP не предлагает таких функций).
Грегл
@Christophe, вы действительно пробовали конфигурацию, описанную в разделе «поведение haproxy», потому что она должна работать.
Грегл
@ Грегл, верно, я тоже так думаю. Если он использует режим HTTP и просто переводит сервер в режим обслуживания, он прекращает принимать новые сеансы, но сохраняет действительные сеансы до истечения срока их действия. Вы все еще можете иметь куки и т. Д. В режиме TCP, но тогда это ничего не будет значить для HAProxy.
австралиец
@Christophe, вы пытаетесь использовать «более умный способ», чтобы сократить время обслуживания, или просто ищете способ, чтобы сессия закончилась изящно, пока вы ждете выполнения обслуживания?
австралиец

Ответы:

6

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

austinian
источник
3
Если вы установите его в садовод, он собирается прекратить передачу любого трафика к нему, как описано здесь . Скорее он хотел бы перевести его в режим «Слив» и использовать « stick-tableс истечением» для обеспечения устойчивости.
Грегл
@GregL, упс, исправляю сейчас
австралиец
Спасибо за ваш ответ, австралиец и @GredL. Я попробую это. Тяжелая часть будет с палкой, я думаю. Мне нужно будет найти способ сохранить каждого клиента с установленным файлом cookie для сервера режима стока в этой таблице.
Кристоф Древет-Дрогует
Что ж, похоже, что в моем случае достаточно режима утечки, сеансы, в которых уже есть набор файлов cookie, все еще используют очищенный сервер, а новые сеансы направляются на другие серверы.
Кристоф Древет-Дрогует
1
Как вы меняете режимы в веб-интерфейсе? Это выглядит просто для информации.
kagronick
9

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

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

Больше команд здесь ! Для установки socat в Ubuntu перейдите к этому ответу

Я проверяю это с версией haproxy 1.6.3 :)

Джонатан Аларкон
источник
1

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

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

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

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

cha0s
источник
Хотя это было бы лучше, я думаю, что нужны изменения кода. Поэтому я буду использовать Austinian и GregL для наших текущих приложений, которые не синхронизируют сессии.
Кристоф Древет-Дрогует
Если в вашем коде не установлен пользовательский обработчик сеансов, вам не нужно менять код для PHP, чтобы использовать memcache для сеансов. Все настроено в php.ini, а не в коде.
Cha0s
Хорошо, Cha0s, я посмотрю на это.
Кристоф Древет-Дрогует