Як досягається клейкість сеансу на кількох веб-серверах?


23

Скільки веб-серверів має StackOverflow / ServerFault?

Якщо відповідь «більше, ніж один», то чи досягається вона дотримання сеансу під час опитування DNS?


Насправді, але якщо це було б по-іншому, це може поставити цікаве запитання.

Ви повинні перефразувати питання. Змініть заголовок на "Як досягається клейкість сеансу на кількох веб-серверах?" чи щось подібне ...
Вільям Брендель,

ви могли б зробити мені послугу, щоб показати мені правильну фразу?

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

Відповіді:


42

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

Вибраний метод буде залежати від стилю збалансованості завантаження, а також від доступності / потужності резервного зберігання:

Інформація про сеанс, збережена лише у файлах cookie : Інформація про сеанс (а не лише ідентифікатор сеансу) зберігається у файлі cookie користувача. Наприклад, cookie користувача може містити вміст їх кошика для покупок. Щоб запобігти підробленню користувачами даних сеансу, разом із файлом cookie може бути наданий HMAC. Цей метод, мабуть, найменш підходить для більшості застосувань:

  • Не потрібно зберігати резервне копіювання
  • Користувачеві не потрібно натискати на одну і ту ж машину щоразу, тож можна використовувати балансування навантаження DNS
  • Немає затримок, пов’язаних із отриманням інформації про сеанс з машини бази даних (як це передбачено HTTP-запитом). Корисно, якщо ваш сайт збалансований завантаженням машин на різних континентах.
  • Кількість даних, які можуть зберігатися в сеансі, обмежена (обмеженням розміру файлу cookie 4K)
  • Якщо шифрувач не може бачити вміст свого сеансу, потрібно використовувати шифрування
  • HMAC (або подібне) потрібно використовувати для запобігання підробці користувачами даних сеансу
  • Оскільки дані сеансу не зберігаються на стороні сервера, розробникам складніше проводити налагодження

Балансир завантаження завжди спрямовує користувача на одну і ту ж машину : Багато балансирів завантаження можуть встановлювати власне печиво сеансу, вказуючи, з якої резервної машини користувач надсилає запити, і надалі спрямовує їх на цю машину. Оскільки користувач завжди спрямований на одну машину, обмін сеансами між декількома машинами не потрібно. Це може бути добре в деяких ситуаціях:

  • Обробку сеансу існуючої програми, можливо, не потрібно буде змінювати, щоб зрозуміти кілька машин
  • Для зберігання сеансів не потрібна спільна система баз даних (або подібних), можливо, підвищивши надійність, але ціною складності
  • Запуск машини для запуску зніме з нього всі сеанси роботи користувача, розпочаті на ньому.
  • Вивести машини з експлуатації складніше. Користувачам, які мають сеанси на машині, яку потрібно зняти для обслуговування, слід дозволити виконувати свої завдання до вимкнення машини. Щоб підтримати це, веб-балансири навантажень можуть мати функцію "зливання" запитів на певну машину резервного копіювання.

Спільна база даних або сховище ключів / цінностей : Інформація про сеанс зберігається в базі даних резервного копіювання, до якої всі веб-сервери мають доступ до запитів та оновлень. Браузер користувача зберігає файл cookie, що містить ідентифікатор (наприклад, ідентифікатор сесії), вказуючи на інформацію про сеанс. Це, мабуть, найчистіший метод із трьох:

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

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


2
+1 Досить вичерпна відповідь і рятує мене від її написання. :) Що стосується зберігання db, реляційна база даних, мабуть, не те. Щось на кшталт одного із стійких з’єднаних виделок краще. memcachedb може бути підходящим. Ви також пропустили реплікацію інформації про сеанси між серверами. Це не найкращий метод, але такі речі, як томат, роблять це, тому варто документувати.
Девід Пашлі

Який підхід використовується Google, Twitter або Facebook?
Dannyboy

1
Не впевнені в Google, Twitter або Facebook, але Redis - це чудово підходить для магазину сесій. По суті, "стійкий спогад" Девід Пашлі рекомендував у 2009 році, коли Редіс був ембріональним.
Бен Р

4

Якщо у вас запитання полягає в тому, як підтримувати сеанси на декількох зовнішніх веб-серверах, то відповідь зазвичай полягає у використанні централізованої бази даних. Замість того, щоб покладатися на екземпляри веб-сервера для відстеження файлів сеансу в локальних файлових системах, ви записуєте ідентифікатори сеансів і дані сесії в центральну БД, і всі веб-сервери замість цього отримуватимуть дані.


+1 для згадування довідкової бази даних. Просто трохи розширити / спростити цю ідею. Якщо ви встановите файл cookie на ПК користувача з чимось унікальним, таким як глобальний ідентифікатор користувача, ви можете зберігати цей GUID у базі даних. Не має значення, до якого сервера підключається клієнт, якщо у них є GUID / cookie, ви зможете знайти їх проти бази даних і відповідно відстежувати сеанс.
KPWINC

2
Зберігання сеансів у реляційній базі даних - це завжди погана ідея. Не слід використовувати бази даних для зберігання перехідних даних.
Девід Пашлі

2

Використання незграбного виглядає як хороше рішення, не так, як згадував @David Pashley

Це означає, що віддалений запам’ятовуваний екземпляр має спільний доступ до всіх серверів та використовує розширення PECL memcache, яке забезпечує власний обробник сеансу.

Потрібно лише змінити два параметри в конфігурації php!

Ось хороший підручник http://www.dotdeb.org/2008/08/25/storing-your-php-sesions-using-memcached/


Але що є декілька центрів обробки даних?
Dannyboy


0

Ви можете встановити печиво.

Ви можете обчислити хеш віддаленого IP (найпростіший, непарний номер віддалених хостів переходить на сервер A, навіть нумеровані хости переходять на сервер B).

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

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

Я не впевнений, що ви маєте на увазі під опитуванням DNS


0

а) Ви можете зберігати інформацію про сеанс у файлі cookie користувача. Дивіться загартовані файли cookie, які не зберігають даних на стороні сервера, але зберігають стан сеансу http://www.cl.cam.ac.uk/~sjm217/papers/protocols08cookies.pdf . b) Ви можете змінити резервне зберігання сеансу на базу даних або запам’ятовувати. Для усунення єдиної точки відмови можна встановити реплікацію бази даних або кілька вузлів, що запам'ятовуються. Зауважте, що запам’ятовується рекомендується в таких налаштуваннях, коли втрата стану користувача під час сеансу не є великою помилкою і не робить його дуже нещасним. У випадках, коли збереження стану життєво важливе, використовуйте бази даних. І PHP, і Django, і Rails дозволяє розробнику писати користувацький сеанс.

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