Wie sicher ist es, Sitzungen mit Redis zu speichern?

90

Ich verwende derzeit MySQL, um meine Sitzungen zu speichern. Es funktioniert gut, ist aber etwas langsam.

Ich wurde gebeten, Redis zu verwenden, aber ich frage mich, ob dies eine gute Idee ist, da ich gehört habe, dass Redis Schreibvorgänge verzögert. Ich habe ein bisschen Angst, weil Sitzungen in Echtzeit stattfinden müssen.

Hat jemand solche Probleme erlebt?

Trent
quelle
1
Da Redis sagt, dass es eine optionale Haltbarkeit hat, würde ich sagen, dass es sicher ist, es zu verwenden, wenn Sie sich für die Persistenz auf der Festplatte entscheiden. Für Sitzungsdaten würde ich sie jedoch definitiv im RAM speichern (was bedeutet, dass ich mir während des gesamten Prozesses keine Sorgen um die Haltbarkeit machen würde). Das Schlimmste, was passieren sollte, wenn Sie Sitzungsdaten verlieren, ist das Abmelden Ihrer Benutzer.
NB
1
Ja, aber dies ist Teil meiner Anforderung. Benutzer sollten sich nicht erneut anmelden müssen, da einige Benutzerdaten während der Sitzung beibehalten werden, während Benutzer nicht angemeldet sind (Gastbenutzer). Sie werden sich für Redis RAM entscheiden, jedoch mit aktivierter Protokollierung und / oder Sicherung. Wenn wir einige Sitzungen verloren haben, ist das akzeptabel.
Trent
1
Mein Hauptanliegen ist das verzögerte Schreiben. Was passiert, wenn sich ein Benutzer anmeldet und die Sitzung mit Verzögerung geschrieben wird? Er wird umgeleitet, aber nicht angemeldet
Trent,
2
Stellen Sie sich eine E-Commerce-Website vor. Wenn die Sitzung verloren geht, geht auch der aktuelle Warenkorb verloren. Das ist nicht schrecklich, aber für Benutzer kann das seltsam sein. Benutzer von Gästen werden nur mit einer Sitzung identifiziert, sodass keine Möglichkeit besteht, ihren Einkaufswagen wiederherzustellen.
Boris Guéry
1
@ BorisGuéry - ich bin nicht anderer Meinung, aber wenn man die Leistung steigern muss, müssen Kompromisse geschlossen werden, wenn etwas schief geht. Ja, es wird seltsam sein, wenn Benutzer plötzlich abgemeldet werden, das ist sicher - aber die Frage ist, wie oft dies erwartet wird. Wenn ein- oder zweimal im Jahr alle Redis-Knoten ausfallen, sehe ich keinen Grund, die Leistung für einige isolierte Zeiten zu dezimieren, wenn der gesamte Cluster nicht verfügbar ist. Aber das bin nur ich.
NB

Antworten:

146

Redis ist perfekt zum Speichern von Sitzungen. Alle Operationen werden im Speicher ausgeführt, sodass das Lesen und Schreiben schnell erfolgt.

Der zweite Aspekt ist die Persistenz des Sitzungsstatus. Redis bietet Ihnen viel Flexibilität bei der Beibehaltung des Sitzungsstatus auf Ihrer Festplatte. Sie können http://redis.io/topics/persistence besuchen , um mehr zu erfahren, aber auf hohem Niveau sind hier Ihre Optionen:

  1. Wenn Sie es sich nicht leisten können, Sitzungen zu verlieren, legen Sie dies appendfsync alwaysin Ihrer Konfigurationsdatei fest. Damit garantiert Redis, dass alle Schreibvorgänge auf der Festplatte gespeichert werden. Der Nachteil ist, dass Schreibvorgänge langsamer sind.
  2. Wenn Sie mit dem Verlust von Daten im Wert von etwa 1 s einverstanden sind, verwenden Sie appendfsync everysec. Dies bietet eine hervorragende Leistung bei angemessenen Datengarantien
Sripathi Krishnan
quelle
14

Grundsätzlich stehen zwei Haupttypen zur Verfügung: asynchrone Snapsnots und fsync(). Sie heißen RDB bzw. AOF. Weitere Informationen zu Persistenzmodi finden Sie auf der offiziellen Seite .

Die Signalbehandlung des daemonisierten Prozesses wird beispielsweise beim Empfang eines SIGTERM mit der Festplatte synchronisiert, sodass die Daten nach einem Neustart weiterhin vorhanden sind. Ich denke, der Dämon oder das Betriebssystem muss abstürzen, bevor eine Integritätsbeschädigung auftritt, selbst mit den Standardeinstellungen (RDB-Snapshots).

Die AOF-Einstellung verwendet eine Nur-Anhängen-Datei, die die vom Server empfangenen Befehle protokolliert und die Datenbank beim Kaltstart von Grund auf aus der gespeicherten Datei neu erstellt. Die Standardrichtlinie für die Festplatten-Synchronisierung lautet "Einmal pro Sekunde leeren" (IIRC), kann jedoch so eingestellt werden, dass jeder Befehl gesperrt und geschrieben wird.

Die Verwendung sowohl der Snapshots als auch des inkrementellen Protokolls scheint einen langfristigen Ansatz zu bieten, bei dem ich ein paar Sekunden Daten verpasse, mit einem sichereren, aber kostspieligeren inkrementellen Protokoll. Redis unterstützt das sofortige Clustering, sodass die Replikation anscheinend auch durchgeführt werden kann.

Ich verwende selbst die Standardeinstellung für RDB und speichere die Snapshots auf Remote-FTP. Ich habe noch keinen Fehler gesehen, der einen Datenverlust verursacht hat. Akuter Hardwarefehler oder Stromausfall wären höchstwahrscheinlich, aber ich bin auf einem VPS gehostet. Geringe Chance, dass das passiert :)

Morten Jensen
quelle
11

Bei dieser Frage handelt es sich wirklich um Echtzeitsitzungen, und sie scheint teilweise auf ein Missverständnis des Ausdrucks "verzögerte Schreibvorgänge" zurückzuführen zu sein. Während die Details in den Kommentaren schließlich herausgearbeitet wurden, wollte ich es nur super-super klar machen. ..

Sie haben keine Probleme bei der Implementierung von Echtzeitsitzungen.

Redis ist ein speicherinterner Schlüsselwertspeicher mit optionaler Persistenz auf der Festplatte. 'Verzögerte Schreibvorgänge' bezieht sich auf Schreibvorgänge auf die Festplatte , nicht auf die Datenbank im Allgemeinen, die im Speicher vorhanden ist. Wenn Sie ein Schlüssel / Wert-Paar einstellen, können Sie es sofort abrufen (dh in Echtzeit). Die Richtlinie, die Sie in Bezug auf die Persistenz auswählen (wie viel Sie die Schreibvorgänge verzögern), bestimmt die Obergrenze dafür, wie viele Daten bei einem Absturz verloren gehen könnten.

Jordan Dodson
quelle