Datomic: eine Allzweck-Datenbank für Record Systems
# Hintergrund von Datomic
- Datomic ist eine Allzweck-Datenbank für Record Systems.
- Der Datenbankzustand wird als
[entity, attribute, value]-Tripel (EAV) dargestellt, die als Datoms bezeichnet werden.
- Über das Schema werden Typ und Kardinalität von Attributen gesteuert.
- Es handelt sich um eine temporale Datenbank, die Zeit explizit modelliert.
- Jede Transaktion wird durch einen logischen Zeitstempel
t und die Wanduhrzeit txInstant identifiziert.
- Transaktionen können Datoms hinzufügen oder entfernen.
- Jedes Datom behält einen Verweis auf die Transaktion.
- Die Datenbank ist eine fortlaufend wachsende Menge solcher Tupel.
# Funktionen von Datomic
- Nutzer können den Snapshot-Zustand der Datenbank zu einem logischen Zeitpunkt oder einer Wanduhrzeit anfordern.
- Die vollständige Historie der Datenbank kann eingesehen werden.
- Abfragen sind über eine Datalog-ähnliche API, eine deklarative API zur Graphdurchquerung und den ODM-artigen
Entity-Datentyp möglich.
- Es gibt zwei Versionen: Datomic Pro und Datomic Cloud.
# 1.1 Architektur
- Datomic Pro besteht aus mehreren zusammenarbeitenden Diensten.
- Transactors führen Schreibtransaktionen aus, pflegen Indizes und schreiben Daten in den Storage.
- Peers sind Thick Clients, die eine JVM-Bibliothek enthalten, Transaktionen einreichen, Abfragen ausführen und Ergebnisse cachen.
- Clients sind Thin Clients, die Transaktionen und Abfragen an einen Peer-Server weiterleiten.
- Im Log wird jede Transaktion in zeitlicher Reihenfolge angehängt.
- Gespeichert wird als persistenter und unveränderlicher Baum in Datenspeichern wie Cassandra oder DynamoDB.
- Mit Sequential CaS-Operationen wird eine globale Transaktionsreihenfolge garantiert.
- Peers sind direkt mit dem Storage und den Transactors verbunden.
# 1.2 Transaktionsmodell
- Datomic hat ein einzigartiges Transaktionsmodell.
- Lese- und Schreibpfad sind strikt getrennt.
- Lesevorgänge erhalten einen unveränderlichen Zustand der Datenbank.
- Schreibtransaktionen werden als geordnete Liste von Operationen dargestellt.
- Transaktionsfunktionen lesen den Datenbankzustand und geben eine neue Menge von Operationen zurück.
- Transaktionsfunktionen geben dem Aufrufer keine Werte zurück.
- Transaktionen liefern nur Effekte zurück.
- NuBank bietet mit Datomic Finanzdienstleistungen an.
# 1.3 Konsistenz
- Es werden ACID-Transaktionen beworben, mit klaren Zusagen zum Konsistenzmodell und zu Haltbarkeitsgarantien.
- Transaktionen werden als einzelner atomarer Schreibvorgang gespeichert.
- Alle Peers sehen die bis zu einem bestimmten Zeitpunkt abgeschlossenen Transaktionen.
- Serializable-Transaktionen werden garantiert.
- Mit d/sync kann der neueste Zustand synchronisiert werden.
- Das System ist als Single-Writer-System konzipiert, dennoch können mehrere Transactors gleichzeitig laufen.
# 2 Testdesign
- Mit der Jepsen-Testbibliothek wurde eine Datomic-Testsuite entworfen.
- Datomic Pro 1.0.7075 wurde auf einem Debian-Bookworm-Node-Cluster installiert.
- DynamoDB-Tabellen wurden auf AWS provisioniert.
- Die Tests wurden auf verschiedenen Nodes ausgeführt, darunter Transactors und Peers.
- Über die HTTP-API wurden die Operationen der Testsuite ausgeführt.
- Es wurden verschiedene Fehler injiziert, darunter Netzwerkpartitionen und Garbage Collection.
- Transactors wurden über systemd-Services neu gestartet.
# 2.1 Listen erweitern
- Mit dem Elle-Transaktionsprüfer wurden Operationen zum Erweitern von Listen entworfen.
- Jede Liste wird durch einen Primärschlüssel identifiziert.
- Es werden Transaktionen mit Lese- und Append-Operationen ausgeführt.
- Datomic speichert mehrwertige Attribute als ungeordnete Mengen.
- Über Transaktionsfunktionen werden Read-Write-Transaktionen ausgedrückt.
# 2.2 Listen erweitern mit CaS
- Mit der Funktion db/cas werden konkurrierende Aktualisierungen eines Attributs kontrolliert.
- Zur Sicherstellung von Snapshot Isolation wird ein CaS-Muster verwendet.
- Jede Liste wird als einwertiger, kommagetrennter String kodiert.
# 2.3 Interne Konsistenz
- Es wurden Operationen entworfen, um die interne Konsistenz zu messen.
- Dazu gehören Transaktionen, die Attributwerte mehrfach ändern oder Fakten hinzufügen und entfernen.
- Außerdem werden CaS-Operationen mehrfach ausgeführt.
# 2.4 Genehmigung
- Es wurde eine Zustandsmaschine entworfen, um Genehmigung und Ablehnung zu simulieren.
- Die Funktionen für Genehmigung und Ablehnung prüfen jeweils den Zustand und brechen die Transaktion ab.
# 3 Ergebnisse
- Es wurde kein Verhalten gefunden, das den zentralen Sicherheitsbehauptungen von Datomic widerspricht.
- Transaktionen scheinen in einer totalen Reihenfolge ausgeführt zu werden.
- Lesetransaktionen mit (d/sync conn) stimmen mit der Echtzeitreihenfolge überein.
- Die interne Konsistenz stimmt mit der Dokumentation von Datomic überein, unterscheidet sich aber von üblichem Datenbankverhalten.
# 3.1 Interne Konsistenz
- Die meisten Datenbanken bieten innerhalb einer Transaktion serielle Ausführungssemantik.
- Datomic behandelt alle Operationen innerhalb einer Transaktion als gleichzeitig ausgeführt.
- Transaktionsfunktionen beobachten nur den Datenbankzustand zum Startzeitpunkt der Transaktion.
- Bei Konflikten bei Attributen mit einfacher Kardinalität wird die Transaktion abgebrochen.
# 3.2 Virtuelle Write Skew
- Da Transaktionsfunktionen parallel ausgeführt werden, können einzeln korrekte Funktionen gemeinsam zu falschen Ergebnissen führen.
- Wenn die Funktionen für Genehmigung und Ablehnung in derselben Transaktion aufgerufen werden, können Genehmigung und Ablehnung gleichzeitig eintreten.
- Das entspricht der Dokumentation von Datomic, kann für Nutzer aber überraschend sein.
# 3.3 Entitätsprädikate
- Mit Entitätsprädikaten lassen sich Invarianten der Datenbank garantieren.
- Es gibt verschiedene Constraints, darunter Typen, Eindeutigkeit und beliebige Prädikate.
- Entitätsprädikate prüfen den Gesamtzustand der Datenbank, um zu entscheiden, ob eine Transaktion zugelassen wird.
- Durch das Hinzufügen von Entitätsprädikaten zu den Funktionen für Genehmigung und Ablehnung werden Invarianten garantiert.
Meinung von GN⁺
- Datomic ist als temporale Datenbank sehr nützlich für Record Systems wie Finanzdienstleistungen, da sich frühere Datenzustände leicht abfragen lassen.
- Das Modell der parallelen Ausführung von Transaktionsfunktionen steigert die Leistung, kann für Nutzer aber ungewohnt sein.
- Mit Entitätsprädikaten lassen sich komplexe Constraints zur Datenintegrität leicht umsetzen.
- Der Einsatz bei großen Finanzdienstleistern wie NuBank belegt Stabilität und Skalierbarkeit.
- Das einzigartige Transaktionsmodell von Datomic erfordert ein anderes Denken als bei klassischen Datenbanken und kann daher eine Lernkurve mit sich bringen.
1 Kommentare
Hacker-News-Kommentare
Zusammenfassung der Hacker-News-Kommentare
Interessante Diskussion und verbesserte Dokumentation
Verständnis des Transaktionsverhaltens von Datomic
Der Wert des Datomic-Berichts
Die Herkunft des Namens Jepsen
Hilfreich beim Schreiben von Clojure-Programmen
Aufbau eines Datomic-ähnlichen Datastores
Das Datenmodell von Datomic
Präzisere Dokumentation bei Datomic
Vorteile des Single-Thread-Designs
Die Transaktionseigenschaften von Datomic