Erfahrungen mit Grabsteinen in Apache Cassandra
Grabsteine erkennen und verhindern
Grabsteine können in Protokollen und durch Überwachung bestimmter Metriken erkannt werden. Ihre Lebensdauer wird durch die Tabelleneinstellung gc_grace_seconds definiert.
Tune table settings
- gc_grace_seconds
Die Standardeinstellung für gc_grace_seconds ist 864000 (10 Tage). Für uns war es sinnvoll, diesen Wert auf 345600 (4 Tage) zu senken. Falls Sie sich entscheiden, die Gnadenfrist zu ändern, stellen Sie sicher, dass Reparaturen innerhalb dieses Zeitraums durchgeführt werden.
Sie können einfach den Wert für vorhandene Tabellen ändern oder eine neue Tabelle wie diese erstellen:
TABELLE Keyspace ERSTELLEN.tabellenname MIT GC_GRACE_SECONDS = 345600;
ALTER TABLE keyspace.tabellenname MIT GC_GRACE_SECONDS = 345600;
- TTL
Nachdem TTL den definierten Zeitbereich überschritten hat, werden die Zeilen gelöscht und die Werte in Grabsteine umgewandelt. Standardmäßig laufen die Zeilen / Werte nicht ab.
Während wir die Tombstone-Probleme erlebten, stellten wir fest, dass wir die Time-to-Live unserer Tische erhöhen mussten. Wenn dieser Wert auf 1 ½ Tage festgelegt wurde, löschten fehlgeschlagene Schreibaufträge alle Daten gleichzeitig aus einer Tabelle. Aufgrund der fehlenden Updates wurde jede Zeile mit einem Grabstein markiert. Wenn wir den Wert höher setzen, können wir Jobs rechtzeitig wiederholen und die unnötige Erstellung einer großen Menge von Grabsteinen vermeiden.
- tombstone_warn_threshold
Die Warnung für den Schwellenwert für Grabsteine ist standardmäßig auf 1.000 festgelegt und wird in Ihren Protokollen angezeigt, falls mehr als 1.000 Grabsteine von einer einzigen Abfrage gescannt werden.
- tombstone_failure_threshold
Der Tombstone-Fehlerschwellenwert wird erreicht, wenn 100.000 Tombstones mit einer einzigen Abfrage gescannt werden. In diesem Fall wird die Abfrage abgebrochen, d.h. Daten aus der betroffenen Tabelle können nicht mehr abgefragt werden.
Diese Schwellenwerteinstellungen können geändert werden, beachten Sie jedoch, dass bei einer Erhöhung der Schwellenwerteinstellungen der Speicher für Knoten knapp werden kann.
Führen Sie regelmäßige Reparaturen durch
Cassandra bietet eine hohe Fehlertoleranz und funktioniert auch dann gut, wenn ein Knoten vorübergehend nicht verfügbar ist. Dennoch empfiehlt es sich, nodetool repair nach einem Knotenfehler auszuführen. Vor allem, wenn Sie Datenverlust um jeden Preis vermeiden möchten.
Während des Reparaturvorgangs erhält der Knoten, der nicht verfügbar war, die Schreibvorgänge, die während seiner Ausfallzeit aufgetreten sind.
Es ist ein guter Ansatz, Reparaturen innerhalb der gc_grace_seconds und regelmäßig durchzuführen, da sonst Fälle auftreten können, in denen gelöschte Daten wiederbelebt werden.
Es gibt verschiedene Möglichkeiten, Reparaturen automatisch auszuführen. Eine davon ist Cassandra Reaper. Dieses Tool verfügt über eine schöne Benutzeroberfläche, mit der Reparaturen einfach geplant werden können.
Konfigurieren und Ausführen der Verdichtung
Um Tombstones endgültig zu entfernen und Speicherplatz freizugeben, muss die Verdichtung ausgelöst werden. Es gibt verschiedene Arten von Verdichtungen. Die kleinere Verdichtung führt die Verdichtung über alle sstables aus und wird automatisch in Cassandra ausgeführt. Es entfernt alle Grabsteine, die älter als die Nachfrist sind. Wenn Sie eine Verdichtung manuell über alle sstables auslösen, spricht man von einer Hauptverdichtung. Beachten Sie, dass die Verdichtung für jeden Knoten einzeln ausgelöst werden muss. Sie haben auch die Möglichkeit, eine benutzerdefinierte Komprimierung nur für eine Gruppe bestimmter sstables auszuführen.
Das Komprimieren von Daten in C * bedeutet normalerweise das Zusammenführen von Sstables zu einer einzigen neuen sstable. Beim Lesen mehrerer Zeilen wird der Prozess umso langsamer, je mehr sstables gescannt werden müssen. Um dies zu verhindern, muss die Verdichtung regelmäßig ausgeführt werden.
Um Komprimierungen manuell zu starten, können Sie nodetool compact verwenden. Wenn Sie keinen Schlüsselbereich oder keine Tabelle angeben, wird die Komprimierung für alle Schlüsselbereiche und Tabellen ausgeführt.
nodetool compact keyspace tablename
Dieser Befehl startet eine Komprimierung der angegebenen Tabelle. Sie sollten herausfinden, welche Verdichtungsstrategie für Ihre Tabellen konfiguriert ist, und sie mit den alternativen Strategien vergleichen. Wenn Sie herausfinden möchten, ob eine andere Strategie Ihren Anforderungen besser entspricht, können Sie die DataStax-Dokumentation lesen.
Tabellenmetriken überwachen
1. Nodetool
Nodetool ist Cassandras Befehlszeilenschnittstelle. Es ist praktisch, wenn Sie mehr über die Leistung Ihres Clusters erfahren möchten. Sie können die gesamte Liste der möglichen Befehle von DataStax überprüfen.
Nodetool-Befehle müssen für jeden Knoten einzeln ausgeführt werden. Wir führen C * auf Kubernetes aus, damit wir eine Shell für den laufenden Cassandra-Pod wie folgt öffnen können:
kubectl exec -it cassandra-0 -n recommend bash
Ab diesem Zeitpunkt können wir mit nodetool verschiedene Informationen zu unseren Tabellen abrufen. Der Befehl nodetool tablestats kann ausgeführt werden, um Statistiken für einzelne Schlüsselbereiche oder Tabellen zu drucken:
Die Werte für ‘Durchschnittliche Grabsteine pro Scheibe’ und ‘Maximale Grabsteine pro Scheibe’ geben an, wie viele Grabsteine in den letzten fünf Minuten pro Abfrage gescannt wurden. Wenn dieser Wert sehr hoch ist, müssen Sie die Komprimierung für diese Tabelle möglicherweise häufiger ausführen.
2. SSTable Tools
Vor der Ausführung von SSTable Tools muss Cassandra gestoppt werden. Mit dem Befehl sstableutil erhalten Sie eine Liste der für eine bestimmte Tabelle vorhandenen sstable-Dateien. Wenn Sie sstablemetadata für diese Dateien ausführen, erhalten Sie nützliche Informationen zur angegebenen Tabelle, z. B. die TTL und eine Schätzung der ablegbaren Grabsteine.
3. Prometheus und Grafana
Unser Monitoring für C* wird mit Prometheus und Grafana eingerichtet. Nachdem wir die Warnungen zum Schwellenwert für Tombstones erhalten hatten, beschlossen wir, unserem Dashboard ein Panel hinzuzufügen, das uns eine Vorstellung vom Tombstone-Verhalten für jede unserer Tabellen gibt.
Cassandra verfügt über eine Tabellenmetrik namens ‘TombstoneScannedHistogram’, die das Histogramm der Grabsteine darstellt, die pro Abfrage gescannt wurden. Indem wir das 99. Perzentil zeigen, werden wir sehen, ob etwas nicht stimmt.