haproxy: як підготувати сервісне обслуговування без натискання сесій додатків?


13

Питання

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

Я хочу відключити сервер для обслуговування, але не порушуючи сеанси. Тому я хотів би дозволити існуючим клієнтам продовжувати свою сесію заявок, але не приймати нових клієнтів.

поведінка хапрокси

  • Я встановив сервер на "перехід до обслуговування"
  • якщо клієнт має набір файлів cookie, використовуйте сервер, навіть якщо він позначений як "йде в технічне обслуговування"
  • якщо приходить новий клієнт (без cookie), він спрямовується на інший сервер
  • після того, як всі клієнти закінчать свої сеанси застосування, більше жоден клієнт не встановить файли cookie на цей конкретний сервер, і я б радив закрити його без зривів користувача.

Як ви вважаєте, це досяжно за допомогою певної конфігурації гапрокси? Або є розумний спосіб це зробити?

Інші способи

Невичерпний перелік інших способів досягнення цієї потреби:

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

Детальніше

Я використовую такий тип конфігурації:

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 не пропонує таких функцій).
GregL

@Christophe, чи ви насправді випробували конфігурацію, описану в розділі "поведінка хапрокси", тому що вона повинна працювати.
GregL

@GregL, правда, це теж я думаю. Якщо він використовує режим HTTP і просто встановить сервер в режим обслуговування, він припинить приймати нові сеанси, але збереже дійсні сесії, поки вони не закінчаться. Ви все ще можете мати файли cookie тощо в режимі TCP, але тоді це не означатиме нічого для HAProxy.
австрійський

@Christophe, ви намагаєтесь скористатися "розумнішим способом", щоб скоротити час обслуговування або просто шукаєте спосіб вичерпно закінчити сеанси, поки ви чекаєте проведення технічного обслуговування?
австрійський

Відповіді:


6

Переведіть сервер у режим зливу за допомогою інтерфейсу веб-управління. Це забезпечує точний функціонал, який ви шукаєте.


3
Якщо встановити його на Maint, він перестане надсилати на нього будь-який трафік, як зазначено тут . Швидше, він хотів би перевести його в режим зливу, а використовувати stick-tableз закінченням терміну, щоб забезпечити стійкість.
GregL

@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-сервера лише для реплікації сеансів :)


Хоча це було б кращим способом, він потребує змін коду, я думаю. Тож я буду використовувати австрійські та GregL відповіді на наші поточні програми, які не синхронізують сеанси.
Крістоф Древет-Дрогует

Якщо у вашому коді не встановлено спеціальний обробник сеансу, вам не потрібно змінювати жоден код для PHP, щоб використовувати memcache для сеансів. Це все налаштовано в php.ini, а не в коді.
Cha0s

Гаразд, Cha0s, я подивлюся на це.
Крістоф Древет-Дрогует
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.