2012-06-01 11 views
5

In meinem aktuellen Projekt habe ich PostgreSQL als meine Master-DB, und Redis als eine Art Slave, zB wenn ein Benutzer einen anderen als Freund hinzufügt, zuerst wird die Beziehung in PostgreSQL gespeichert und dann eine Freundesliste in Redis bleibe auf dem Laufenden. Wenn die Freundesliste eines Benutzers angefordert wird, wird sie aus Redis anstelle von PostgreSQL herausgezogen.Sollte ich Redis für Datenintegrität vertrauen?

Die Frage ist: wenn ich die Freundesliste in Redis aktualisiere, sollte ich eine neue Kopie von PostgreSQL bekommen, und die alte Liste in Redis durch die neue ersetzen oder sollte ich die alte Liste behalten und einfach die Benutzerkennung in SADD Die Liste? Letzteres ist natürlich am besten für die Leistung, aber ersteres macht die Datenintegrität besser? Und wenn etwas wie Sellerie verwendet wird, ist die zweite Methode das Risiko wert?

Antwort

4

Das hat nichts mit Redis zu tun. Wenn Sie in zwei Datenbanken schreiben, können viele Dinge schiefgehen, selbst wenn beide einzeln die Datenintegrität garantieren.

Ersetzen Sie Redis in der Frage durch MySQL und fragen Sie sich - wird die Datenintegrität beeinträchtigt?

Sie haben möglicherweise Postgres geschrieben und dann kann Ihr Prozess sterben, ohne an MySQL zu schreiben. Oder vielleicht gibt es einen Netzwerkausfall. Oder vielleicht ist MySQL nicht verfügbar. In all diesen Fällen würden sich Postgres und MySQL voneinander unterscheiden.

Es spielt keine Rolle, ob Sie den gesamten Datensatz ersetzen oder einfach eine Zeile hinzufügen. Beides kann zu Datenkorruption führen.

Wenn Sie mit der Datenintegrität zu tun haben, bewahren Sie die Daten in einem einzigen autoritativen System auf. Andernfalls benötigen Sie eine two phase commit protocol

+1

+1 - stimme zu ... und mache weiter darauf aufmerksam/bemerke, dass die Entscheidung, in diesem Szenario den Slave anstelle des Masters zu verwenden, seltsam erscheint. Wenn die Skalierbarkeit die Konsistenzanforderungen in diesem Szenario übertrifft, warum sollte redis nicht als autorisierende Quelle verwendet werden (vertikal geschaffte Schlüsselbereiche einrichten, wenn ein einzelner Server die Last nicht verarbeiten kann) und dann nach cassandra oder einem anderen horizontal skalierbaren Speicher replizieren? – codemonkey

+0

@Sripathi, ich bin mir des Problems bewusst, das Sie erwähnten, egal mit welcher Methode ich wähle, Datenkorruption wird mit derselben Rate auftreten, aber ist dies der einzige Ort, an dem Korruption auftritt? Da Redis nicht ACID-konform ist, würde ich gerne wissen, wie oft ich seine Daten vom Master rekonstruieren sollte, oder ist es praktisch, es als ACID zu behandeln (in diesem speziellen Szenario natürlich)? – Jiaji

+0

@codemonkey Tatsächlich brauche ich Konsistenz, also wähle ich Postgres als Master, da Redis-Daten daraus rekonstruiert werden können, theoretisch können die an die Benutzer gesendeten Daten "fast" konsistent gemacht werden. – Jiaji

1

Sie sollten bewerten, wie wichtig Konsistenz für Ihre Anwendung ist und Dinge von dort nehmen. Es klingt nicht wie jemand weint, wenn Sie eine Verpflichtung verlieren. Sie könnten einen Hintergrundprozess haben, der Daten aus PostgreSQL liest und sie zurück in Redis schiebt, um eventuelle Inkonsistenzen zu beseitigen. Alternativ können Sie PostgreSQL-Slave-Slave-Instanzen lesen, die vom Schreib-Master repliziert werden. Dadurch erhalten Sie eine bessere Lesekalibrierung mit einer gut getesteten Synchronisationstechnologie.

+0

Ja, ich möchte einen Kompromiss zwischen Konsistenz und Leistung machen Deshalb wähle ich Redis als Sklave. Eine konstante Dateniteration/-rekonstruktion scheint sicher, aber ein wenig ressourcenintensiv zu sein? In der Tat, wie sehr Redis dies braucht, ist die Antwort, die ich wissen möchte. – Jiaji