52 votes

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

J'ai lu sur Voltdb du journal de commandes. La commande d'enregistrements de journal de la transaction, les invocations à la place de chaque ligne de changement, comme dans un write-ahead log. En enregistrant uniquement de l'invocation, la commande journaux sont maintenus à un minimum, la limitation de l'impact le disque I/O aura sur la performance.

Quelqu'un peut-il expliquer la base de données de la théorie derrière pourquoi Voltdb utilise une commande du journal et pourquoi le standard SQL bases de données comme Postgresql, MySQL, SQLServer, Oracle utiliser un write-ahead log?

83voto

Renat Gilmanov Points 9287

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 imaginez que vous allez écrire votre propre espace de stockage de base de données sur la mise en œuvre. Sans doute vous êtes suffisamment avancé pour résumé un système de fichier et d'utiliser le bloc de rangement avec quelques optimisations supplémentaires.

Quelques terminologie de base:

  • État : les informations stockées sur un point donné du temps
  • Commande : directive pour le stockage de changer son état

Si votre base de données peut avoir l'aspect suivant:

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 nombreux stockées entités, de sorte que de nombreux blocs vont se salir
  2. L'état suivant est une fonction de l'état de la commande

Certains états intermédiaires peuvent être ignorées, parce que c'est assez pour avoir une chaîne de commandes à la place.

enter image description here

Enfin, vous avez besoin pour garantir l'intégrité des données.

  • Write-Ahead Logging - concept central est celui de l'État des modifications doivent être enregistrées avant une lourde mise à jour dans le stockage permanent. À la suite de notre idée, nous pouvons nous connecter des changements progressifs pour chaque bloc.
  • Commande Logging - concept central est de vous connecter uniquement de Commande, qui est utilisé pour produire de l'état.

enter image description here

Il y a des avantages et des Inconvénients des deux approches. Write-Ahead log contient toutes les données modifiées, Commande journal nécessitent plus de traitement, mais rapide et léger.

VoltDB: Commande d'enregistrement et de Récupération

La clé de commande de la journalisation est qu'il enregistre les invocations, pas la les conséquences des transactions. En enregistrant uniquement de l'invocation, la commande journaux sont maintenus à un minimum, la limitation de l'impact le disque I/O ont sur la performance.

Notes supplémentaires

SQLite: Write-Ahead Logging

La traditionnelle restauration journal fonctionne par écrit une copie de la original inchangé base de données de contenu dans un rollback journal fichier, puis l'écriture des modifications directement dans le fichier de base de données.

Une validation se produit lorsqu'une inscription spéciale indiquant un commit est ajouté le WAL. Ainsi une livraison peut se produire sans jamais écrit à l' base de données d'origine, ce qui permet aux lecteurs de continuer à fonctionner à partir de la d'origine intacte de la base de données alors que des changements sont simultanément en cours engagé dans le WAL.

PostgreSQL: Write-Ahead Logging (WAL)

À l'aide de WAL résultats dans une réduction significative du nombre d'écritures sur disque, parce que seul le fichier journal doit être vidées sur le disque afin de 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 donc la 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. Cela est particulièrement vrai pour les serveurs de la manipulation de nombreux petits les transactions touchant les différentes parties de la banque de données. En outre, lorsque le serveur est le traitement d'un grand nombre de petites transactions simultanées, l'une fsync du fichier journal peut suffire à commettre de nombreuses transactions.

Conclusion

Commande D'Enregistrement:

  1. est plus rapide
  2. a moins d'empreinte
  3. a lourdes "Replay" de la procédure
  4. nécessite de fréquentes instantané

Écrire à l'Avance enregistrement est une technique pour fournir l'atomicité. Une meilleure maîtrise de la Journalisation de la performance doit également permettre d'améliorer le traitement des transactions. Les bases de données sur 1 Pied

enter image description here

Confirmation

VoltDB Blog: Intro VoltDB Commande de Journalisation

Un des avantages de la commande logging plus de BÉLIER style de journalisation est qu'un transaction peut être enregistré avant l'exécution commence au lieu de l'exécuter la transaction et d'attente pour les données des journaux à vider sur le disque. Un autre l'avantage est que l'IO débit nécessaire pour une commande du journal 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 les bas prix des produits de base de disques.

Il est important de se rappeler VoltDB est distribué de par sa nature. Ainsi les transactions sont un peu difficile à gérer et impact sur les performances est perceptible.

