cobalt

Ein eingebetteter LSM-Key-Value-Store in Zig. Frische Schreibvorgänge landen in einer WAL-gestützten Skiplist, werden in unveränderliche SSTables geschrieben, und Platz wird durch Leveled-Compaction zurückgewonnen.

cobalt
TL;DR

Ein eingebetteter LSM-Schlüssel-Wert-Speicher in Zig. Frische Schreibvorgänge landen in einer WAL-gestützten Skiplist, werden dann in unveränderliche SSTables geleert, und Leveled Compaction gewinnt den Platz zurück. Es ist das Fundament, auf dem moderne Datenbanken stehen.

Einführung

Die modernen Datenbanken, die Sie täglich benutzen, haben fast immer dieselbe Engine-Form darunter. cobalt existiert, damit diese Form aufhört, eine Blackbox zu sein: Es implementiert den gesamten LSM-Schreibpfad vom Log bis zur Compaction, in Zig, einer Sprache, die Ihnen kein einziges Byte und keine Allokation verbirgt.

Das ist keine weitere Datenbank für die Produktion, sondern eine in ihre Teile zerlegte Engine, in der jede Entscheidung sichtbar ist. Sobald Sie WAL, Memtable, SSTable und Compaction selbst schreiben, hören RocksDB und Cassandra auf, Magie zu sein, und werden zu vertrauten Varianten derselben Idee.

Warum LSM und kein B-Baum

Klassische Datenbanken schreiben an Ort und Stelle und aktualisieren B-Baum-Seiten, was zufällige Schreibvorgänge über die Platte bedeutet. LSM geht den anderen Weg: Jeder Schreibvorgang ist ein Anhängen. Neue Daten landen in einer In-Memory-Struktur, während ältere Schichten unveränderlich auf der Platte liegen. Das macht Schreibvorgänge schnell und sequenziell, denn sequenzielle Schreibvorgänge sind genau das, was eine Platte am liebsten mag.

Der Preis ist klar und bewusst: Dieselben Daten können an mehreren Stellen zugleich liegen und müssen später zusammengeführt werden. Die ganze Kunst von LSM besteht darin, diese Schuld im Hintergrund abzuzahlen, ohne die Schreibvorgänge zu bremsen, die sie erzeugen.

Der Schreibpfad, Schritt für Schritt

1
WAL

ein Schreibvorgang trifft zuerst das Log, also überlebt er ein plötzliches Abschalten, bevor er irgendwo anders landet.

2
Skiplist

frische Daten sitzen in einer sortierten In-Memory-Struktur, bereit für schnelle Lesevorgänge.

3
SSTable

wenn der Speicher voll wird, wird die Skiplist in eine unveränderliche, sortierte Datei auf der Platte geleert.

4
Compaction

Leveled Compaction führt Dateien über Ebenen zusammen, verwirft überschriebene Versionen und gewinnt Platz zurück.

Die Reihenfolge dieser Schritte ist kein Zufall. Das WAL kommt zuerst, gerade weil es Dauerhaftigkeit garantiert, bevor die Daten den flüchtigen Speicher erreichen. Wäre die Reihenfolge umgekehrt, würde ein Stromausfall zwischen dem Speicher-Schreibvorgang und dem Log stillen Datenverlust bedeuten.

Compaction ist das Herz, das eine funktionierende LSM von einer unterscheidet, die mit der Zeit erstickt. Ohne sie türmen sich SSTable-Dateien endlos, und ein Lesevorgang muss immer mehr Schichten durchsehen. Leveled Compaction führt sie über Ebenen zusammen, wirft dabei überschriebene Versionen hinaus und gewinnt den von toten Daten belegten Platz zurück.

i
Hinweis

Dieselbe Engine-Form, WAL plus Memtable plus SSTable plus Compaction, finden Sie in RocksDB, LevelDB und Cassandra. Der Unterschied zwischen ihnen ist meist die Feinabstimmung derselben Bausteine, nicht eine andere Architektur.

Das Ende der Blackbox

Der größte Gewinn von cobalt ist nicht der Speicher selbst, sondern dass große Datenbanken aufhören, ein Rätsel zu sein. Sobald Sie den ganzen Weg vom Anhängen an das Log bis zum Zurückgewinnen von Platz in der Compaction gegangen sind, wissen Sie genau, warum LSM beim Schreiben schnell ist und wo es das beim Lesen bezahlt.

Die Engine-Schichten und wo sie noch leben

SchichtRolleWo noch
WALSchreibdauerhaftigkeitjede ernsthafte Datenbank
Memtable (Skiplist)frische Daten im SpeicherRocksDB, LevelDB
SSTableunveränderliche Dateien auf der PlatteCassandra, LevelDB
CompactionPlatzrückgewinnung, ZusammenführenRocksDB, Cassandra

Weitere Projekte

Weitere Projekte aus derselben Kategorie - sehen Sie, wie wir ähnliche Herausforderungen angehen.

Haben Sie ein ähnliches Projekt?

Melden Sie sich - ein Angebot ist kostenlos und kommt innerhalb einer Stunde.