Erstellen neue Tabelle mit cqlsh auf bestehende Schlüsselraum: Column family ID mismatch
Houston, wir haben ein problem.
Versuchen, erstellen Sie eine neue Tabelle mit cqlsh
auf eine vorhandene Cassandra (v2.1.3) Schlüsselraum Ergebnisse in:
ServerError:
<ErrorMessage code=0000 [Server error] message="java.lang.RuntimeException:
java.util.concurrent.ExecutionException:
java.lang.RuntimeException:
org.apache.cassandra.exceptions.ConfigurationException: Column family ID mismatch (found e8c03790-c952-11e4-a753-5981ea73cd7c; expected e8b14370-c952-11e4-a844-8f10bfb9c386)">
Nachdem der erste schaffen, versuchen, versuchen einmal mehr führt:
AlreadyExists: Table 'ks.Metriken' ist bereits vorhanden
Aber abrufen der Liste der vorhandenen Tabellen für den Schlüsselraum desc tables;
meldet die neue Tabelle.
Das Problem scheint im Zusammenhang mit Cassandra-8387 außer, dass es nur ein client versucht, um die Tabelle zu erstellen: cqlsh
Wir haben eine Reihe von Funken Arbeitsplätze zu schaffen, die schlüsselräume und Tabellen, die beim Start möglicherweise tun dies parallel. Würde das Rendern der Schlüsselraum korrupt?
Erstellen einer neuen Schlüsselraum und eine Tabelle hinzufügen, es funktioniert wie erwartet.
Irgendwelche Ideen?
UPDATE
Fand einen workaround: Problem eine Reparatur der Schlüsselraum und die Tische erscheinen (desc tables
) und sind auch funktional.
- Gut zu finden auf die Reparatur. Ich würde vorschlagen, entfernen Sie die darunter liegende Verzeichnisse und Dateien...vor allem, wenn das schema war anders.
- die Reparatur hat bei mir nicht funktioniert $ nodetool repair -- testks [2015-07-04 03:28:54,612] Nichts zu reparieren für Schlüsselraum 'testks'
- Gleiche Fehler auf einen einzelnen Knoten-cluster und anscheinend die Reparatur hat nicht funktioniert. Musste neu starten in Verzweiflung. Alle updates?
- Sie sollten Ihre post zu aktualisieren, wie Sie eine Antwort auf Ihre eigene Frage, und wählen Sie es als die Antwort. Diese Weise Leute wissen, dass Sie das problem bereits gelöst haben und anderen Menschen mit dem gleichen Problem wissen was die Lösung war (in den richtigen spot spot auf der Seite).
- Wie ich schon erwähnt, in der Frage, es ist ein workaround und nicht eine Lösung für das problem.
- Verstanden. Ich dachte, da Sie Ihre Frage für "Irgendwelche Ideen/workarounds", die ein workaround wäre akzeptabel als Antwort. Ich kann verstehen wollen, reservieren Sie, dass vor Ort für eine tatsächliche Lösung, obwohl.
- du hast Recht 🙂 ich habe entfernt den Anruf für workarounds in Einklang zu bringen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Antwort: Sie haben eine race-condition, die Sie denken, dass Sie gelöst in 1.1.8...
Lange Antwort:
Bekomme ich diesen Fehler die ganze Zeit auf einem meiner Cluster. Ich habe test-Maschinen, die wirklich langsamen Festplatten und erstellen einer oder zwei Tabellen genug, um die Fehler, wenn ich 4 Knoten auf zwei verschiedenen Computern.
Unten habe ich eine Kopie der stack-trace von meiner Cassandra 3.7 installation. Obwohl Ihre version wurde 2.1.3, ich würde überrascht sein, dass dieser Teil des Codes viel verändert.
Als wir sehen können, ist die Ausnahme passiert in der
validateCompatibility()
Funktion. Dies erfordert, dass die neuen und alten Versionen der Metadaten haben diese gleich:Wenn diese Werte nicht übereinstimmen zwischen der alten und der neuen meta-Daten, dann wird der Prozess wirft eine exception. In unserem Fall, die
cfId
Werte unterschiedlich sind.Hinauf auf den stack, wir haben die
apply()
fordertvalidateCompatibility()
sofort.Als Nächstes haben wir
updateTable()
. Ebenso ruft esapply()
fast sofort. Zuerst ruft er diegetCFMetaData()
zum abrufen der aktuellen Spalte Familie Daten ("alt") ist im Vergleich gegen den neuen Daten.Als Nächstes sehen wir
updateKeyspace()
. Diese Funktion berechnet einediff
zu wissen, was sich geändert hat. Dann spart es, dass in jede Art von Daten. Tabelle 2. nach der Art...Vor, dass Sie die
mergeSchema()
berechnet, was geändert an der Schlüsselraum Ebene. Es fällt dann schlüsselräume, die gelöscht wurden, und generieren neue schlüsselräume für diejenigen, die aktualisiert wurden (und für neue schlüsselräume). Schließlich, Sie Schleife über die neue schlüsselräume aufrufenupdateKeyspace()
für jeden von Ihnen.Nächsten im Stapel sehen wir eine interessante Funktion:
mergeSchemaAndAnnounceVersion()
. Dies wird aktualisieren Sie die version, sobald die schlüsselräume aktualisiert wurden, im Speicher und auf der Festplatte. Die version des Schemas enthält, diecfID
nicht kompatibel ist und somit erzeugt die Ausnahme. DieAnnounce
Teil ist das senden einer gossip-Nachricht zu dem anderen Knoten über die Tatsache, dass dieser Knoten kennt nun die neue version von einem bestimmten schema.Als Nächstes sehen wir etwas, genannt
MigrationTask
. Dies ist die Botschaft verwendet, zum migrieren von änderungen zwischen Cassandra-Knoten. Der message-payload ist eine Sammlung von Mutationen (diese werden von dermergeSchema()
Funktion.)Den rest der stack zeigt nur
run()
Funktionen, die verschiedene Arten von Funktionen verwendet, um Nachrichten zu behandeln.In meinem Fall, bei mir ist das problem aufgelöst wird und ein wenig später, und alles ist gut. Ich habe nichts zu tun für das schema, um endlich wieder in sync. wie erwartet. Aber es hindert mich, die schaffen alle meine Tabellen in einem Rutsch. So, mein nehmen an dieser Suche ist, dass die migration die Nachrichten kommen nicht in der erwarteten Reihenfolge. Es muss ein timeout, das erfolgt durch erneutes senden des Ereignisses und erzeugt, dass der mix-up.
So, lassen Sie uns den code, der das senden der Nachricht in den ersten Platz, Sie sehen, dass einer in der MigrationManager. Hier haben wir eine
MIGRATION_DELAY_IN_MS
parameter in Verbindung mit einem alten Problem, Schema push/pull-Rennen, das war zu vermeiden, eine race-condition. Naja... da gehen Sie. So sind Sie sich bewusst, dass eine mögliche race-condition und zu versuchen, es zu vermeiden, Sie fügte hinzu, ein wenig Verzögerung gibt. Ein Teil dieses Update enthält eine version überprüfen. Wenn die Versionen bereits gleich sind, vermeiden Sie das update insgesamt (D. H. ignorieren, Klatsch).Die Verzögerung, die wir sprechen, ist eine minute:
Man würde denken, dass eine ganze minute würde ausreichen, aber irgendwie habe ich immer noch den Fehler die ganze Zeit.
Tatsache ist, dass Ihr code nicht erwarten, dass mehrere Veränderungen, die da eine nach der anderen, darunter große Verzögerungen, wie ich Sie habe. Wenn ich also zum erstellen einer Tabelle, und dann andere Dinge tun, ich würde in Ordnung sein. Auf der anderen Seite, wenn ich will 20 Tabellen in eine Zeile auf die langsame Maschinen, die Klatsch-Nachricht von einem früheren schema-änderung kommt zu spät (d.h. nach dem neuen CREATE-TABLE-Befehl kam zu diesem Knoten). Das ist, wenn bekomme ich diesen Fehler. Das Schlimmste, denke ich, ist, dass es ist ein falscher Fehler (d.h. es sagt mir, dass die Gerüchte, die später war, und nicht, dass mein schema ist ungültig und das schema in der gossip-Nachricht ist ein alten.)
CASSANDRA-5025
) «Schema-Migrationen neigen dazu, zu geschehen, platzt also dieser patch scheint, wie es möglicherweise reduziert das problem aber nicht beseitigen.» Also ich denke zumindest, dass eine person möglicherweise erinnern, dass es noch einen (möglichen) Problems.Cassandra 3.11.0
Hatte ich zwei unterschiedliche Tabellen-schemas mit dem gleichen Tabellennamen versehen. also dieses Problem passiert ist (ich war mit
express-cassandra
)