wake-up-neo.com

Warum verwenden SQL-Datenbanken ein Write-Ahead-Protokoll über ein Befehlsprotokoll?

Ich habe über Voltdbs Befehlsprotokoll gelesen. Das Befehlsprotokoll zeichnet die Transaktionsaufrufe statt jeder Zeilenänderung wie in einem Write-Ahead-Protokoll auf. Indem nur der Aufruf aufgezeichnet wird, werden die Befehlsprotokolle auf ein Minimum beschränkt, wodurch die Auswirkungen der Festplatten-E/A auf die Leistung begrenzt werden.

Kann jemand die Datenbanktheorie erklären, die dahintersteckt, warum Voltdb ein Befehlsprotokoll verwendet und warum die Standard-SQL-Datenbanken wie Postgres, MySQL, SQLServer und Oracle ein Write-Ahead-Protokoll verwenden?

45
user782220

Ich denke, es ist besser zu formulieren: 

Warum verwendet die neue verteilte VoltDB ein Befehlsprotokoll für das Write-Ahead-Protokoll?

Lassen Sie uns ein Experiment durchführen und sich vorstellen, dass Sie Ihre eigene Speicher-/Datenbankimplementierung schreiben werden. Zweifellos sind Sie so weit fortgeschritten, dass Sie ein Dateisystem abstrahieren und Blockspeicher zusammen mit einigen zusätzlichen Optimierungen verwenden können.

Einige grundlegende Terminologie:

  • State: gespeicherte Informationen zu einem bestimmten Zeitpunkt 
  • Befehl: Anweisung an den Speicher, um seinen Status zu ändern

Ihre Datenbank könnte also wie folgt aussehen:

enter image description here

Der nächste Schritt besteht darin, einen Befehl auszuführen:

enter image description here

Bitte beachten Sie einige wichtige Aspekte:

  1. Ein Befehl kann sich auf viele gespeicherte Entitäten auswirken, sodass viele Blöcke verschmutzt werden
  2. Der nächste Status ist eine Funktion des aktuellen Status und des Befehls 

Einige Zwischenzustände können übersprungen werden, da es ausreichend ist, stattdessen eine Befehlskette zu verwenden.

enter image description here

Schließlich müssen Sie die Datenintegrität gewährleisten.

  • Write-Ahead-Protokollierung - Das zentrale Konzept besteht darin, dass State Änderungen protokolliert werden sollten, bevor ein umfangreiches Update in den permanenten Speicher erfolgt. Unserer Idee folgend können wir inkrementelle Änderungen für jeden Block protokollieren.
  • Command Logging - Zentrales Konzept ist nur die Protokollierung Command , das zur Erzeugung des Status verwendet wird.

enter image description here

Für beide Ansätze gibt es Vor- und Nachteile. Das Write-Ahead-Protokoll enthält alle geänderten Daten. Das Befehlsprotokoll erfordert eine zusätzliche Verarbeitung, ist jedoch schnell und einfach. 

VoltDB: Befehlsprotokollierung und Wiederherstellung

Der Schlüssel zur Befehlsprotokollierung besteht darin, dass die Aufrufe der Transaktionen und nicht die - Konsequenzen protokolliert werden. Durch das Aufzeichnen nur des Aufrufs Werden die Befehlsprotokolle auf ein Minimum reduziert, wodurch die Auswirkungen, die die Festplatten-E/A Auf die Leistung haben, begrenzt werden.

Zusätzliche Hinweise

SQLite: Write-Ahead-Protokollierung

Das traditionelle Rollback-Journal schreibt eine Kopie des ursprünglichen unveränderten Datenbankinhalts In eine separate Rollback-Journaldatei Und schreibt die Änderungen anschließend direkt in die Datenbankdatei.

Ein COMMIT-Befehl tritt auf, wenn ein spezieller Datensatz, der ein Commit anzeigt, An die WAL angehängt wird. Daher kann ein COMMIT ohne Schreibzugriff auf die Originaldatenbank Erfolgen, so dass die Leser weiterhin mit der ursprünglichen Originaldatenbank Arbeiten können, während gleichzeitig Änderungen in der WAL vorgenommen werden.

PostgreSQL: Write-Ahead-Protokollierung (WAL)

Die Verwendung von WAL führt zu einer erheblich geringeren Anzahl von Festplattenschreibvorgängen , Da nur die Protokolldatei auf die Festplatte geschrieben werden muss, um Zu garantieren, dass eine Transaktion festgeschrieben wird, und nicht jede Datendatei . .] durch die Transaktion. 

