Jak bezpieczne jest przechowywanie sesji w Redis?

95

Obecnie używam MySql do przechowywania moich sesji. Działa świetnie, ale jest trochę powolny.

Poproszono mnie o użycie Redis, ale zastanawiam się, czy to dobry pomysł, ponieważ słyszałem, że Redis opóźnia operacje zapisu. Trochę się boję, bo sesje muszą odbywać się w czasie rzeczywistym.

Czy ktoś miał takie problemy?

Trent
źródło
1
Ponieważ Redis twierdzi, że ma opcjonalną trwałość, powiedziałbym, że można go bezpiecznie używać, jeśli zdecydujesz się na trwałość na dysku twardym. Jednak w przypadku danych sesji - na pewno zapisałbym je w pamięci RAM (co oznacza, że ​​nie martwiłbym się o część trwałości całej próby). Najgorsze, co powinno się zdarzyć w przypadku utraty danych sesji, to wylogowanie użytkowników.
Uwaga:
1
tak, ale jest to część moich wymagań, użytkownicy nie powinni musieć się logować ponownie, przy okazji sposób, w jaki niektóre dane użytkowników są utrwalane podczas sesji, podczas gdy użytkownicy nie są zalogowani (użytkownicy-goście). Pójdą na pamięć RAM Redis, ale z włączonym rejestrowaniem i / lub tworzeniem kopii zapasowych. Jeśli straciliśmy kilka sesji, jest to dopuszczalne.
Trent
1
moje główne obawy dotyczą opóźnionego zapisu, co się stanie, jeśli użytkownik zaloguje się, a sesja zostanie zapisana z opóźnieniem, zostanie przekierowany, ale nie zalogowany
Trent
2
wyobraź sobie witrynę e-commerce, jeśli sesja zostanie utracona, bieżący koszyk również zostanie utracony, to nie jest straszne, ale może to być dziwne dla użytkowników. Użytkownicy-goście są identyfikowani tylko na podstawie sesji, więc nie ma możliwości odzyskania ich koszyka.
Boris Guéry
1
@ BorisGuéry - nie chodzi o to, że się nie zgadzam, ale jeśli trzeba zwiększyć wydajność - trzeba iść na kompromisy, gdy coś pójdzie nie tak. Tak, to byłoby dziwne, gdyby użytkownicy nagle się wylogowali, to na pewno - ale pytanie brzmi, jak często ma się to zdarzać? Jeśli raz lub dwa razy w roku wszystkie węzły Redis ulegają awarii, to nie widzę powodu, aby dziesiątkować wydajność kilka pojedynczych razy, gdy cały klaster jest niedostępny. Ale to tylko ja.
Uwaga:

Odpowiedzi:

150

Redis jest idealny do przechowywania sesji. Wszystkie operacje są wykonywane w pamięci, więc odczyty i zapisy będą szybkie.

Drugim aspektem jest trwałość stanu sesji. Redis zapewnia dużą elastyczność w utrzymywaniu stanu sesji na dysku twardym. Możesz przejść na stronę http://redis.io/topics/persistence, aby dowiedzieć się więcej, ale na wyższym poziomie są dostępne opcje -

  1. Jeśli nie możesz sobie pozwolić na utratę sesji, ustaw appendfsync alwaysw swoim pliku konfiguracyjnym. Dzięki temu Redis gwarantuje, że wszelkie operacje zapisu są zapisywane na dysku. Wadą jest to, że operacje zapisu będą wolniejsze.
  2. Jeśli nie przeszkadza Ci utrata około 1s danych, użyj appendfsync everysec. Zapewni to doskonałą wydajność z rozsądnymi gwarancjami danych
Sripathi Krishnan
źródło
14

Zasadniczo dostępne są dwa główne typy: asynchroniczne snapsnots i fsync(). Nazywają się odpowiednio RDB i AOF. Więcej o trybach trwałości na oficjalnej stronie .

Obsługa sygnału zdemonizowanego procesu synchronizuje się z dyskiem, na przykład po otrzymaniu SIGTERM, więc dane nadal tam będą po ponownym uruchomieniu. Myślę, że demon lub system operacyjny musi ulec awarii, zanim zobaczysz uszkodzenie integralności, nawet przy ustawieniach domyślnych (migawki RDB).

Ustawienie AOF używa pliku Append Only, który rejestruje polecenia odbierane przez serwer i odtwarza bazę danych od podstaw przy zimnym starcie z zapisanego pliku. Domyślną zasadą synchronizacji dysku jest opróżnianie co sekundę (IIRC), ale można ją ustawić na blokowanie i zapisywanie przy każdym poleceniu.

Korzystanie zarówno z migawek, jak i dziennika przyrostowego wydaje się oferować zarówno długoterminowe podejście `` nie przejmuj się, jeśli przegapię-kilka sekund-danych '' z bezpieczniejszym, ale kosztowniejszym dziennikiem przyrostowym. Redis obsługuje klastrowanie po wyjęciu z pudełka, więc wydaje się, że można wykonać replikację.

Sam używam domyślnego ustawienia RDB i zapisuję migawki na zdalnym serwerze FTP. Nie widziałem jeszcze awarii powodującej utratę danych. Najprawdopodobniej ostra awaria sprzętu lub przerwy w zasilaniu, ale jestem hostowany na VPS. Mała szansa na to :)

Morten Jensen
źródło
13

To pytanie dotyczy tak naprawdę sesji w czasie rzeczywistym i wydaje się, że powstało częściowo z powodu niezrozumienia wyrażenia „operacje zapisu z opóźnieniem”. Chociaż szczegóły zostały ostatecznie wyjawione w komentarzach, chciałem tylko, aby było to bardzo jasne. ..

Nie będziesz mieć problemów z implementacją sesji w czasie rzeczywistym.

Redis to magazyn wartości klucza w pamięci z opcjonalnym utrwalaniem na dysku. „Operacje opóźnionego zapisu” odnoszą się do zapisów na dysku , a nie ogólnie do bazy danych, która istnieje w pamięci. Jeśli USTAWISZ parę klucz / wartość, możesz ją ODZYSKAĆ ​​natychmiast (tj. W czasie rzeczywistym). Polityka, którą wybierzesz w odniesieniu do trwałości (o ile opóźnisz zapisy) określi górną granicę ilości danych, które mogą zostać utracone w wyniku awarii.

Jordan Dodson
źródło