Cassandra - eindeutige Einschränkung für Zeilenschlüssel

8

Ich würde gerne wissen, wann es in Cassandra möglich ist, eine eindeutige Einschränkung für den Zeilenschlüssel anzugeben. Ähnliches wie SQL Server ADD CONSTRAINT myConstrain UNIQUE (ROW_PK)

Beim Einfügen mit bereits vorhandenem Zeilenschlüssel werden die vorhandenen Daten nicht überschrieben, aber ich erhalte eine Art von Ausnahme oder Antwort, dass die Aktualisierung aufgrund von Einschränkungen nicht durchgeführt werden kann.

Vielleicht gibt es einen Workaround für dieses Problem - es gibt Zähler, die Nähte als atomar aktualisieren

Danke,

Maciej

    
Maciej Miklas 16.11.2011, 15:39
quelle

5 Antworten

2

Eine Möglichkeit ist die Verwendung von Cages und ZooKeeper:

Ссылка

    
Maciej Miklas 21.11.2011, 12:37
quelle
12

Leichte Transaktionen?

Ссылка

INSERT INTO customer_account (customerID, customer_email) VALUES (‘LauraS’, ‘[email protected]’) IF NOT EXISTS;

    
Van Thoai Nguyen 01.06.2014 01:15
quelle
7

Leider nein, weil Cassandra keine Schreibprüfungen durchführt. Um so etwas zu implementieren, müsste Cassandra vor jedem Schreibvorgang lesen, um zu prüfen, ob der Schreibvorgang erlaubt ist. Dies würde die Schreibvorgänge stark verlangsamen. (Der springende Punkt ist, dass schreibt gestreamt werden sequentiell ohne dass jede Platte zu tun sucht -. Liest dieses Muster unterbrechen und Kraft sucht auftreten)

Ich kann mir auch nicht vorstellen, dass Zähler auch helfen würden. Zähler werden nicht mit einem atomaren Test-and-Set implementiert. Stattdessen speichern sie im Wesentlichen viele Deltas, die addiert werden, wenn Sie den Zählerwert lesen.

    
Theodore Hong 16.11.2011 16:36
quelle
4

Ich fühle mich heute gut und werde nicht alle anderen Poster ablehnen, weil ich sage, dass es nicht einmal im Entferntesten möglich ist, ein Schloss mit nur einem Cassandra-Cluster zu erstellen. Ich habe gerade den Bäckereialgorithmus¹ von Lamport implementiert und es funktioniert gut. Keine Notwendigkeit für andere seltsame Dinge wie Zoos, Käfige, Speichertabellen, etc.

Stattdessen können Sie einen Sperrmechanismus für den Multi-Prozess / Multi-Computer eines Armers implementieren, solange Sie Lesen und Schreiben mit mindestens QUORUM-Konsistenz erhalten. Das ist alles, was Sie wirklich brauchen, um diesen Algorithmus richtig implementieren zu können. (Die QUORUM-Stufe kann sich je nach Art der benötigten Sperre ändern: lokal, Rack, gesamtes Netzwerk.)

Meine Implementierung wird in Version 0.4.7 von libQtCassandra (in C ++) erscheinen. Ich habe es bereits getestet und es verriegelt perfekt. Es gibt noch ein paar Dinge, die ich testen möchte, und Sie können eine Reihe von Parametern definieren, die jetzt fest codiert sind. Aber der Mechanismus funktioniert perfekt.

Als ich diesen Thread fand, dachte ich, dass etwas nicht stimmte. Ich suchte noch mehr und fand eine Seite auf Apache, die ich unten erwähne. Die Seite ist nicht sehr fortgeschritten, aber ihr MoinMoin bietet keine Diskussionsseite ... Jedenfalls denke ich, dass es erwähnenswert war. Hoffentlich beginnen die Leute damit, diesen Sperrmechanismus in allen möglichen Sprachen wie PHP, Ruby, Java usw. zu implementieren, damit er benutzt wird und bekannt ist, dass er funktioniert.

Quelle: Ссылка

¹ Ссылка

Das Folgende ist mehr oder weniger die Art, wie ich meine Version implementiert habe. Dies ist nur eine vereinfachte Zusammenfassung. Ich muss es vielleicht etwas mehr aktualisieren, weil ich beim Testen des resultierenden Codes einige Verbesserungen vorgenommen habe (auch der echte Code verwendet RAII und enthält eine Zeitüberschreitungsfunktion über der TTL.) Die endgültige Version wird in libQtCassandra-Bibliothek .

%Vor%     
Alexis Wilke 16.01.2013 11:13
quelle
2

Offensichtlich können Sie nicht In Cassandra spiegeln sich alle Ihre Schreibweisen in

wider
  1. Commit-Protokoll
  2. Memtable

um Millionen Schreibvorgänge zu skalieren & amp; Haltbarkeit

Wenn wir Ihren Fall berücksichtigen. Bevor Sie dies tun, müssen Cassandra

  1. Auf Vorhandensein in Memtable
  2. prüfen
  3. Prüfe, ob es in allen sstables vorhanden ist [Wenn dein Schlüssel von Memtable geleert wird]

Im Fall 2, obwohl Cassandra Bloom-Filter implementiert hat, wird es ein Overhead sein. Jeder Schreibvorgang wird ein Read & amp; schreibe

Aber Ihre Anfrage kann den Zusammenführungs-Overhead in Cassandra reduzieren, weil der Schlüssel jederzeit in nur einer Tabelle vorhanden ist. Aber dafür muss Cassandras Architektur verändert werden.

Jus überprüfen Sie dieses Video Ссылка oder laden Sie diese Präsentation herunter Ссылка um zu sehen, wie Counter zu Cassandras Existenz gekommen sind.

    
Tamil 17.11.2011 14:25
quelle

Tags und Links