Die Protokolldatei wird sequentiell geschrieben, und daher sind die Kosten für die Synchronisierung des Protokolls viel geringer als die Kosten für das Leeren der Datenseiten. Dies gilt insbesondere für Server, die viele kleine - Transaktionen abwickeln, die verschiedene Teile des Datenspeichers berühren. Außerdem kann , Wenn der Server viele kleine gleichzeitige Transaktionen verarbeitet, ein Fsync der Protokolldatei ausreichen, um viele Transaktionen festzuschreiben. 

Schlussfolgerung

Befehlsprotokollierung:

  1. ist schneller
  2. hat weniger Fußabdruck
  3. hat schwerere "Replay" -Prozedur
  4. erfordert häufige Momentaufnahmen

Write Ahead Logging ist eine Technik zur Bereitstellung von Atomizität. Eine bessere Leistung bei der Befehlsprotokollierung sollte auch die Transaktionsverarbeitung verbessern. Datenbanken auf 1 Fuß

enter image description here

Bestätigung

VoltDB Blog: Einführung in die VoltDB-Befehlsprotokollierung

Ein Vorteil der Befehlsprotokollierung gegenüber der Protokollierung im ARIES-Stil besteht darin, dass eine Transaktion vor Beginn der Ausführung protokolliert werden kann, anstatt die Transaktion Auszuführen und darauf zu warten, dass die Protokolldaten auf die Festplatte geleert werden. Ein weiterer Vorteil von Ist, dass der für ein Befehlsprotokoll erforderliche IO -Durchsatz Vom Netzwerk begrenzt wird, das zum Weiterleiten von Befehlen verwendet wird, und im Fall von E kann dieser Durchsatz durch billige Warenplatten befriedigt werden.

Es ist wichtig zu wissen, dass VoltDB seiner Natur nach verteilt ist. Daher sind Transaktionen etwas schwierig zu handhaben und die Auswirkungen auf die Leistung sind spürbar.

VoltDB Blog: VoltDBs neue Befehlsprotokollierungsfunktion

Das Befehlsprotokoll in VoltDB besteht aus gespeicherten Prozeduraufrufen und Ihren Parametern. An jedem Knoten wird ein Protokoll erstellt, und jedes Protokoll wird Repliziert, da alle Arbeiten auf mehrere Knoten repliziert werden. Dieses Führt zu einem replizierten Befehlsprotokoll, das bei der Wiedergabe Abgebrochen werden kann. Da VoltDB-Transaktionen stark geordnet sind, enthält der Befehl Log auch Bestellinformationen. Daher kann die Wiedergabe In der genauen Reihenfolge erfolgen, in der die ursprünglichen Transaktionen ausgeführt wurden, wobei die vollständige Transaktionsisolation von VoltDB angeboten wird. Da die Aufrufe selbst Häufig kleiner als die modifizierten Daten sind und vor Protokolliert werden können, da sie festgeschrieben sind, hat dieser Ansatz einen sehr bescheidenen Einfluss auf die Leistung von . Dies bedeutet, dass Benutzer von VoltDB dieselbe Art von Stratosphärischen Leistungszahlen erzielen können, mit zusätzlicher Haltbarkeit .

75
Renat Gilmanov

Aus der Beschreibung von Postgres 'write ahead http://www.postgresql.org/docs/9.1/static/wal-intro.html und dem VoltDB-Befehlsprotokoll (auf das Sie referenziert haben) kann ich keinen großen Unterschied erkennen überhaupt. Es scheint das identische Konzept mit einem anderen Namen zu sein.

Beide synchronisieren nur die Protokolldatei auf die Festplatte, nicht jedoch die Daten, sodass die Daten durch Wiedergeben der Protokolldatei wiederhergestellt werden können.

