Pourquoi les bases de données SQL utilisent-elles un journal à écriture différée sur un journal de commandes?

J’ai lu sur le journal de commandes de Voltdb. Le journal de commandes enregistre les appels de transaction au lieu de chaque changement de ligne, comme dans un journal à écriture différée. En enregistrant uniquement l’invocation, les journaux de commandes sont réduits au ssortingct minimum, limitant ainsi l’impact des E / S sur les performances.

Quelqu’un peut-il expliquer la théorie de la firebase database expliquant pourquoi Voltdb utilise un journal de commandes et pourquoi les bases de données SQL standard telles que Postgres, MySQL, SQLServer, Oracle utilisent un journal à écriture différée?

Je pense qu’il est préférable de reformuler:

Pourquoi la nouvelle VoltDB dissortingbuée utilise-t-elle un journal de commandes sur le journal d’écriture anticipée?

Faisons une expérience et imaginons que vous allez écrire votre propre implémentation de stockage / firebase database. Sans aucun doute, vous êtes suffisamment avancé pour résumer un système de fichiers et utiliser le stockage en mode bloc avec quelques optimisations supplémentaires.

Une terminologie de base:

  • Etat: informations stockées à un moment donné
  • Commande: directive sur le stockage pour changer son état

Ainsi, votre firebase database peut ressembler à ceci:

entrer la description de l'image ici

La prochaine étape consiste à exécuter une commande:

entrer la description de l'image ici

Veuillez noter plusieurs aspects importants:

  1. Une commande peut affecter de nombreuses entités stockées, de nombreux blocs se saliront
  2. L’état suivant est une fonction de l’état actuel et de la commande

Certains états intermédiaires peuvent être ignorés, car il suffit d’avoir une chaîne de commandes à la place.

entrer la description de l'image ici

Enfin, vous devez garantir l’intégrité des données.

  • Write-Ahead Logging – le concept central est que les modifications d’ état doivent être enregistrées avant toute mise à jour importante du stockage permanent. Suivant notre idée, nous pouvons enregistrer les modifications incrémentielles pour chaque bloc.
  • Enregistrement de commande – le concept central consiste à enregistrer uniquement la commande , qui est utilisée pour produire l’état.

entrer la description de l'image ici

Il y a des avantages et des inconvénients pour les deux approches. Le journal Write-Ahead contient toutes les données modifiées, le journal des commandes nécessite un traitement supplémentaire, mais rapide et léger.

VoltDB: Enregistrement et récupération de commandes

La clé de la journalisation des commandes est de consigner les invocations, et non les conséquences, des transactions. En enregistrant uniquement l’invocation, les journaux de commandes sont réduits au ssortingct minimum, limitant ainsi l’impact des E / S sur les performances.

Notes complémentaires

SQLite: journalisation en écriture

Le journal de restauration traditionnel fonctionne en écrivant une copie du contenu de firebase database inchangé d’origine dans un fichier journal de restauration distinct, puis en écrivant les modifications directement dans le fichier de firebase database.

Un COMMIT se produit lorsqu’un enregistrement spécial indiquant une validation est ajouté au WAL. Ainsi, un COMMIT peut se produire sans jamais écrire dans la firebase database d’origine, ce qui permet aux lecteurs de continuer à fonctionner à partir de la firebase database originale non modifiée, alors que des modifications sont simultanément commises dans le WAL.

PostgreSQL: journalisation en écriture (WAL)

L’utilisation de WAL entraîne une réduction significative du nombre d’écritures sur disque, car seul le fichier journal doit être vidé sur le disque pour garantir qu’une transaction est validée plutôt que chaque fichier de données modifié par la transaction.

Le fichier journal est écrit de manière séquentielle et le coût de la synchronisation du journal est donc bien inférieur au coût de vidage des pages de données. Cela est particulièrement vrai pour les serveurs gérant de nombreuses petites transactions touchant différentes parties du magasin de données. De plus, lorsque le serveur traite de nombreuses petites transactions concurrentes, une seule synchronisation du fichier journal peut suffire à valider de nombreuses transactions.

Conclusion

Enregistrement de commandes:

  1. est plus rapide
  2. a un encombrement inférieur
  3. procédure plus lourde “Replay”
  4. nécessite un instantané fréquent

Write Ahead Logging est une technique pour fournir de l’atomicité. De meilleures performances de journalisation des commandes devraient également améliorer le traitement des transactions. Bases de données sur 1 pied

entrer la description de l'image ici

Confirmation

Blog VoltDB: Introduction à la journalisation des commandes VoltDB

L’un des avantages de la journalisation des commandes via la journalisation de style ARIES est qu’une transaction peut être consignée avant le début de l’exécution au lieu d’exécuter la transaction et d’attendre que les données du journal soient vides sur le disque. Un autre avantage est que le débit IO nécessaire pour un journal de commandes est limité par le réseau utilisé pour relayer les commandes et, dans le cas de Gig-E, ce débit peut être satisfait par des disques de marchandise bon marché.

Il est important de se rappeler que VoltDB est dissortingbué de par sa nature. Les transactions sont donc un peu difficiles à gérer et l’impact sur les performances est perceptible.

VoltDB Blog: Nouvelle fonction de journalisation des commandes de VoltDB

