Pourquoi les bases de données SQL utilisent-elles un log en écriture-ahead sur un log de commande?

j'ai lu à propos de Voltdb commande log. La commande log enregistre les invocations de transaction au lieu de chaque changement de ligne comme dans un journal en écriture. En n'enregistrant que l'invocation, les journaux de commandes sont maintenus à un strict minimum, limitant l'impact que l'entrée/sortie du disque aura sur la performance.

est-ce que quelqu'un peut expliquer la théorie de la base de données derrière pourquoi Voltdb utilise un journal de commande et pourquoi les bases de données SQL standard telles que Postgres, MySQL, SQLServer, Oracle utiliser une écriture-ahead journal?

44
demandé sur user782220 2013-01-06 14:19:18

5 réponses

je pense qu'il est préférable de reformuler:

Pourquoi ne nouveau distribué VoltDB utiliser une commande du journal sur write-ahead log?

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 suffisamment avancé pour abstraire un système de fichiers et utiliser le stockage par blocs avec quelques optimisations supplémentaires.

Quelques terminologie de base:

  • État : informations stockées à un point donné du temps
  • commande: directive au stockage pour changer son état

ainsi votre base de données peut ressembler à ce qui suit:

enter image description here

étape Suivante consiste à exécuter une commande:

enter image description here

Veuillez noter que plusieurs aspects importants:

  1. une commande peut affecter beaucoup d'entités stockées, donc beaucoup de blocs vont se salir
  2. L'état suivant est une fonction du état actuel et la commande

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

enter image description here

enfin, vous devez garantir l'intégrité des données.

  • Write-Ahead Logging - le concept central est que État les modifications doivent être enregistrées avant toute mise à jour importante vers un stockage permanent. Suivant notre idée, nous pouvons enregistrer les changements incrémentiels pour chaque bloc.
  • Commande De Journalisation - le concept central est de n'enregistrer que Commande, qui est utilisé pour produire de l'état.

enter image description here

il y a des avantages et des inconvénients pour les deux approches. Le journal d'écriture-avant contient toutes les données modifiées, le journal de commande exigera le traitement d'addition, mais rapide et léger.

VoltDB: commande de journalisation et de récupération

La clé la journalisation de commande est qu'elle logue les invocations, pas les les conséquences des transactions. En n'enregistrant que l'invocation, les journaux de commande sont maintenus à un strict minimum, limitant l'impact de l'E/S du disque avoir sur la performance.

notes supplémentaires

SQLite: Write-Ahead Logging

le traditionnel journal à rebours fonctionne en écrivant une copie du original inchangé contenu de la base de données dans un journal de roulis séparé fichier, puis l'écriture des modifications directement dans le fichier de base de données.

une propagation se produit lorsqu'un enregistrement spécial indiquant une propagation est joint. au WAL. Ainsi un COMMIT peut se produire sans jamais écrire à la base de données originale, qui permet aux lecteurs de continuer à fonctionner à partir de la la base de données originale non modifiée pendant que les changements sont engagé dans le WAL.

PostgreSQL: Journalisation À L'Avance (WAL)

L'utilisation de WAL entraîne une réduction significative du nombre d'Écritures sur disque, parce que seul le fichier journal doit être jeté 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 log est écrit séquentiellement, le coût de la synchronisation le journal l'est beaucoup moins que le coût de rinçage de la pages de données. Ceci est particulièrement vrai pour les serveurs manipulant de nombreux petits transaction toucher différentes parties de la banque de données. Outre, lorsque le serveur traite de nombreuses petites transactions simultanées, une fsync du fichier journal peut suffire à commettre de nombreuses transactions.

Conclusion

Commande D'Enregistrement:

  1. est plus rapide
  2. a une empreinte plus faible
  3. a une procédure plus lourde de "Replay"
  4. nécessite un snapshot fréquent

Ecrire En Avance Journalisation est une technique pour fournir l'atomicité. Une meilleure performance de journalisation par commande devrait également améliorer le traitement des transactions. bases de données sur 1 pied

enter image description here

Confirmation

VoltDB Blog: Intro to VoltDB Command Logging

L'un des avantages de la journalisation par commande par rapport à la journalisation de style ARIES est qu'une transaction peut être enregistré avant l'exécution commence au lieu de l'exécuter le la transaction et l'attente des données de journal pour rincer sur le disque. Un autre l'avantage est que le débit D'IO nécessaire pour un journal de commande est 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 bon marché.

il est important de se rappeler que VoltDB est distribué 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 fonction de journalisation de commandes de VoltDB

