5

Gibt es eine verteilte, hoch verfügbare, eventuell konsistente db, die eine idempotente Operation auf skalaren Werten unterstützt?Eventuell konsistente verteilte Datenbank mit idempotentem Erhöhungsoperator?

Wenn wir normale Updates verwenden, besteht die Möglichkeit, dass wir zwei verschiedene Werte auf verschiedenen Knoten haben und keiner der Werte korrekt ist, weil wir die Beträge um beide Transaktionswerte erhöhen müssen.

Gibt es eine verteilte Datenbank, wo ich einen Befehl erhöhen kann (Schlüssel, Attribut [Spalte], Diff), so dass ich sicher bin, dass dieser Vorgang auf anderen Replikate unabhängig von der aktuellen ausgeführt wird Wert des Kontos? Auf diese Weise werde ich eine eventuelle Konsistenz für die Erhöhung der Operation haben, auch wenn 2 verschiedene Knoten um einen anderen Wert erhöht werden, da diese Zunahme sich auf andere Repliken ausbreiten würde.

Ich spreche nicht von bedingten Updates, da es nicht auf Hochverfügbarkeit db wie Cassandra funktionieren würde (deshalb haben sie diese Funktion nicht), ich interessiere mich für atomare Zunahmeoperation.

Danke.

P.S. Im Fall Idempotent Erhöhung würde ich einen Befehl Anstieg hat (Schlüssel, Attribut, diff, lock_key), so würde das db nicht erhöht, wenn es bereits den gleichen Befehl mit dem gleichen lock_key

tl erhalten; dr:

Gibt es eine Möglichkeit, einen genauen Zähler in verteilten AP Art Datenbank zu machen? 2 Probleme: 1) Wenn ich Operation sende, um einen Zähler zu erhöhen, und ich keine Antwort erhalte, würde ich diese Anfrage erneut senden, aber ich möchte den Zähler nicht zweimal erhöhen. 2) Wenn dieser Zähler in der gleichen Zeit auf einem anderen Replikat aktualisiert wird, möchte ich schließlich kombinieren, erhöht, um die Werte nicht zu überschreiben. Also gibt es einen Befehl wie erhöhen ("Johns Balance", +5.67, "sdfsdfas"), wobei sdfsdfas eine Zeichenfolge ist, die verwendet wird, um doppelte Aktualisierung zu verwerfen. Gibt es eine db, die diese Art von Befehlen repliziert?

+0

Ich bin mir nicht sicher, ob ich das Szenario verstehe, wo dies nützlich wäre. Wenn es wichtig ist, dass alle Replikate zu jeder Zeit denselben Wert beibehalten müssen, müssen sie synchronisiert bleiben. Wie würden "idempotente Updates" dabei helfen? –

+0

Was ist mit nur einer db mit Replikation zu verwenden, und dann äquivalent in 'ince_operations (target_id, erhöhen_betrag, operation_id)' und dann sum() Ihren Weg zum Sieg? operation_id identifiziert doppelte Vorgänge. Es ist sicherlich schließlich konsistent. – goat

Antwort

1

Ok, ich sehe, dass Problem 2 wird in cassandra https://issues.apache.org/jira/browse/CASSANDRA-1072 Distributed Zähler gelöst wird Anstieg Operationen kombinieren, so dass alles am Ende übereinstimmen werden.

Problem 1 (Idempotenz) ist eine offene Frage: https://issues.apache.org/jira/browse/CASSANDRA-4775

Wenigstens weiß ich, dass die Leute darüber nachdenkt, ist es wirklich für mein Szenario wichtig, damit ich die Lösung dieser Frage zu helfen versuchen.

Ich hoffe, dass dies hilft, meine Frage zu klären.

1

Es scheint mir, dass Sie über zwei verschiedene Dinge sprechen. Idempotenz würde bedeuten, dass Sie mehrmals die increase Anweisung senden können, aber der Zähler würde nur einmal erhöht werden. Atomarität ist für eine einzelne Operation nicht sinnvoll (es macht mehr als einen Sinn, zum Beispiel den Zähler UND das Datum der Erhöhung atomar zu erhöhen; entweder beide werden modifiziert, oder keiner tut es).

MongoDB unterstützt atomare Operationen auf der "Dokument" -Ebene (was ich nicht sicher bin), aber offensichtlich ist ein Inkrement-Operator nicht idempotent (per Definition! Wie würden Sie Ihren Zähler sonst erhöhen?).

Können Sie Ihre Frage klären?

Sie können auch keine "eventuell konsistente" Datenbank haben, in der alle Knoten immer den gleichen Wert eines bestimmten Schlüssels haben. Deshalb ist es "schließlich konsistent", weil es nicht garantieren kann, dass sie "gleich" sind.

Als eine Antwort, wenn Sie MongoDB zur Aufrechterhaltung eines Inkrementoperator verwenden möchten, verwenden Sie das folgende Muster (von ihrer Website, Beispiel für die [$inc operator][1]):

db.collection.update({ age: 20 }, { $inc: { age: 1 } }); 
db.collection.update({ name: "John" }, { $inc: { age: 1 } }); 

In Ihrem Fall wäre es db.collection.update({$inc:{mycounter:1}});

+0

yep, ich hätte gerne etwas wie update ({name: "John"}, {$ inc: {balance: 58.4}}); Erhalte ich eine Bestätigung in MongoDB, damit ich dieselbe Abfrage nicht zweimal ausführen kann? Das ist ein Weg. Eine andere Möglichkeit, das Gleiche zu erreichen, ist eine Art idempotenter Anstieg, so dass die gleiche Operation nicht zweimal ausgeführt wird. Zum Beispiel, wenn der Befehl eine Art von locking_key bereitstellen muss, damit er weiß, ob ich bereits versucht habe zu aktualisieren. Ich möchte eine Funktion wie diese in einer AP-Datenbank (MongoDB ist CP, richtig?) – user1944408

+0

Added tl; dr in meiner Frage. – user1944408