1 Punkte von GN⁺ 2024-05-17 | 1 Kommentare | Auf WhatsApp teilen

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

 
GN⁺ 2024-05-17
Hacker-News-Kommentare

Zusammenfassung der Hacker-News-Kommentare

  • Interessante Diskussion und verbesserte Dokumentation

    • Die Diskussion während des Prozesses war sehr interessant. Es war auch überraschend, dass Jepsen keinen schwerwiegenden Bug gefunden hat. Dass die Dokumentation und das beabsichtigte abnormale Verhalten klarer gemacht wurden, war ein nützliches Ergebnis. Es war eine hilfreiche Übung, die Vertrauen in den Betrieb einer Bank mit Datomic gibt.
  • Verständnis des Transaktionsverhaltens von Datomic

    • Ich habe zum ersten Mal einen Jepsen-Bericht gründlich gelesen, und mir gefiel die klare Erklärung des Transaktionsverhaltens von Datomic. Dabei wurde mir bewusst, dass ich die Unterschiede zu SQL-Datenbanken nicht gut verstanden hatte. Die Transaktionsstruktur von Datomic und die Umbenennung der Begriffe fielen auf.
  • Der Wert des Datomic-Berichts

    • Ein sehr detaillierter Bericht und eine hervorragende Analyse einer guten Datenbank. Es freut mich auch, dass die Dokumentation klarer und aktualisiert wurde. Es kam auch der Gedanke auf, dass Apple eine Jepsen-Analyse für FoundationDB in Auftrag geben sollte.
  • Die Herkunft des Namens Jepsen

    • Der Name Jepsen stammt von der Sängerin Carly Rae Jepsen. Ich finde, das ist ein perfekter Name für die Forschung an verteilten Systemen.
  • Hilfreich beim Schreiben von Clojure-Programmen

    • Wie immer großartige Arbeit. Ich lese das gern, um etwas über solche Systeme zu lernen und kleine hilfreiche Informationen für das Schreiben von Clojure-Programmen mitzunehmen.
  • Aufbau eines Datomic-ähnlichen Datastores

    • Ich baue gerade einen Datomic-ähnlichen Datastore auf, daher dürfte dieser Bericht nützlich sein. Die Analyse zu MongoDB hat mir ebenfalls gefallen, und ich empfehle auch, sich die Analysen zu Redis, RethinkDB und anderen anzusehen.
  • Das Datenmodell von Datomic

    • Das Datenmodell von Datomic ist intuitiv, wenn man mit Triple Stores/RDF vertraut ist. In der Dokumentation oder in Online-Diskussionen wird das jedoch oft nicht erwähnt. Ich frage mich, ob das daran liegt, dass Menschen mit diesen Konzepten nicht vertraut sind, oder daran, dass die Verbindung zum Semantic Web Verwirrung stiften könnte.
  • Präzisere Dokumentation bei Datomic

    • Jepsen hat Situationen mit Verletzungen der Unveränderlichkeit klarer gemacht, aber der Ansatz von Datomic scheint sich darauf zu konzentrieren, die Dokumentation zu präzisieren. Das Datomic-Team scheint solche Verletzungen als Benutzerfehler zu betrachten.
  • Vorteile des Single-Thread-Designs

    • Die Designentscheidung, Schreibvorgänge in einem einzelnen Thread zu verarbeiten, war effektiv. Datomic ist das Produkt eines großartigen Designs, und ich würde es gern wieder verwenden.
  • Die Transaktionseigenschaften von Datomic

    • Ich habe Datomic nicht sehr viel verwendet, aber es überrascht mich nicht, dass Transaktionen im Grunde Batch-Verarbeitung sind. Es läuft in einem einzelnen Thread, hat dadurch weniger Race Conditions und ist vom Design her langsam, aber sicher.