Quanto è sicuro memorizzare le sessioni con Redis?


92

Attualmente sto utilizzando MySql per memorizzare le mie sessioni. Funziona benissimo, ma è un po 'lento.

Mi è stato chiesto di utilizzare Redis, ma mi chiedo se sia una buona idea perché ho sentito che Redis ritarda le operazioni di scrittura. Ho un po 'di paura perché le sessioni devono essere in tempo reale.

Qualcuno ha avuto problemi del genere?


1
Poiché Redis afferma che ha una durata opzionale, direi che è sicuro usarlo se si opta per la persistenza su HDD. Tuttavia, per i dati di sessione, li salverei sicuramente nella RAM (il che significa che non mi preoccuperei della durabilità parte dell'intero calvario). La cosa peggiore che dovrebbe accadere nel caso in cui si perdano i dati della sessione è che gli utenti si disconnettano.
NB

1
sì, ma questo fa parte del mio requisito, gli utenti non dovrebbero dover eseguire nuovamente il login, dal modo in cui alcuni dati degli utenti vengono conservati durante la sessione mentre gli utenti non sono connessi (utenti ospiti). Vanno per la RAM Redis ma con la registrazione e / o il backup abilitati. Se perdiamo alcune sessioni è accettabile.
Trent

1
le mie preoccupazioni principali riguardano la scrittura ritardata, cosa succede se un utente accede e la sessione viene scritta con ritardo, verrà reindirizzato ma non loggato
Trent

2
immagina un sito di e-commerce, se la sessione viene persa, anche il carrello corrente viene perso, non è terribile ma potrebbe essere strano per gli utenti. Gli utenti ospiti vengono identificati solo con una sessione, quindi non è possibile recuperare il carrello.
Boris Guéry

1
@ BorisGuéry - non è che non sia d'accordo, ma se si deve aumentare le prestazioni - è necessario trovare dei compromessi quando qualcosa va storto. Sì, sarà strano che gli utenti si disconnettano improvvisamente, questo è certo, ma la domanda è quanto spesso dovrebbe accadere? Se è una o due volte all'anno che tutti i nodi Redis si interrompono, non vedo alcun motivo per decimare le prestazioni per alcune volte isolate quando l'intero cluster non è disponibile. Ma sono solo io.
NB

Risposte:


147

Redis è perfetto per memorizzare le sessioni. Tutte le operazioni vengono eseguite in memoria, quindi le operazioni di lettura e scrittura saranno veloci.

Il secondo aspetto è la persistenza dello stato della sessione. Redis ti offre molta flessibilità nel modo in cui desideri mantenere lo stato della sessione sul tuo disco rigido. Puoi andare su http://redis.io/topics/persistence per saperne di più, ma ad alto livello, ecco le tue opzioni:

  1. Se non puoi permetterti di perdere nessuna sessione, impostalo appendfsync alwaysnel file di configurazione. Con ciò, Redis garantisce che qualsiasi operazione di scrittura venga salvata sul disco. Lo svantaggio è che le operazioni di scrittura saranno più lente.
  2. Se ti va di perdere circa 1s di dati, usa appendfsync everysec. Ciò darà ottime prestazioni con ragionevoli garanzie sui dati

14

Fondamentalmente sono disponibili due tipi principali: snapshot asincroni e fsync(). Si chiamano rispettivamente RDB e AOF. Maggiori informazioni sulle modalità di persistenza sulla pagina ufficiale .

La gestione del segnale del processo demonizzato si sincronizza con il disco, ad esempio, quando riceve un SIGTERM, quindi i dati saranno ancora lì dopo un riavvio. Penso che il demone o il sistema operativo debba bloccarsi prima di vedere un danneggiamento dell'integrità, anche con le impostazioni predefinite (istantanee RDB).

L'impostazione AOF utilizza un file di solo aggiunta che registra i comandi ricevuti dal server e ricrea il database da zero all'avvio a freddo, dal file salvato. Il criterio di sincronizzazione del disco predefinito prevede lo svuotamento una volta al secondo (IIRC) ma può essere impostato per bloccare e scrivere su ogni comando.

L'uso sia delle istantanee che del registro incrementale sembra offrire sia un approccio a lungo termine da non preoccuparsi se mi perdo qualche secondo di dati , sia un registro incrementale più sicuro, ma costoso. Redis supporta il clustering out of the box, quindi sembra che anche la replica possa essere eseguita.

Sto utilizzando personalmente l'impostazione RDB predefinita e salvo le istantanee su FTP remoto. Non ho ancora visto un errore che abbia causato una perdita di dati. Molto probabilmente un guasto hardware acuto o interruzioni di corrente sarebbe, ma sono ospitato su un VPS. Scarse possibilità che ciò accada :)


12

Questa domanda riguarda davvero le sessioni in tempo reale e sembra essere sorta in parte a causa di un malinteso della frase `` operazioni di scrittura ritardate '' Mentre i dettagli alla fine sono stati presi in giro nei commenti, volevo solo renderlo super-chiaro. ..

Non avrai problemi a implementare sessioni in tempo reale.

Redis è un in-memory memoria dei valori-chiave con la persistenza opzionale su disco. "Operazioni di scrittura ritardata" si riferisce alle scritture su disco , non al database in generale, che esiste in memoria. Se IMPOSTATE una coppia chiave / valore, potete OTTENERLA immediatamente (cioè in tempo reale). La politica selezionata per quanto riguarda la persistenza (quanto si ritardano le scritture) determinerà il limite superiore per la quantità di dati che potrebbero essere persi in un arresto anomalo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.