web-dev-qa-db-fra.com

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

J'ai lu sur le command log de Voltdb . Le journal de commandes enregistre les appels de transaction au lieu de chaque changement de ligne comme dans un journal à écriture anticipée. En enregistrant uniquement l'invocation, les journaux de commandes sont réduits au minimum, ce qui limite l'impact des E/S du disque sur les performances.

Quelqu'un peut-il expliquer la théorie de la base de données sur laquelle 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 anticipée?

45
user782220

Je pense qu'il vaut mieux reformuler: 

Pourquoi la nouvelle VoltDB distribuée utilise-t-elle un journal de commandes sur un journal à écriture anticipée?

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

Quelques terminologies de base:

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

Donc, votre base de données peut ressembler à ceci:

enter image description here

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

enter image description here

Veuillez noter plusieurs aspects importants:

  1. Une commande peut affecter de nombreuses entités stockées, ainsi de nombreux blocs seront salis
  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.

enter image description here

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

  • Journalisation Write-Ahead - le concept central est que les modifications de State doivent être consignées avant toute mise à jour importante en stockage permanent. Suivant notre idée, nous pouvons enregistrer les modifications incrémentielles pour chaque bloc.
  • Command Logging - le concept central consiste à ne consigner que Command, utilisé pour produire l'état.

enter image description here

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 de commandes nécessitera un traitement supplémentaire, mais rapide et léger. 

VoltDB: enregistrement et récupération des commandes

La clé de la journalisation des commandes est qu’elle enregistre les appels, pas le conséquences, des transactions. En enregistrant uniquement l'invocation, les journaux de commandes sont réduits au strict minimum, ce qui limite l’impact de l’entrée/sortie du disque avoir sur la performance.

Notes complémentaires

SQLite: journalisation en écriture anticipée

Le journal de restauration traditionnel fonctionne en écrivant une copie du fichier contenu de base de données d'origine non modifié dans un journal d'annulation différent fichier puis en écrivant les modifications directement dans le fichier de base de données.

Un COMMIT se produit lorsqu'un enregistrement spécial indiquant une validation est ajouté à la WAL. Ainsi, une COMMIT peut se produire sans jamais écrire au base de données originale, qui permet aux lecteurs de continuer à fonctionner à partir du fichier base de données originale non modifiée alors que les modifications sont simultanément effectuées commis dans le WAL.

