2016-03-28 5 views
2

Als ich mit Cassandra anfing, benutzte ich Sparsamkeit.Wird das Schema sofort synchronisiert, wenn Sie einen CQL CREATE TABLE-Befehl in Cassandra ausführen?

Nach dem Erstellen einer Tabelle musste ich warten, um sicherzustellen, dass die Tabelle auf allen Knoten erstellt wurde. Ohne Wartezeit ist ein Knoten möglicherweise nicht bereit und die Tabelle wäre nicht verwendbar (viele Fehler würden ausgegeben, wenn die Abfrage an "den falschen Knoten" gesendet wurde.)

Um "synchronisiert" zu werden, würde ich warten bis describe_schema_versions() zurückgegeben genau eine Version des Schemas. Das bedeutete, dass es auf allen Knoten eingefroren war.

Es scheint keine Entsprechung in CQL zu geben. Bedeutet das, dass das Synchronisationsproblem älterer Versionen (mit Thrift) behoben wurde? Oder habe ich bei meinen Recherchen etwas übersehen?

Antwort

3

In CQL seit Cassandra 1.1, wenn Sie eine Schemaänderung vornehmen, führt Ihr Koordinator Knoten alle Schwerarbeit durch, um sicherzustellen, dass das Schema "synchronisiert" ist. Und wenn während der Schemaänderung ein Knoten heruntergefahren wird, bevor er erneut auftritt, stellt er sicher, dass er die neueste Schemaversion von den anderen Knoten hat. More Detailed Information about the change from the old way here. Hier ist eine weitere verwandte stackoverflow question zum Auflösen von Schemakonflikten.

+0

Das hört sich seltsam an, denn mit der Sparsamkeit musste ich selbst in Cassandra 2.x diese Synchronisierung noch durchführen. Von dem, was ich lese, sollte es nicht erforderlich gewesen sein, da das Schema im Cassandra-System auf einer hohen Ebene behandelt wird ... –

3

Die modernen DataStax-Treiber prüfen automatisch und warten auf die Schema-Vereinbarung, nachdem Sie eine schemaländernde Anweisung ausgeführt haben. Cassandra gibt eine spezielle Antwort für schemaländernde Anweisungen zurück, die den Treibern erlaubt, dies automatisch zu tun. Sobald der Treiber diese Antwort erhält, fragt er (blockierend) die Tabelle system.peers des Knotens ab, für den die Abfrage ausgeführt wurde, um die gemeldeten Schemaversionen anderer Knoten zu überprüfen. Es wird weiterhin diese Abfrage in einer Schleife ausführen, bis entweder Schema-Vereinbarung erreicht ist oder ein Timeout erreicht ist.

Im Python-Treiber, wenn ein Timeout ohne Erreichen Schema Vereinbarung getroffen wird, wird das ResponseFuture Objekt (das ist wieder von execute_async()) seine is_schema_agreed Eigenschaft auf False gesetzt hat. Ich bin mir nicht sicher, was die Treiber für andere Sprachen tun, aber es ist wahrscheinlich etwas ähnliches verfügbar.

Zusammenfassend sind die Prüfungen, die Sie früher mit Thrift-Treibern durchgeführt haben, nun automatisch und wahrscheinlich robuster.

+0

Ah! Das macht eigentlich Sinn. Das heißt meine Sparsamkeitsschleife war in der Tat immer noch notwendig. Wir verwenden C++ hier, aber ich würde mir vorstellen, dass der Treiber etwas ähnliches tut, damit man wissen kann, ob das Schema wie erwartet vorhanden ist. –

+0

Sorry, aber das ist wirklich nicht praktisch, denn wenn es Zeitüberschreitung gibt, können Sie nicht auf die Tabelle zugreifen. Dieses neue CQL-Zeug ist wirklich nutzlos. –

Verwandte Themen