Наскільки безпечно зберігати сеанси з Redis?


92

Зараз я використовую MySql для зберігання своїх сеансів. Це чудово працює, але трохи повільно.

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

Хтось стикався з такими проблемами?


1
Оскільки Redis стверджує, що він має необов’язкову довговічність, то я б сказав, що безпечно використовувати його, якщо ви оберете стійкість на жорсткому диску. Однак для даних сеансів - я б точно їх зберегла в оперативній пам’яті (це означає, що я б не хвилювалася про довговічність частини всього випробування). Найгірше, що повинно статися у випадку втрати даних сеансу, - це вихід користувачів із системи.
NB

1
так, але це частина моєї вимоги, користувачам не слід входити назад, до речі, деякі дані користувачів зберігаються протягом сеансу, поки користувачі не входять (гостьові користувачі). Вони підуть на оперативну пам’ять Redis, але з увімкненими журналами та / або резервними копіями. Якщо ми програли кілька сеансів, це прийнятно.
Трент,

1
моє головне занепокоєння пов’язано із затримкою запису, що станеться, якщо користувач увійде в систему і сеанс буде написаний із затримкою, він буде перенаправлений, але не ввійде в систему
Трент

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

1
@ BorisGuéry - це не те, що я не погоджуюсь, але якщо потрібно підвищувати ефективність - компроміси повинні бути встановлені, коли щось піде не так. Так, дивно буде, коли користувачі раптом вийдуть з системи, це точно - але питання в тому, як часто це очікується? Якщо один або два рази на рік усі вузли Redis перестають працювати, то я не бачу причин знижувати продуктивність протягом кількох ізольованих разів, коли весь кластер недоступний. Але це лише я.
NB

Відповіді:


147

Redis ідеально підходить для зберігання сеансів. Всі операції виконуються в пам'яті, тому читання та запис буде швидким.

Другий аспект - це збереження стану сесії. Redis надає вам велику гнучкість у тому, як ви хочете зберегти стан сеансу на жорсткому диску. Ви можете переглянути http://redis.io/topics/persistence, щоб дізнатись більше, але на високому рівні ось ваші варіанти -

  1. Якщо ви не можете дозволити собі втратити будь-які сеанси, встановіть appendfsync alwaysу своєму файлі конфігурації. Завдяки цьому Redis гарантує збереження будь-яких операцій запису на диск. Недоліком є ​​те, що операції запису будуть повільнішими.
  2. Якщо ви в порядку з втратою даних на 1 секунду, використовуйте appendfsync everysec. Це забезпечить чудову продуктивність із розумними гарантіями даних

14

В основному доступні два основних типи: асинхронні знімки та fsync(). Вони називаються RDB та AOF відповідно. Детальніше про режими стійкості на офіційній сторінці .

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

Параметр AOF використовує файл лише додавання, який реєструє команди, які отримує сервер, і відтворює БД з нуля при холодному запуску із збереженого файлу. Політикою синхронізації диска за замовчуванням є змивання раз на секунду (IIRC), але її можна налаштувати на блокування та запис на кожній команді.

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

Я використовую налаштування RDB за замовчуванням і зберігаю знімки на віддаленому FTP. Я ще не бачив помилки, яка спричинила втрату даних. Гостра відмова обладнання або перебої з електроживленням, швидше за все, були б, але я розміщений на VPS. Малий шанс, що це станеться :)


12

Це питання насправді стосується сеансів у реальному часі, і, схоже, це виникло частково через нерозуміння фрази «відкладені операції запису». Хоча деталі врешті-решт дражнились у коментарях, я просто хотів зробити це надмірно зрозумілим. ..

У вас не буде проблем із впровадженням сеансів у реальному часі.

Redis - це пам’ять ключ-значення в пам’яті з необов’язковим збереженням на диску. "Операції із затримкою запису" стосуються записів на диск , а не до бази даних загалом, яка існує в пам'яті. Якщо ВСТАНОВИТИ пару ключ / значення, ви можете ОТРИМАТИ її негайно (тобто в реальному часі). Політика, яку ви обираєте щодо стійкості (на скільки ви затримуєте запис), визначатиме верхню межу кількості даних, яка може бути втрачена в результаті аварійного завершення роботи.

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