Die erste stabile Version des Projekts TidesDB wurde veröffentlicht, das eine Bibliothek zur Speicherung von Daten im Schlüssel/Wert-Format entwickelt. Das Projekt kann sowohl als eigenständig laufende Engine als auch zur Einbettung in Anwendungen genutzt werden. Zu den wichtigsten Funktionen gehören die Unterstützung von ACID-Transaktionen und die Optimierung für effiziente Datenspeicherung auf Flash-Speichern und im Arbeitsspeicher. Der Code ist in C geschrieben und wird unter der MPL 2.0-Lizenz verbreitet. Bindungen sind für die Sprachen C++, Go, Java, Python, Rust, Lua und JavaScript vorbereitet.
Zur Speicherung der Daten wird die LSM-tree-Struktur (log-structured merge-tree) verwendet, die sorgt dafür, hohe Leistung nicht nur beim Lesen, sondern auch beim Ausführen von Schreib- und Änderungsoperationen. Leseoperationen blockieren nicht das Schreiben und Lesen von Daten, während Schreiboperationen nur die Familie von Spalten blockieren, in der das Schreiben erfolgt. Zur weiteren Beschleunigung des Lesens werden Indizes und Caching auf Basis von Bloom-Filtern unterstützt (diese ermöglichen es, das Vorhandensein in einer Menge zu prüfen, wobei eine falsche Bestimmung eines fehlenden Elements zulässig ist, jedoch ein vorhandenes Element nicht übersehen wird).
Es gibt eine vollständige Unterstützung für ACID-Transaktionen, die atomare Änderungen über Familien von Spalten ermöglichen und erforderlichenfalls atomar zurückgesetzt werden können. Die Daten können komprimiert gespeichert werden, wobei der Algorithmus zur Kompression in Verbindung mit der Familie von Spalten ausgewählt werden kann. Es ist möglich, Sperren auf der Ebene einzelner Familien von Spalten zu setzen und das Speichern im parallelen Modus ohne Blockierung der Ausführung von Operationen mit der Datenbank durchzuführen.
Hauptfunktionen:
- Unterstützung von Familien von Spalten (Column Families) – isolierte Datensätze im Schlüssel/Wert-Format. Für jede Familie von Spalten werden eigene Memtables, SSTables und WAL-Logs verwendet.
- ACID-Transaktionen, die mehrere Operationen mit Familien von Spalten abdecken.
- Optimierung für den parallelen Zugriff auf Daten.
- Unterstützung für bidirektionale Iteratoren, die es ermöglichen, Schlüssel/Wert-Paare vorwärts oder rückwärts relativ zur gewählten Position im Speicher zu durchlaufen, wobei die ursprünglich festgelegte Sortiermethode verwendet wird.
- Unterstützung für das Hinzufügen eigener Vergleichsfunktionen für Schlüssel. Vorhandensein integrierter Vergleichsfunktionen wie memcmp, string und numeric.
- Führung eines Operation Protokolls (WAL, Write-Ahead Log) und automatische Wiederherstellung des Memtables (Speicher im Arbeitsspeicher) aus diesem Protokoll beim Start.
- Verwendung von Bloom-Filtern zur Minimierung von Zugriffsanfragen an den Speicher durch Überprüfung der Existenz des Schlüssels vor dem Lesen aus der SSTable (permanenter Speicher).
- Unterstützung von Algorithmen wie Snappy, LZ4 und ZSTD zur Kompression von Datensätzen in der SSTable-Speicherung und im WAL-Protokoll.
- Möglichkeit, die Lebensdauer von Datensätzen (TTL) zu definieren und abgelaufene Datensätze automatisch auszuschließen.
- Drei Modi zur Synchronisation von Daten im RAM mit dem permanenten Speicher: NONE (der schnellste), BACKGROUND (ausgewogen), FULL (der zuverlässigste).
- Möglichkeit zur Anpassung der Größe des Memtables, der Kompressionsmethoden, der Bloom-Filter, des Synchronisationsmodus und der Verpackungsparameter für jede Spaltenfamilie.
- Einfache C API, die 0 bei erfolgreicher Ausführung der Operation und -1 bei einem Fehler zurückgibt.
- Einsatz von SBHA (Sorted Binary Hash Array) für eine schnelle Datensuche in der SSTable, die es ermöglicht, die Offsets der Blöcke mit Schlüsseln ohne vollständigen Scan zu bestimmen.
- Kompaktes, tragbares binäres Datenbankformat, das Versionsverwaltung unterstützt.
- Integrierte Mechanismen zur Integritätskontrolle, zur Erkennung von Datenbeschädigungen und zur Wiederherstellung.
Quelle: opennet.ru