In Abschnitt 10.4 von VoltDB wird erläutert, dass die Community-Version kein Befehlsprotokoll enthält, sodass der ACID-Test nicht bestanden wird. Selbst in der Enterprise Edition sehe ich nicht die Details ihrer Transaktionsisolation (z. B. http://www.postgresql.org/docs/9.1/static/transaction-iso.html ), die ich brauche, um mich wohl zu fühlen das VoltDB ist so ernst wie Postges.

1
pedz

Die Art, wie ich es lese, lautet wie folgt: (Meine eigene Meinung)

Die Befehlsprotokollierung, wie hier beschrieben, protokolliert nur Transaktionen, wenn sie auftreten, und nicht das, was darin passiert. Ok, hier ist das Zauberstück ... Wenn Sie einen Rollback ausführen möchten, müssen Sie den letzten Snapshot wiederherstellen und dann können Sie alle Transaktionen, die danach angewendet wurden, erneut abspielen (Beschrieben im Link oben). So effektiv Sie ein Backup wiederherstellen und alle Ihre Skripts erneut anwenden, hat nur VoltDB es jetzt für Sie automatisiert.

Der wirkliche Unterschied, den ich dabei sehe, ist, dass Sie nicht wie bei einem normalen Transaktionslog logisch zu einem Zeitpunkt zurückrollen können. Normale Transaktionsprotokolle (MSSQL, MySQL usw.) können problemlos zu einem bestimmten Zeitpunkt (im richtigen Setup) rückgängig gemacht werden, da die Transaktionen "rückgängig gemacht" werden können.

Es stellt sich eine interessante Frage: Bezieht man sich auf das pos von pedz, wird der ACID-Test auch mit dem Befehlsprotokoll immer bestanden? Wird noch etwas lesen ...

Hinzufügen: Ich habe mehr gelesen und denke nicht, dass dies eine gute Idee für sehr große und viel beschäftigte Transaktionsdatenbanken ist. Ein DB-Snapshot wird automatisch erstellt, wenn die Befehlsprotokolle voll sind, um Sie vor großen Transaktionsprotokollen und dem dafür verwendeten IO zu schützen. Sie werden große IO - Beträge erhalten, wenn Ihre Snapshots in regelmäßigen Abständen erstellt werden, und Sie nutzen auch Ihr Gedächtnis bis zum Rand. Außerdem verlieren Sie aus meiner Sicht die Fähigkeit, problemlos bis zu einem bestimmten Zeitpunkt vor dem letzten automatischen Schnappschuss zurückzurollen - ich denke, dies wird sehr schwierig zu handhaben sein.

Ich bleibe lieber bei Transaktionsprotokollen für Transaktionssysteme. Es hat sich bewährt und es funktioniert.

0
Charl

Es ist wirklich nur eine Frage der Granularität. Sie protokollieren Operationen auf der Ebene der gespeicherten Prozeduren, die meisten RDBMS-Protokolle auf der Ebene der einzelnen Anweisungen (und "niedriger"). Ihr Klappentext in Bezug auf die Vorteile ist ein bisschen ein roter Hering:

Ein Vorteil der Befehlsprotokollierung gegenüber der Protokollierung im ARIES-Stil besteht darin, dass eine Transaktion vor Beginn der Ausführung protokolliert werden kann, anstatt die Transaktion Auszuführen und darauf zu warten, dass die Protokolldaten auf die Festplatte geleert werden.

Sie müssen warten, bis auch der Befehl protokolliert wird, es ist nur ein viel kleinerer Datensatz.

Wenn ich mich nicht irre, ist VoltDBs Transaktionseinheit eine gespeicherte Prozedur. Herkömmliche RDBMS müssen in der Regel Ad-hoc-Transaktionen mit einer beliebigen Anzahl von Anweisungen unterstützen, sodass eine Protokollierung auf Prozedurebene nicht in Frage kommt. Darüber hinaus sind gespeicherte Prozeduren in traditionellen RDBMS oft nicht wirklich deterministisch (d. H., Wenn Params + Log + Daten immer dieselbe Ausgabe erzeugen), was für diese Funktion erforderlich wäre.

Dennoch wären die Leistungsverbesserungen für dieses eingeschränkte RDBMS-Modell erheblich.

0
corsair

Mit WAL lesen Leser von Seiten aus nicht gelöschten Protokollen. Es werden keine Änderungen am Haupt-DB vorgenommen. Mit der Befehlsprotokollierung können Sie nicht aus dem Befehlsprotokoll lesen.

Die Befehlsprotokollierung unterscheidet sich daher erheblich. VoltDB verwendet die Befehlsprotokollierung, um Wiederherstellungspunkte zu erstellen und eine lange Lebensdauer zu gewährleisten. Sicher - aber es wird in Echtzeit in den Hauptspeicher (RAM) geschrieben - mit allen damit verbundenen Sperrproblemen usw. 

0
Erik Aronesty