Le journal de commandes dans VoltDB consiste en des invocations de procédures stockées et leurs parameters. Un journal est créé sur chaque nœud et chaque journal est répliqué, car tout le travail est répliqué sur plusieurs nœuds. Cela se traduit par un journal de commandes répliqué pouvant être supprimé au moment de la relecture. Les transactions VoltDB étant fortement ordonnées, le journal des commandes contient également des informations de commande. Ainsi, la relecture peut avoir lieu dans l’ordre exact dans lequel les transactions d’origine ont été exécutées, avec l’isolation complète des transactions qu’offre VoltDB. Comme les appels eux-mêmes sont souvent plus petits que les données modifiées et peuvent être consignés avant d’être validés, cette approche a un effet très modeste sur les performances. Cela signifie que les utilisateurs de la VoltDB peuvent obtenir le même type de performances stratosphériques, avec des garanties de durabilité supplémentaires.

D’après la description de Postgres, écrivez à l’avance http://www.postgresql.org/docs/9.1/static/wal-intro.html et le journal de commandes de VoltDB (que vous avez référencé), je ne vois aucune différence. Il semble être le concept identique avec un nom différent.

Les deux ne synchronisent que le fichier journal sur le disque mais pas les données afin que les données puissent être récupérées en réexécutant le fichier journal.

La section 10.4 de VoltDB explique que leur version de communauté ne contient pas de journal de commandes, de sorte qu’elle ne réussirait pas le test ACID. Même dans l’édition d’entreprise, je ne vois pas les détails de leur isolation de transaction (par exemple, http://www.postgresql.org/docs/9.1/static/transaction-iso.html ) pour que je sois à l’aise avec le fait que VoltDB soit aussi sérieux comme Postges.

La façon dont je le lis est la suivante: (Ma propre opinion)

La journalisation des commandes, telle que décrite ici, enregistre uniquement les transactions au fur et à mesure qu’elles se produisent et non pas ce qui se passe à l’intérieur de celles-ci. Ok, alors voici le morceau magique … Si vous voulez revenir en arrière, vous devez restaurer le dernier instantané, puis vous pouvez rejouer toutes les transactions qui ont été appliquées après (décrit dans le lien ci-dessus). Si efficacement vous restaurez une sauvegarde et réappliquez tous vos scripts, seul VoltDB l’a automatisé pour vous.

La vraie différence que je vois avec cela est que vous ne pouvez pas revenir à un point dans le temps de manière logique, comme avec un journal de transactions normal. Les journaux de transactions normaux (MSSQL, MySQL, etc.) peuvent facilement revenir à un point dans le temps (dans la configuration correcte) car les transactions peuvent être «inversées».

Une question interressante se pose – se référant au pos by pedz, passera-t-il toujours le test ACID même avec le journal de commandes? Fera plus de lecture …

Ajouter: A fait plus de lecture et je ne pense pas que ce soit une bonne idée pour les bases de données transactionnelles très grandes et occupées. Un instantané de firebase database est automatiquement créé lorsque les journaux de commandes se remplissent, pour vous sauver des gros journaux de transactions et de l’OE utilisé pour cela? Vous allez devoir encaisser de gros montants d’E / S avec vos instantanés effectués à intervalles réguliers et vous utilisez également votre mémoire au bord du gouffre. Alos, à mon avis, vous perdez votre capacité à revenir facilement à un moment avant le dernier instantané automatique – pensez que cela sera très difficile à gérer.

Je préfère m’en tenir aux journaux de transactions pour les systèmes transactionnels. C’est prouvé et ça marche.

C’est vraiment juste une question de granularité. Ils enregistrent les opérations au niveau des procédures stockées, la plupart des SGBDR se connectent au niveau des instructions individuelles (et «inférieures»). En outre, leur présentation concernant les avantages est un peu un hareng rouge:

L’un des avantages de la journalisation des commandes via la journalisation de style ARIES est qu’une transaction peut être consignée avant le début de l’exécution au lieu d’exécuter la transaction et d’attendre que les données du journal soient vides sur le disque.

Ils doivent attendre que la commande soit enregistrée aussi, c’est juste un enregistrement beaucoup plus petit.

Si je ne me trompe pas, l’unité de transaction de VoltDB est une procédure stockée. Les SGBDR traditionnels doivent généralement prendre en charge les transactions ad hoc contenant un nombre quelconque d’instructions, de sorte que la journalisation au niveau de la procédure est hors de question. De plus, les procédures stockées ne sont souvent pas vraiment déterministes dans les SGBDR traditionnels (c.-à-d. Que les parameters + log + données donnent toujours le même résultat), ce qui devrait être le cas.

Néanmoins, les améliorations de performance seraient substantielles pour ce modèle de SGBDR contraint.

Avec WAL, les lecteurs lisent des pages à partir de journaux non purgés. Aucune modification n’est apscope à la firebase database principale. Avec la journalisation des commandes, vous ne pouvez pas lire le journal des commandes.

La journalisation des commandes est donc très différente. VoltDB utilise la journalisation des commandes pour créer des points de récupération et assurer sa durabilité, certes – mais il écrit en temps réel sur le principal magasin de la firebase database (db store), avec tous les problèmes de locking, etc.