Apache Cassandra. Datenaufzeichnung. Teil 1 – Commit-Protokoll


Cassandra_logoDas Lesen und Schreiben von Daten in der Realität ist viel komplizierter, als man es sich bei der ersten Betrachtung des Problems vorstellen könnte. Beim Umgang mit einem verteilten DBMS ist es sinnvoll, diese Prozesse so tief wie möglich zu verstehen.… Die Apache Cassandra. Daten schreiben “Ich werde etwas Licht auf die Komponenten werfen, die zum Schreiben von Daten verwendet werden, und verstehen, wie sie funktionieren.

Zunächst werden die Daten in das Commit-Protokoll und erst dann in den RAM in Memtables geschrieben. ::

Cassandra-Schreibvorgänge werden zuerst in ein Festschreibungsprotokoll (aus Gründen der Dauerhaftigkeit) und dann in eine speicherinterne Tabellenstruktur geschrieben, die als memtable bezeichnet wird.

Commit Log ist eine Datenstruktur, die sich auf einer Festplatte befindet und alle Schreibvorgänge speichert (protokolliert), um die Datenbeständigkeit bei verschiedenen Fehlern (z. B. Stromausfall) zu erhöhen. Das Festschreibungsprotokoll besteht aus einer oder mehreren Dateien. Die maximale Größe jeder Datei wird durch den Wert der Variablen bestimmt ::

commitlog_segment_size_in_mb – Standardmäßig 32 MB. Eine separate Instanz der CommitLogSegment-Klasse ist für die Bereitstellung jeder Datei verantwortlich. … Die Datei besteht aus Änderungsketten (Zeilenmutation) bestimmter Zeilen von Spaltenfamilien. Das heißt, in einem Segment kann es Ketten nicht nur verschiedener Zeilen geben, sondern auch Zeilen aus verschiedenen Spaltenfamilien und Schlüsselräumen.

Die maximale Größe des Festschreibungsprotokolls wird durch den folgenden Parameter begrenzt:

commitlog_total_space_in_mb – Standard 32 MB für 32-Bit-JVMs und 8192 MB für 64-Bit. Wenn der Schwellenwert überschritten wird, werden Daten aus Memtable in SSTables auf die Festplatte geschrieben. Anschließend werden die entsprechenden Datensätze aus dem Festschreibungsprotokoll gelöscht.

Da es viele einzelne Commit-Protokolldateien geben kann, wird bei Erreichen des maximalen Volumes durch die aktuelle Datei sofort eine weitere erstellt und mit Daten gefüllt usw., bis der maximale Volume-Wert für das gesamte Commit-Protokoll überschritten wird. Wenn die maximale Größe erreicht ist, wird ein Datenfluss von Memtable zu SSTable eingeleitet, wonach die entsprechenden Commit-Protokolldateien mit veralteten Daten gelöscht werden.

Die Dateinamen der Commit-Protokollsegmente haben das folgende Format: Commitlog- .log… Anscheinend wird das Alter der Datei genau durch den Zeitstempelwert bestimmt. Dies sind jedoch ausschließlich persönliche Beobachtungen, Informationen zu diesem Thema konnten leider nicht öffentlich zugänglich gemacht werden.

Das Festschreibungsprotokoll kann in zwei verschiedenen Modi ausgeführt werden:

periodisch – Das Festschreibungsprotokoll (auf der Festplatte) wird mit dem Seitencache synchronisiert Betriebssystem standardmäßig alle 10 Sekunden (d. h. fsync-Betrieb wird alle 10 Sekunden ausgeführt), während die Schreibbestätigung gesendet wird, nachdem die Daten im Seiten-Cache des Betriebssystems empfangen wurden, muss nicht auf die Synchronisierung gewartet werden. Die Zeit kann durch Ändern des Parameters eingestellt werden commitlog_sync_period_in_ms… Der Nachteil ist, dass Sie innerhalb dieser Zeit Daten im Seitencache verlieren können, wenn alle Replikate unwiederbringlich verloren gehen. ;;

Stapel – Die Bestätigung des Datenschreibens wird erst gesendet, nachdem die fsync-Synchronisation abgeschlossen ist. Dies gibt eine 100% ige Garantie für die Aufzeichnung, aber der Preis für die Zuverlässigkeit sind die hohen Anforderungen an die Leistung des Festplattensubsystems. Vor dem Zurücksetzen der Daten wird kurz gewartet, was dem Wert entspricht commitlog_sync_batch_window_in_msStandardmäßig 50 Millisekunden (das sind Größenordnungen weniger als 10 Sekunden in der periodisch). Es wird dringend empfohlen, unter Commit Log eine separate physische Festplatte zu haben, wenn Sie diesen Modus verwenden.

Die Commit Log-Betriebsmodi werden durch Ändern des Parameters gesteuert commitlog_sync.

Erwähnenswert ist auch der Parameter, der für die Steuerung der Größe der Commit Log-Warteschlange verantwortlich ist. commitlog_periodic_queue_size… Der Standardwert ist 1024 * CPU_core. Es wird empfohlen, den Parameter zu ändern, wenn Sie mit großen Blobs arbeiten, und ihn zumindest mit den Einstellungen für concurrent_writes abzugleichen:

Reduzieren Sie diese Zahl, wenn Sie sehr große Blobs schreiben. Zum Beispiel funktioniert 16 × number_of_cpu_cores für 1-MB-Blobs recht gut. Diese Einstellung sollte mindestens so groß sein wie die concurrent_writes Rahmen.

Das Prinzip der Datenerfassung wird am besten anhand von Beispielen aus der offiziellen Dokumentation veranschaulicht. In Analogie dazu werde ich eine schematische Version nur der Commit-Log-Struktur darstellen:

Commit-Protokoll

Wie Sie in der Abbildung sehen können, beginnt die Datenaufzeichnung mit der Protokollierung in Commit Log auf der Festplatte. Anschließend werden die Daten in Memtables abgelegt, die RAM verwenden. Versuchen wir, die Abbildung durch Hinzufügen von Betriebssystemkomponenten ein wenig zu komplizieren, ohne zu verstehen, wie die Idee des Commit-Protokolls unvollständig wäre:

Festschreibungsprotokoll erweitert

Wie oben erwähnt, sammelt der Seiten-Cache des Betriebssystems Daten für einige Zeit (standardmäßig 10 Sekunden) von Dateiänderungen und schreibt dann alle Änderungen zwangsweise (unter Verwendung eines fsync-Aufrufs) fest. Da sich der Seitencache im RAM befindet, besteht immer ein gewisses Risiko, dass diese kleine Datenmenge bei einem gleichzeitigen Hardwarefehler auf allen Hostknoten des Replikats, in das Daten geschrieben werden, verloren geht.

Damit ist die Analyse der Commit-Log-Struktur des Cassandra-DBMS abgeschlossen, und ich komme zur Betrachtung der nächsten Komponente – Memtables – im Apache Cassandra-Artikel. Datenaufzeichnung. Teil 2 – Memtable.

Kommentare bereitgestellt von HyperComments

Leave a Reply

Your email address will not be published. Required fields are marked *