VoltDB Blog: VoltDB la Nouvelle Fonctionnalité de Journalisation de Commande

Le journal de commandes dans VoltDB se compose de procédure stockée invocations et leurs paramètres. Un journal est créé au niveau de chaque nœud et chaque journal est répliqué car tous les travaux sont répliquées sur plusieurs nœuds. Cette résultats dans une commande répliquée journal de dupe en replay temps. Parce que VoltDB les transactions sont fortement ordonnée, la commande le journal contient des informations de commande ainsi. Ainsi, la relecture peut se produire dans l'ordre exact de l'original de transactions a couru dans, avec le plein l'isolation de la transaction VoltDB offre. Depuis les invocations eux-mêmes sont souvent plus petits que les données modifiées, et peut être connecté avant ils se sont engagés, cette approche a une très faible incidence sur les performances. Cela signifie VoltDB les utilisateurs peuvent obtenir le même genre de stratosphérique, les chiffres de la performance, avec une durabilité supplémentaires des assurances.

2voto

pedz Points 929

À partir de la description de Postgres' écrire à l'avance http://www.postgresql.org/docs/9.1/static/wal-intro.html et VoltDB de commande du journal (qui vous référencées), je ne vois pas beaucoup la différence. Il semble être à l'identique le concept avec un nom différent.

Les deux ne synchroniser que 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.

L'article 10.4 de VoltDB explique que leur version communautaire n'a pas le journal de commandes de sorte qu'il ne passerait pas le test de l'ACIDE. Même dans l'édition d'entreprise, je ne vois pas les détails de leur isolement des transactions (p. ex. http://www.postgresql.org/docs/9.1/static/transaction-iso.html) nécessaires pour me rendre à l'aise que VoltDB est aussi grave que la Postges.

0voto

SQL Heroes Points 544

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, alors voici la magie de la pièce... Si vous souhaitez reprendre vous avez besoin de restaurer le dernier snapshot et puis vous pouvez relire toutes les transactions qui ont été appliqués après que (Décrit dans le lien ci-dessus). Donc, effectivement la restauration d'une sauvegarde et d'appliquer de nouveau tous vos scripts, seulement VoltDB a maintenant automatisé 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. Normal journaux de transactions (MSSQL, MySQL, etc.) peut facilement revenir à un point dans le temps (dans le bon setup) que les transactions peuvent être 'inversée'.

Interressant question revient - se référant à l'encaissement par pedz, il sera toujours passer le test à l'ACIDE, même avec la Commande Log? Allons faire un peu plus de lecture...

Ajouter: Ne plus lire et je ne pense pas que ce soit une bonne idée pour de très gros et très occupé bases de données transactionnelles. Un instantané de DB est créé automatiquement lors de la Commande Journaux se remplissent, pour vous sauver de grands journaux de transactions et les IO utilisé pour cela? Vous allez engager de grandes IO montants avec vos clichés de fait à un intervalle régulier et vous êtes également à l'aide de votre mémoire à l'épreuve. Alos, à mon avis, vous perdez votre capacité à restaurer facilement à un point dans le temps avant la dernière automatique instantané pense que cela va devenir très difficile à gérer.

Je vais plutôt en tenir à des Journaux de Transactions pour les systèmes Transactionnels. C'est prouvé, et cela fonctionne.

0voto

corsair Points 35

C'est vraiment juste une question de granularité. Ils journal des opérations au niveau des procédures stockées, la plupart des SGBDR journal au niveau des états (et "bas"). Aussi leur texte de présentation concernant les avantages, c'est un peu un leurre:

Un des avantages de la commande logging plus de BÉLIER style de journalisation est qu'un transaction peut être enregistré avant l'exécution commence au lieu de l'exécuter la transaction et d'attente pour les données des journaux à vider sur le disque.

Ils doivent attendre que la commande pour être connecté en trop, c'est juste un beaucoup plus petit record.

Si je ne me trompe pas VoltDB de l'unité de transaction est une procédure stockée. Traditionnelle SGBDR ont souvent besoin de soutien ad-hoc transactions contenant n'importe quel nombre de déclarations, de sorte que la procédure au niveau de journalisation est hors de question. En outre, les procédures stockées sont souvent pas vraiment déterministes dans les SGBDR traditionnels (c'est à dire étant donné params+journal+les données de toujours produire le même résultat), qu'ils devraient être pour que cela fonctionne.

Néanmoins, les performances des améliorations substantielles pour cette contrainte SGBDR modèle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X