Ich untersuche, wie das Zwei-Phasen-Commit für eine verteilte Transaktion funktioniert. Nach meinem Verständnis fragt der Transaktionskoordinator im letzten Teil der Phase jeden Knoten, ob er zum Festschreiben bereit ist. Wenn alle einverstanden sind, werden sie aufgefordert, sich zu verpflichten.
Was verhindert den folgenden Fehler?
- Alle Knoten antworten, dass sie zum Festschreiben bereit sind
- Der Transaktionskoordinator fordert sie auf, "fortzufahren und festzuschreiben", aber einer der Knoten stürzt ab, bevor diese Nachricht empfangen wird
- Alle anderen Knoten werden erfolgreich festgeschrieben, aber jetzt ist die verteilte Transaktion beschädigt
- Nach meinem Verständnis wurde die Transaktion des abgestürzten Knotens zurückgesetzt, wenn er zurückkommt (da er nie die Festschreibungsnachricht erhalten hat).
Ich gehe davon aus, dass auf jedem Knoten eine normale Datenbank ausgeführt wird, die nichts über verteilte Transaktionen weiß. Was habe ich verpasst?
Antworten:
Nein, sie werden nicht angewiesen, ein Rollback durchzuführen, da im Szenario des Originalplakats einige der Knoten bereits festgeschrieben wurden. Wenn der abgestürzte Knoten verfügbar wird, weist der Transaktionskoordinator ihn an, erneut ein Commit durchzuführen.
Da der Knoten in der Vorbereitungsphase positiv reagiert hat, muss er in der Lage sein, "festzuschreiben", selbst wenn er von einem Absturz zurückkommt.
quelle
Alle Antworten zusammenfassen:
Bei verteilten Transaktionen kann man keine normalen Datenbanken verwenden. Die Datenbank muss explizit einen Transaktionskoordinator unterstützen.
Die Knoten werden nicht zum Zurücksetzen angewiesen, da einige der Knoten bereits festgeschrieben haben. Wenn der abgestürzte Knoten zurückkommt, weist der Transaktionskoordinator ihn an, das Festschreiben zu beenden.
quelle
Punkt 4 ist falsch. Jeder Knoten zeichnet in einem stabilen Speicher auf, dass er die Transaktion festschreiben oder zurücksetzen konnte, sodass er auch bei Abstürzen die Anweisungen ausführen kann. Wenn der abgestürzte Knoten wieder hochgefahren wird, muss er erkennen, dass sich eine Transaktion im Status vor dem Festschreiben befindet, relevante Sperren oder andere Steuerelemente wiederherstellen und dann versuchen, die Koordinator-Site zu kontaktieren, um den Status der Transaktion zu erfassen.
Die Probleme treten nur auf, wenn der abgestürzte Knoten nie wieder hochgefahren wird (dann denkt alles andere, dass die Transaktion in Ordnung war oder wenn der abgestürzte Knoten zurückkommt).
quelle
Das Zwei-Phasen-Commit ist nicht kinderleicht und wurde nur für 99% der Fälle entwickelt.
"Das Protokoll geht davon aus, dass auf jedem Knoten mit einem Write-Ahead-Protokoll ein stabiler Speicher vorhanden ist, dass kein Knoten für immer abstürzt, dass die Daten im Write-Ahead-Protokoll bei einem Absturz niemals verloren gehen oder beschädigt werden und dass zwei beliebige Knoten kommunizieren können miteinander."
http://en.wikipedia.org/wiki/Two-phase_commit_protocol
quelle
Es gibt viele Möglichkeiten, die Probleme mit einem Zwei-Phasen-Commit anzugreifen. Fast alle von ihnen werden als eine Variante des dreiphasigen Paxos-Festschreibungsalgorithmus angezeigt. Mike Burrows, der den auf Paxos basierenden Chubby Lock-Dienst bei Google entwickelt hat, sagte in einem Vortrag, den ich gesehen habe, dass es zwei Arten von verteilten Festschreibungsalgorithmen gibt - "Paxos und falsche".
Eine Sache, die der abgestürzte Knoten tun könnte, wenn er wieder aufwacht, ist zu sagen: "Ich habe noch nie von dieser Transaktion gehört, sollte sie festgeschrieben worden sein?" an den Koordinator, der ihm mitteilen wird, wie die Abstimmung war.
Beachten Sie, dass dies ein Beispiel für ein allgemeineres Problem ist: Der abgestürzte Knoten kann viele Transaktionen verpassen, bevor er wiederhergestellt wird. Daher ist es fürchterlich wichtig, dass es nach der Wiederherstellung entweder mit dem Koordinator oder einem anderen Replikat spricht, bevor es sich zur Verfügung stellt. Wenn der Knoten selbst nicht erkennen kann, ob er abgestürzt ist oder nicht, werden die Dinge komplizierter, aber dennoch nachvollziehbar.
Wenn Sie ein Quorum-System für Datenbanklesevorgänge verwenden, wird die Inkonsistenz maskiert (und der Datenbank selbst bekannt gemacht).
quelle