haproxy: зберігайте існуючі сеанси під великим навантаженням, подайте "503" для нових приїздів


12

Намагаючись зробити те, що написано в заголовку: зберегти існуючі сеанси під великим навантаженням та подати 503-повідомленням для новоприбулих відвідувачів.

Проблема: вона працює, але сеанси тривають не більше 90 секунд.

Поточні результати мене цікавлять, чи не вистачає налаштування тайм-ауту.

Призначення

Я намагаюся отримати хапрокси для:

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

Таким чином, відвідувачів, які перебувають у заповненні багатоступеневої форми, не здивує помилка 503, а новим відвідувачам можна буде сказати "будь ласка, поверніться пізніше, тому що ми справді зайняті зараз".

Налаштування

Установка така:

            {visitors}
                ↓ 
            [haproxy]
                ↓ 
[rails app on unicorn served by nginx]   (right now just one 
                                            backend: 'backend-001')

сучасний підхід

Для досягнення вищесказаного я використовую конфігурацію нижче.

Цей прилад призначений для тестування з дуже низькою межею (10 підключень на передній частині (fe_conn gt 10)), щоб полегшити тестування.

Щоб поставити сервер під деяке навантаження, я використовую httperf наступним чином:

httperf --hog --server staging.machine.tld --uri / do_some_things --wsess = 500,10,30 - швидкість 2

global
    daemon
    maxconn 10000

defaults
    mode        http
    timeout connect 6s
    timeout client  60s
    timeout server  60s
    balance roundrobin
    option http-server-close

frontend http-in
    bind [PUBLIC_IP]:80

    default_backend backend-001

    acl too_many fe_conn gt 10
    use_backend b_too_many if too_many

backend backend-001
    fullconn 10
    appsession _session_id len 128 timeout 7200s

    cookie SERVERID insert maxidle 7200s
    server Server1 127.0.10.1:80 cookie backend-001 check

backend b_too_many
    errorfile 503 /var/www/50x.html

проблема

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

Якщо ви продовжуєте натискати, ви можете продовжувати свою сесію, навіть якщо 10 сеансів зайняті.

При спробі відкрити сторінку на сервері з іншим екземпляром браузера ви отримуєте помилку 503.

Отже, схоже, я майже там. Хтось має уявлення про те, що може бути причиною короткого часу сеансу?

І особливо, як я можу це виправити :)

(відредагувати: видалено 'вагу 1 maxconn 10' з рядка 'сервер', не актуально і може заплутатись) (редагуйте 2-е: виправлено '10 сеансів на передній частині 'до '10 з'єднань на передній частині')


Можливо, це нерозумне питання - що налаштування Keep_alive в nginx? Мабуть, це 75 років за замовчуванням - це може бути проблема?
Айдан Кейн

Відповіді:


4

На жаль, ви, здається, повністю заплутуєте зв’язки із сесіями на рівні додатків. Користувач, який відвідує сайт, може мати файл cookie, завдяки якому ви думаєте, що він є власником з'єднання, хоча це не обов'язково. Він може відкрити стільки з’єднань, скільки потрібно для отримання об’єктів та навігації по сторінках.

За 90 секунд, які ви спостережуєте, безумовно, очікується, що веб-переглядач залишається в режимі очікування для роботи в режимі очікування.

Можна досягти того, що ви хочете, але це трохи складніше, ніж це, тому що ви також повинні врахувати наявність наполегливого файлу cookie у запиті, щоб з’ясувати, новий відвідувач чи ні.

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


1
Дякую дякую! Це багато прояснилося. Тепер у мене це працює, (серед іншого) перевіряючи файли cookie за допомогою hdr_sub (Отже, "hdr_sub (cookie) SERVERID = backend-001"). Я опублікую працюючу конфігурацію, коли вона буде закінчена.
Apenootje
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.