NoSQL: Cassandra Schreiboperation?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Ich würde es zunächst an einem bildlichen Beispiel beschreiben.

Stell dir vor, du bist Kellner in einem Bierzelt. Du könntest hier nun jedes Maß einzeln transportieren, was dich einige Zeit kosten dürfte. Effektiver wäre es, mehrere Krüge auf einem Tablett zu transportieren, welches so weit gefüllt wird, bis seine Belastungsgrenze ausgereizt ist.

Das Commit-Log wäre in diesem Fall die Kundenbestellliste. Sie sichert ab, dass jeder registrierte Kunde seine Bestellung erhält. Das Tablett stellt die MemTable dar. Es ist ein lokaler Zwischenspeicher, der erst einmal so viel aufnimmt, wie ihm möglich ist. Sobald das Tablett voll ist, werden die Krüge (Daten) zum tatsächlichen Zielsystem transportiert (SSTable) und somit die Bestellung abgeschlossen.

Was ist ein In-Memory-System?

Im Grunde ist damit ein Speicherbereich innerhalb des Arbeitsspeichers gemeint. Also Speicherplatz, der dem Programm (Cassandra) zur Programmlaufzeit zur Verfügung steht.

Der Vorteil an so einem System ist, dass die Daten schneller verarbeitet werden können. Der Computer hat einfachere, schnellere Zugriffsmöglichkeiten auf seinen Arbeitsspeicher.

Allerdings ist der Speicherplatz natürlich begrenzt und nicht persistent (bei Programmbeendigung wird der Bereich neu reserviert und die Daten sind weg). Daher müssen die Daten irgendwann in ein persistentes System übertragen (Speicherung auf der Festplatte/SSTable) werden.

Müsste Cassandra auf diesen Zwischenspeicher verzichten und die Daten stattdessen sofort auf der Festplatte speichern, würden die Schreibvorgänge viel länger dauern. Andersherum bietet der Zwischenspeicher den Vorteil, dass du Daten, die erst kürzlich geschrieben (aber noch nicht persistent gespeichert) wurden, schneller abrufen kannst.

Was ist ein MemTable?

MemTable ist einfach nur der Name für so einen Speicherbereich. Da die Daten im Speicher entsprechend formatiert werden (sodass sie später leichter/schneller in das persistente System übertragen werden können), ist das Wort Table in dem Begriff inkludiert.

Cassandra kann übrigens mehrere MemTables anlegen. Zu jeder Datenbanktabelle gibt es maximal eine aktive MemTable (die aktuelle Schreibvorgänge aufnimmt) und dazu kann es noch mehrere inaktive MemTables geben, die noch darauf warten, weiter befüllt oder geleert zu werden.

Was ist mit "die Daten hält, bis sie voll sind" gemeint?

Einfach gesagt, wartet eine MemTable darauf, einen bestimmten Schwellenwert zu erreichen. Ist die Datenbank z.B. so konfiguriert, dass eine Memtable maximal 5 MB fassen darf, würde sie bei Überbieten dieses Werts ihre Daten an die SSTable abgeben.

Es gibt allerdings noch andere Kriterien/Konfigurationsmöglichkeiten, die bestimmen, wann eine MemTable geleert wird. Du könntest eine Zeitperiode vorgeben (z.B. Speichere alle fünf Sekunden die Daten einer MemTable persistent) und es gibt ein Speicherlimit für das Commit-Log.

Man könnte natürlich mal in die (technischere) Beschreibung schauen.

Das Commitlog ist im Endeffekt ein WAL und setzt das WAL-Prinzip um. MemTable ist einfach ein Block im (Haupt)Speicher mit Datenstrukturen und den Daten - im Endeffekt eine Form von Cache. Sobald der voll ist, werden Daten in die persistenten SS-Tables überbführt (Festplatte).