1 points par GN⁺ 2024-05-17 | 1 commentaires | Partager sur WhatsApp

Datomic : une base de données généraliste pour les systèmes d’enregistrement

# Contexte de Datomic

  • Datomic est une base de données généraliste destinée aux systèmes d’enregistrement.
  • L’état de la base est représenté par des triplets [entity, attribute, value] (EAV), appelés datoms.
  • Le schéma contrôle le type et la cardinalité des attributs.
  • C’est une base de données temporelle qui modélise explicitement le temps.
  • Chaque transaction est identifiée par un horodatage logique t et un temps d’horloge murale txInstant.
  • Les transactions peuvent ajouter ou retirer des datoms.
  • Tous les datoms conservent une référence à la transaction.
  • La base de données est un ensemble en croissance continue de ces tuples.

# Fonctionnalités de Datomic

  • Les utilisateurs peuvent demander un instantané de la base à un temps logique ou un temps d’horloge murale.
  • Il est possible de consulter l’historique complet de la base.
  • Les requêtes sont possibles via une API de style Datalog, une API déclarative de navigation dans le graphe et le type de données Entity de style ODM.
  • Il existe deux versions : Datomic Pro et Datomic Cloud.

# 1.1 Architecture

  • Datomic Pro est composé de plusieurs services coopérants.
  • Les Transactors exécutent les transactions d’écriture, maintiennent les index et écrivent les données dans le stockage.
  • Les Peers sont des clients lourds qui embarquent une bibliothèque JVM pour soumettre des transactions, exécuter des requêtes et mettre les résultats en cache.
  • Les Clients sont des clients légers qui transmettent les transactions et requêtes à un peer server.
  • Chaque transaction est ajoutée au log dans l’ordre chronologique.
  • Les données sont stockées sous forme d’arbres persistants et immuables dans un stockage comme Cassandra ou DynamoDB.
  • Un ordre global des transactions est garanti via des opérations Sequential CaS.
  • Les Peers se connectent directement au stockage et aux transactors.

# 1.2 Modèle transactionnel

  • Datomic possède un modèle transactionnel original.
  • Il sépare strictement les chemins de lecture et d’écriture.
  • Les lectures obtiennent un état immuable de la base.
  • Les transactions d’écriture sont représentées comme une liste ordonnée d’opérations.
  • Les fonctions de transaction lisent l’état de la base puis renvoient un nouvel ensemble d’opérations.
  • Les fonctions de transaction ne renvoient pas de valeur à l’appelant.
  • Les transactions ne renvoient que leurs effets.
  • NuBank utilise Datomic pour fournir des services financiers.

# 1.3 Cohérence

  • Le système met en avant des transactions ACID et promet clairement un modèle de cohérence ainsi que des garanties de durabilité.
  • Les transactions sont stockées comme une écriture atomique unique.
  • Tous les peers voient les transactions terminées jusqu’à un instant donné.
  • Il garantit des transactions Serializable.
  • Il est possible de synchroniser l’état le plus récent via d/sync.
  • Le système est conçu comme un système à écriture unique, même si plusieurs transactors peuvent fonctionner en même temps.

# 2 Conception des tests

  • La suite de tests Datomic a été conçue à l’aide de la bibliothèque de test Jepsen.
  • Datomic Pro 1.0.7075 a été installé sur un cluster de nœuds Debian Bookworm.
  • Une table DynamoDB a été provisionnée sur AWS.
  • Les tests ont été exécutés sur différents nœuds, y compris des Transactors et des Peers.
  • Les opérations de la suite de tests ont été effectuées via une API HTTP.
  • Diverses pannes ont été injectées, notamment des partitions réseau et du Garbage Collection.
  • Des services systemd ont été utilisés pour redémarrer les transactors.

# 2.1 Ajout à une liste

  • Une opération d’ajout à une liste a été conçue avec le vérificateur transactionnel Elle.
  • Chaque liste est identifiée par une clé primaire.
  • Les transactions incluent des opérations de lecture et d’ajout.
  • Datomic stocke les attributs multivalués comme des ensembles non ordonnés.
  • Des fonctions de transaction sont utilisées pour exprimer les transactions lecture-écriture.

# 2.2 Ajout à une liste avec CaS

  • La fonction db/cas est utilisée pour contrôler les mises à jour concurrentes d’un attribut.
  • Un modèle CaS est utilisé pour garantir l’isolation par instantané.
  • Chaque liste est encodée comme une chaîne à valeur unique séparée par des virgules.

# 2.3 Cohérence interne

  • Des opérations ont été conçues pour mesurer la cohérence interne.
  • Elles incluent des transactions qui modifient plusieurs fois la valeur d’un attribut, ou ajoutent et retirent des faits.
  • Elles exécutent aussi plusieurs opérations CaS.

# 2.4 Approbation

  • Une machine à états a été conçue pour simuler l’approbation et le rejet.
  • Les fonctions d’approbation et de rejet vérifient chacune l’état correspondant puis interrompent la transaction.

# 3 Résultats

  • Aucun comportement violant les principales garanties de sûreté de Datomic n’a été observé.
  • Les transactions semblent s’exécuter comme si elles suivaient un ordre total.
  • Les transactions de lecture utilisant (d/sync conn) sont cohérentes avec l’ordre en temps réel.
  • La cohérence interne correspond à la documentation de Datomic, mais diffère du comportement habituel des bases de données.

