Насколько безопасно хранить сеансы в Redis?

94

В настоящее время я использую MySql для хранения своих сеансов. Он отлично работает, но немного медленный.

Меня попросили использовать Redis, но мне интересно, хорошая ли это идея, потому что я слышал, что Redis задерживает операции записи. Я немного боюсь, потому что сеансы должны быть в режиме реального времени.

Кто-нибудь сталкивался с такими проблемами?

Трент
источник
1
Поскольку Redis говорит, что он имеет дополнительную надежность, я бы сказал, что его можно безопасно использовать, если вы выберете постоянство на жестком диске. Однако, что касается данных сеанса, я бы определенно сохранил их в ОЗУ (то есть я не стал бы беспокоиться о долговечности, которая является частью всего испытания). Худшее, что должно произойти в случае потери данных сеанса, - это выйти из системы.
NB
1
да, но это часть моего требования, пользователям не нужно снова входить в систему, кстати, некоторые данные пользователей сохраняются в течение сеанса, пока пользователи не вошли в систему (гостевые пользователи). Они будут использовать Redis RAM, но с включенным ведением журнала и / или резервным копированием. Если мы проиграем несколько сессий, это приемлемо.
Трент
1
Меня больше всего беспокоит отложенная запись: что произойдет, если пользователь войдет в систему и сеанс будет записан с задержкой, он будет перенаправлен, но не войдет в систему,
Трент,
2
представьте себе сайт электронной коммерции, если сеанс потерян, текущая корзина тоже потеряна, это не страшно, но может быть странным для пользователей. Гости-пользователи идентифицируются только с помощью сеанса, поэтому восстановить их корзину невозможно.
Борис Гери
1
@ BorisGuéry - это не значит, что я не согласен, но если нужно повысить производительность, нужно искать компромиссы, когда что-то идет не так. Да, пользователям будет странно внезапно выйти из системы, это точно, но вопрос в том, как часто это должно происходить? Если один или два раза в год все узлы Redis выходят из строя, то я не вижу причин снижать производительность в несколько отдельных случаев, когда весь кластер недоступен. Но это только я.
NB

Ответы:

149

Redis идеально подходит для хранения сессий. Все операции выполняются в памяти, поэтому чтение и запись будут быстрыми.

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

  1. Если вы не можете позволить себе потерять сеансы, задайте их appendfsync alwaysв файле конфигурации. При этом Redis гарантирует, что любые операции записи будут сохранены на диск. Недостатком является то, что операции записи будут медленнее.
  2. Если вы не против потерять около 1 секунды данных, используйте appendfsync everysec. Это даст отличную производительность с разумными гарантиями данных.
Шрипати Кришнан
источник
14

В основном доступны два основных типа: async snapsnots и fsync(). Они называются RDB и AOF соответственно. Подробнее о режимах сохранения на официальной странице .

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

Параметр AOF использует файл только для добавления, который регистрирует команды, получаемые сервером, и воссоздает базу данных с нуля при холодном запуске из сохраненного файла. Политика синхронизации диска по умолчанию - сбросить каждую секунду (IIRC), но ее можно настроить на блокировку и запись для каждой команды.

Использование как моментальных снимков, так и инкрементного журнала, кажется, предлагает как долгосрочный подход « не возражаю, если я пропущу несколько секунд данных», так и более безопасный, но дорогостоящий добавочный журнал. Redis поддерживает кластеризацию из коробки, так что репликация, похоже, тоже возможна.

Я сам использую настройку RDB по умолчанию и сохраняю снимки на удаленном FTP. Я еще не видел сбоя, который привел к потере данных. Скорее всего, произойдет резкий отказ оборудования или отключение электроэнергии, но я размещен на VPS. Небольшой шанс, что это произойдет :)

Мортен Йенсен
источник
12

Этот вопрос действительно касается сеансов в реальном времени и, кажется, частично возник из-за неправильного понимания фразы «отложенные операции записи». Хотя подробности в конечном итоге были раскрыты в комментариях, я просто хотел сделать его супер-пупер ясным. ..

У вас не возникнет проблем с реализацией сессий в реальном времени.

Redis - это хранилище ключей и значений в памяти с возможностью сохранения на диске. «Операции отложенной записи» относятся к записи на диск , а не в базу данных в целом, которая существует в памяти. Если вы установите пару ключ / значение, вы можете ПОЛУЧИТЬ ее немедленно (т.е. в реальном времени). Политика, которую вы выбираете в отношении постоянства (насколько вы откладываете запись), будет определять верхнюю границу того, сколько данных может быть потеряно в случае сбоя.

Джордан Додсон
источник