la commande log in VoltDB se compose des invocations de procédure stockées et leurs paramètres. Un log est créé à chaque noeud, et chaque log est répliqué parce que tout le travail est répliqué à plusieurs noeuds. Ce résultats dans une commande répliquée journal de dupe en replay temps. Puisque les transactions VoltDB sont fortement ordonnées, la commande le journal contient des informations de commande. Ainsi, la relecture peut se produire dans le l'ordre exact dans lequel les transactions originales ont été effectuées, avec la pleine isolation des transactions proposées par VoltDB. Depuis les invocations eux-mêmes sont souvent plus petites que les données modifiées, et peuvent être ils sont engagés, cette approche a un effet très modeste sur performance. Cela signifie que les utilisateurs de VoltDB peuvent obtenir le même type de performances stratosphériques en chiffres, avec une durabilité supplémentaire assurance.

73
répondu Renat Gilmanov 2013-01-14 21:42:49

From the description of Postgres ' write ahead http://www.postgresql.org/docs/9.1/static/wal-intro.html et le journal de commandes de VoltDB (auquel vous avez fait référence), Je ne vois pas beaucoup de différence. Il semble que ce soit le même concept avec un nom différent.

les Deux synchroniser le fichier journal sur le disque, mais pas les données afin que les données puissent être récupérées par la relecture du fichier journal.

la Section 10.4 de VoltDB explique que leur version communautaire ne n'ayant pas de journal de commande, il ne réussirait pas le test D'acidité. Même dans l'édition enterprise, Je ne vois pas les détails de leur isolation des transactions (par exemple http://www.postgresql.org/docs/9.1/static/transaction-iso.html) nécessaire pour me mettre à l'aise que VoltDB est aussi sérieux que Postges.

1
répondu pedz 2013-01-09 03:57:44

La façon dont je l'ai lu comme suit: (Mon avis)

Commande d'enregistrement comme décrit ici uniquement les journaux des transactions qu'ils se produisent et non pas ce qui se passe dans ou à eux. Ok, donc voici la pièce magique... Si vous voulez revenir en arrière, vous devez restaurer le dernier snapshot et ensuite vous pouvez rejouer toutes les transactions qui ont été appliquées après cela (décrites dans le lien ci-dessus). Donc effectivement vous restaurez une sauvegarde et appliquez de nouveau tous vos scripts, seule VoltDB l'a maintenant automatisée pour vous.

La vraie différence que je vois c'est que vous ne pouvez pas revenir à un point dans le temps logiquement comme une opération normale du journal. Les journaux normaux des transactions (MSSQL, MySQL etc.) peut facilement revenir en arrière à un moment donné (dans la configuration correcte) car les transactions peuvent être "inversées".

une question intéressante se pose - en se référant au pos by pedz, est-ce qu'il passera toujours le test à L'acide même avec la commande Log? Allons faire un peu plus de lecture...

Ajouter: Did 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 snapshot DB est automatiquement créé lorsque la commande Logs se remplit, pour vous sauver des gros journaux de transactions et de L'IO utilisé pour cela? Vous allez encourir de grandes quantités D'IO avec vos instantanés étant fait à un intervalle régulier et vous utilisez également votre mémoire au bord. Alos, à mon avis, vous perdez votre capacité de se retourner facilement à un point dans le temps avant le dernier snapshot automatique - pensez ceci sera très difficile à gérer.

je préfère m'en tenir au journal des transactions pour les systèmes transactionnels. C'est prouvé, et cela fonctionne.

0
répondu Charl 2013-01-10 09:54:45

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 déclarations individuelles (et "inférieur"). Aussi leur flou en ce qui concerne les avantages est un peu d'un hareng rouge:

L'un des avantages de la journalisation par commande par rapport à la journalisation de style ARIES est qu'une transaction peut être enregistré avant l'exécution commence au lieu de l'exécuter la transaction et en attendant que les données du journal 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 un proc stocké. Les RDBM traditionnels doivent généralement prendre en charge des transactions ad hoc contenant un certain nombre d'états, de sorte que l'enregistrement 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 RDBM traditionnels (c'est-à-dire que les paramètres donnés+log+data produisent toujours la même sortie), ce qui il faudrait pour que cela fonctionne.

néanmoins, les améliorations du rendement seraient importantes pour ce modèle de SGBDR limité.

0
répondu corsair 2013-05-18 21:49:07

avec WAL, les lecteurs lisent des pages de journaux Non jetés. Aucune modification n'est apportée au DB principal. Avec la journalisation de commande, vous n'avez pas la capacité de lire le journal de commande.

l'enregistrement des commandes est donc très différent. VoltDB utilise la journalisation par commande pour créer des points de récupération et assurer la durabilité, bien sûr - mais il écrit sur la mémoire principale db (RAM) en temps réel - avec tous les problèmes de verrouillage qui s'y rattachent, etc.

0
répondu Erik Aronesty 2016-02-03 19:34:39