# 3.1 Cohérence interne

  • La plupart des bases de données offrent une sémantique d’exécution sérielle à l’intérieur d’une transaction.
  • Datomic traite toutes les opérations d’une transaction comme étant exécutées simultanément.
  • Les fonctions de transaction n’observent que l’état de la base au début de la transaction.
  • En cas de conflit sur un attribut à cardinalité unique, la transaction est annulée.

# 3.2 Distorsion d’écriture virtuelle

  • Comme les fonctions de transaction sont exécutées simultanément, des fonctions correctes individuellement peuvent produire un résultat incorrect lorsqu’elles s’exécutent ensemble.
  • Si les fonctions d’approbation et de rejet sont appelées dans la même transaction, une approbation et un rejet peuvent survenir en même temps.
  • Cela est conforme à la documentation de Datomic, mais peut surprendre les utilisateurs.

# 3.3 Prédicats d’entité

  • Les prédicats d’entité permettent de garantir les invariants de la base de données.
  • Ils fournissent diverses contraintes, notamment sur le type, l’unicité et des prédicats arbitraires.
  • Les prédicats d’entité examinent l’état global de la base pour décider si une transaction doit être autorisée.
  • L’ajout de prédicats d’entité aux fonctions d’approbation et de rejet permet de garantir les invariants.

L’avis de GN⁺

  • Datomic est une base de données temporelle, très utile pour les systèmes d’enregistrement comme les services financiers, car elle permet d’interroger facilement les états passés des données.
  • Le modèle d’exécution simultanée des fonctions de transaction améliore les performances, mais peut sembler inhabituel aux utilisateurs.
  • Les prédicats d’entité permettent d’implémenter facilement des contraintes complexes d’intégrité des données.
  • Son utilisation par de grands services financiers comme NuBank valide sa stabilité et sa scalabilité.
  • Le modèle transactionnel original de Datomic exige une manière de penser différente de celle des bases de données traditionnelles, ce qui peut impliquer une courbe d’apprentissage.

1 commentaires

 
GN⁺ 2024-05-17
Avis Hacker News

Résumé d’un recueil de commentaires Hacker News

  • Discussion intéressante et amélioration de la documentation

    • La discussion pendant le travail a été très intéressante. Il était aussi surprenant que Jepsen n’ait pas trouvé de bug critique. Le fait d’avoir clarifié la documentation et les comportements anormaux intentionnels a été un résultat utile. C’était un exercice bénéfique qui inspire confiance pour exploiter une banque utilisant Datomic.
  • Comprendre le comportement transactionnel de Datomic

    • C’était la première fois que je lisais en profondeur un rapport Jepsen, et j’ai apprécié l’explication claire du comportement transactionnel de Datomic. J’ai réalisé que je ne comprenais pas bien ses différences avec une base de données SQL. La structure des transactions de Datomic et le changement de nom de certains éléments ont retenu l’attention.
  • La valeur du rapport sur Datomic

    • C’est un rapport très détaillé et une excellente analyse d’une bonne base de données. Je suis aussi heureux que la documentation soit devenue plus claire et ait été mise à jour. Cela m’a également fait penser qu’Apple devrait commander une analyse Jepsen de FoundationDB.
  • L’origine du nom Jepsen

    • Le nom Jepsen vient de la chanteuse Carly Rae Jepsen. Je trouve que c’est un nom parfait pour la recherche sur les systèmes distribués.
  • Une aide pour écrire des programmes Clojure

    • C’est toujours un excellent travail. J’aime lire ce type de contenu pour en apprendre davantage sur ces systèmes et glaner de petites informations utiles pour écrire des programmes Clojure.
  • Construire un datastore de type Datomic

    • Je construis récemment un datastore de type Datomic, donc ce rapport me semble utile. J’ai aussi apprécié l’analyse de MongoDB, et je recommande de consulter également celles sur Redis, RethinkDB, etc.
  • Le modèle de données de Datomic

    • Le modèle de données de Datomic est intuitif si l’on connaît les triple stores / RDF. Pourtant, cela est rarement mentionné dans la documentation ou les discussions en ligne. Je me demande si c’est parce que les gens ne sont pas familiers avec ces concepts, ou parce que le lien avec le web sémantique pourrait prêter à confusion.
  • Clarification de la documentation de Datomic

    • Jepsen a clarifié les situations de violation d’invariants, mais l’approche de Datomic semble surtout avoir consisté à clarifier la documentation. On dirait que l’équipe Datomic considère ces violations comme des erreurs utilisateur.
  • Les avantages d’une conception mono-thread

    • Le choix de traiter les écritures sur un seul thread s’est révélé efficace. Datomic est le produit d’une excellente conception, et j’aimerais l’utiliser de nouveau.
  • Les caractéristiques transactionnelles de Datomic

    • Je n’ai pas beaucoup utilisé Datomic, mais il n’est pas surprenant que les transactions soient fondamentalement traitées par lots. Le système fonctionne sur un seul thread, ce qui réduit les conditions de concurrence ; c’est plus lent par conception, mais sûr.