2012-09-08 9 views
5

Es scheint, Sie können Transaktionen in Riak tun. Wie stellt man sicher, dass die Daten korrekt sind?Stellen Sie Korrektheit in Riak sicher?

Sagen wir, wir möchten einen Kommentar einfügen. In redis würde ich tun

commentId=incr commentCount 
multi 
SET comment_post:commentId postId //for later use when we flag comments. We'll need to know where in the db it is 
RPUSH post_comment:postId binaryValue //contains commentId in it + comment body 
exec 

in SQL würde einfügen i eine neue Zeile in einem Kommentar Tabelle mit dem Text und Post-ID. Beide verwenden mehr als eine Aussage. Wie füge ich den Kommentarkörper ein und verbinde ihn mit dem Kommentar in Riak, da er keine Transaktionen hat?

Ein anderes Problem ist, wenn ich einen Beitrag modifiziere. Wie aktualisiere ich die Post und aktualisiere die Tag-Liste der Post mit diesem Tag

Antwort

6

Riak ist ein schließlich konsistentes System entwickelt, um verfügbar zu schreiben und hat kein Konzept der Atomizität; Es gibt keine atomare Zähler oder Transaktionen.

Bearbeiten: Wir veröffentlicht Zähler mit CRDTs in Riak 1.4. Einzelheiten siehe Counters in Riak 1.4

Der von Riak verwendete Ansatz basiert auf dem Amazon Dynamo-Papier und verwendet Vektoruhren zur Konfliktlösung; es ist ein Lese-/Modifizierungs-/Schreib-Zyklus mit irgendeiner Konfliktauflösung, die während eines nachfolgenden Lesevorgangs ausgeführt wird. Sie können zu einem bestimmten Zeitpunkt mehrere Werte für einen bestimmten Schlüssel angeben, die beim Abrufen zurückgegeben werden.

es klingt wie Sie auf unserem secondary indexes aussehen sollen (wenn ich Ihr Szenario bin zu verstehen, die Tatsache, dass Sie einen neues brauchen commentId für ein ‚wie‘ etwas verwirrend ist, ohne zu wissen). Sie würden einen sekundären Index erstellen, der auf Ihren Kommentarkörper zeigt, der mit dem Körper selbst gesendet wird, wenn Sie einen Informationsspeicher erstellen. Das löst mindestens die Hälfte des Problems.

Wie Sie Ihre commentId bekommen, ist ein wenig komplizierter. Sie können keinen globalen Atomzähler verwenden, weil wir sie nicht haben. Ihr Entwurf müsste sich entweder nicht auf sequenzielle IDs stützen (vielleicht UUIDs erzeugen?) Und vielleicht unsere links verwenden?

Wenn Sie interessiert sind und mögliche Designansätze diskutieren möchten, bitte ping uns auf die riak-users mailing list - alle unsere Ingenieure lesen es und sind immer glücklich, Fragen zu beantworten.

+0

Ich weiß nicht viel über Riak, als ich einen kurzen Blick darauf warf. Wenn ich die Grundlagen oder mehr kenne, werde ich dort posten, aber nicht sofort. Ich möchte eine allgemeine Idee bekommen, wofür es geeignet ist, da ich herausgefunden habe, dass redis schlecht ist, eine db zu sein, da es in der Lage sein muss, alles in Erinnerung zu behalten. Ich weiß nichts über 'vector clocks', aber du hast gerade gesagt, dass ich mehrere Werte für einen Schlüssel haben kann, der komisch klingt, aber ich werde so tun, als wäre riak ziemlich effizient. Also ist Riak so konzipiert, dass alle Konsistenz-Logik von der App durchgeführt wird? Das ist interessant –

+0

Ich habe ein bisschen gelesen. Ich bin ein wenig verwirrt bc das Beispiel zeigte Einstellung allow_mult auf True gesetzt ist. Was passiert also, wenn ich etwas habe, das einen Schreibkonflikt hat und falsch ist? Es klingt also so, als hätte alles eine vclock drin? Es scheint, dass Sie den Schreibzugriff hoch machen. Ich kann den Gebrauch und den Kompromiss dort sehen. Ich kann mir vorstellen, wie ich Dinge für meine Bedürfnisse lösen und korrigieren kann, aber ich kann mir nicht vorstellen, was passiert, wenn ich Multis nicht gesetzt habe und es falsch ist? Wird einer den anderen überschreiben? Wird es scheitern? Ich kann sehen, wie man mit Dingen umgeht, wenn es scheitert (aber ich muss andere Schreiboperationen rückgängig machen) –

+0

aber ich kann nicht sehen, was passiert, wenn es nicht scheitert und ein Job beendet, während der andere Job gestartet und ein bisschen danach beendet hat und Daten überschrieben hat . –