PostgreSQL: Enregistrement anticipé (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 séquentiellement, et ainsi. Le coût de la synchronisation du journal est bien inférieur au coût du vidage du fichier pages de données. Cela est particulièrement vrai pour les serveurs traitant de nombreux petits transactions touchant différentes parties du magasin de données. En outre, lorsque le serveur traite de nombreuses petites transactions simultanées, une fsync du fichier journal peut suffire pour commettre de nombreuses transactions. 

Conclusion

Enregistrement de commande:

  1. est plus rapide
  2. a une empreinte inférieure
  3. a plus lourd "Replay" procédure
  4. nécessite des clichés fréquents

Write Ahead Logging est une technique permettant de générer l'atomicité. De meilleures performances de journalisation des commandes devraient également améliorer le traitement des transactions. Bases de données sur 1 pied

enter image description here

Confirmation

Blog VoltDB: Introduction à la journalisation des commandes VoltDB

Un des avantages de la journalisation de commandes par rapport à la journalisation de style ARIES est qu’il s’agit d’un La transaction peut être enregistrée avant le début de l'exécution au lieu de l'exécution la transaction et attend que les données du journal soient vidées sur le disque. Un autre L’avantage est que le débit IO nécessaire pour un journal de commandes est de dé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 base bon marché.

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

VoltDB Blog: La nouvelle fonctionnalité de journalisation des commandes de VoltDB

Le journal des commandes dans VoltDB est constitué d’appels de procédures stockées et de leurs paramètres. 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. Ce aboutit à un journal de commandes répliqué qui peut être dédoublé lors de la relecture temps. Étant donné que les transactions VoltDB sont fortement ordonnées, la commande Le journal contient également des informations sur les commandes. Ainsi, la relecture peut avoir lieu dans l'ordre exact où les transactions initiales ont été exécutées, avec le .__ complet. isolation de transaction offre VoltDB. Depuis les invocations elles-mêmes sont souvent plus petites que les données modifiées et peuvent être enregistrées avant le ils sont engagés, cette approche a un effet très modeste sur performance. Cela signifie que les utilisateurs de VoltDB peuvent réaliser le même type de nombre de performances stratosphériques, avec une durabilité supplémentaire assurances.

75
Renat Gilmanov

D'après la description de Postgres 'write ahead http://www.postgresql.org/docs/9.1/static/wal-intro.html et le journal des commandes de VoltDB (auquel vous avez fait référence), je ne vois pas beaucoup de différence du tout. Il semble que ce soit le concept identique avec un nom différent.

Les deux synchronisent uniquement le fichier journal sur le disque, mais pas les données, afin que les données puissent être récupérées en relisant le fichier journal.

La section 10.4 de VoltDB explique que la version de leur communauté n’a pas de journal de commandes et ne réussira donc pas le test ACID. Même dans l'édition entreprise, je ne vois pas les détails de l'isolation de leur transaction (par exemple, http://www.postgresql.org/docs/9.1/static/transaction-iso.html ) nécessaires pour me mettre à l'aise. que VoltDB est aussi grave que Postges.

1
pedz

La façon dont je l'ai lu est la suivante: (Mon opinion personnelle)

La journalisation des commandes, telle que décrite ici, enregistre uniquement les transactions au fur et à mesure qu'elles se produisent, et non ce qui s'y passe. Ok, voici donc la pièce magique ... Si vous voulez revenir en arrière, vous devez restaurer le dernier instantané et vous pouvez alors rejouer toutes les transactions qui ont été appliquées par la suite (décrit dans le lien ci-dessus). Si bien que 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 logiquement à un point dans le temps comme avec un journal de transaction 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 très intéressante se pose: en se référant au pos de pedz, le test ACID réussira-t-il toujours, même avec le journal des commandes? Fera un peu plus de lecture ...

Ajouter: Vous avez lu davantage et je ne pense pas que ce soit une bonne idée pour les bases de données transactionnelles très volumineuses et occupées. Un instantané de base de données est automatiquement créé lorsque les journaux de commandes sont pleins, afin de vous protéger des journaux de transactions volumineux et que le IO utilisé à cette fin? Vous allez générer des montants IO importants avec vos instantanés étant effectués à un intervalle régulier et vous utilisez également votre mémoire au bord du précipice. Alos, à mon avis, vous perdez votre capacité à revenir facilement à un point dans le temps précédant le dernier instantané automatique - pensez que cela va devenir 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.

0
Charl

C'est vraiment juste une question de granularité. Ils enregistrent les opérations au niveau des procédures stockées, la plupart des SGBDR enregistrent au niveau des instructions individuelles (et «inférieures»). En outre, leur texte sur les avantages est un peu un piège:

Un des avantages de la journalisation de commandes par rapport à la journalisation de style ARIES est qu’il s’agit d’un La transaction peut être enregistrée avant le début de l'exécution au lieu de l'exécution la transaction et attend que les données du journal soient vidées sur le disque.

Ils doivent également attendre que la commande soit enregistrée, il s'agit simplement d'un enregistrement beaucoup plus petit.

Si je ne me trompe pas, l'unité de transaction de VoltDB est un processus stocké. Les SGBDR traditionnels doivent généralement prendre en charge les transactions ad-hoc contenant un nombre illimité d'instructions. Par conséquent, 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 classiques (c’est-à-dire que params + log + data produisent toujours le même résultat), ce qui devrait être le cas.

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

0
corsair

Avec WAL, les lecteurs lisent des pages à partir de journaux non vidés. Aucune modification n'est apportée à la base de données principale. Avec la journalisation des commandes, vous ne pouvez pas lire le journal de 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 la durabilité, mais il écrit en temps réel dans la base de données principale (RAM) avec tous les problèmes de verrouillage, etc. 

0
Erik Aronesty