© H.-U. Hei§, Uni-Paderborn 6 Transaktionen in Verteilten Systemen © H.-U. Hei§, Uni-Paderborn Anforderungen an Transaktionen (ACID - Principle): 6.1 Grundlagen (Wiederholung aus KMS) Atomicity AtomaritŠt Alles-oder-Nichts-Eigenschaft: Die Transaktion wird entweder vollstŠndig ausgefŸhrt oder hinterlŠ§t keinerlei Wirkung. Kritische Abschnitte ¥ elementares Mittel zur Konsistenzwahrung bei nebenlŠufigen Zugriffen ¥ Programmierer selbst fŸr korrektes Setzen der Sperren verantwortlich Consistency Konsistenz Eine Transaktion fŸhrt einen konsistenten Datenzustand wieder in einen solchen Ÿber. Anforderungen an ãhšheresÒ Konzept ¥ Automatisches Erzwingen der Konsistenzwahrung ¥ Umgang mit verschiedenen kritischen Abschnitten ¥ Konsistenzwahrung auch bei Fehlern und AusfŠllen Isolation Isolation Zwischenergebnisse einer Transaktion sind fŸr andere Transaktionen nicht sichtbar. Durability → Transaktionen Dauerhaftigkeit: Die €nderungen einer beendeten und bestŠtigten (committed) Transaktion kšnnen weder verloren gehen noch rŸckgŠngig gemacht werden. Eine Transaktion ist eine Folge von Operationen, die in ihrer Wirkung atomar sein soll. 6-1 6-2 © H.-U. Hei§, Uni-Paderborn © H.-U. Hei§, Uni-Paderborn Zustände von Transaktionen T1 T2 T3 Tn start, read, write, abort, commit Beendet (partially committed) Bestätigt (committed) M IT Transaktionsverwalter (transaction manager) TV_COMMIT Architektur eines Transaktionssystems CO M Planer (scheduler) Undefiniert (undefined) read, write, abort, commit T Gescheitert (failed) TV_ROLLBACK Daten 6-3 Undefiniert (undefined) TV_ABORT OR read, write Rücksetzer (recovery manager) Aktiv (active) AB Pufferverwalter (cache manager) START 6-4 Zurückgesetzt (aborted) © H.-U. Hei§, Uni-Paderborn Einige Definitionen (Wiederholung) Def.: Def.: Def.: Def.: Transaktion Ti liest von Transaktion Tj, wenn Ti Datenelemente liest, die vorher von Tj geschrieben wurden. Ein Plan S hei§t rŸcksetzbar (recoverable, S ∈RC), wenn jede Transaktion T ∈S erst dann bestŠtigt wird, wenn alle Transaktionen, von denen sie gelesen hat, bereits bestŠtigt sind oder abgebrochen wurden Zwei PlŠne S und SÕ hei§en Šquivalent, wenn sie dieselben Ausgabewerte liefern und denselben Datenzustand zurŸcklassen. Def. Zwei PlŠne S und SÕ hei§en konfliktŠquivalent, wenn sie aus denselben Operationen bestehen und Konflikte in gleicher Weise auflšsen (∀p ↔ q: p < S q ⇔ p < S' q) Ein Plan S hei§t (konflikt)serialisierbar (S ∈SR), wenn er (genauer: seine bestŠtigte Projektion C(S)) zu einem seriellen Plan (konflikt)Šquivalent ist. Def.: Zusammenhang der Eigenschaften (Mengendiagramm) Konfliktserialisierbare Pläne SR Rücksetzbare Pläne RC Ein Plan S hei§t strikt ( S ∈ST ), wenn von keiner Transaktion aus S unbestŠtigte Daten gelesen oder Ÿberschrieben werden. Ein Plan S hei§t seriell, wenn fŸr jedes Paar von Transaktionen alle Operationen der einen vor jeder Operation der anderen ausgefŸhrt werden. Def.: Def.: © H.-U. Hei§, Uni-Paderborn kaskadierenden Abbruch vermeidende Pläne ACA Strikte Pläne ST Serielle Pläne Korrekte Pläne Ein Plan S hei§t korrekt, wenn er konfliktserialisierbar und rŸcksetzbar ist. 6-5 6-6 © H.-U. Hei§, Uni-Paderborn Koordination von Transaktionen Vorgehensweisen von Planern Da die Konsistenzwahrung automatisch geschehen soll, mu§ von einer beliebig verzahnten Folge von Operationen der nebenlŠufigen Transaktionen ausgegangen werden. Die Transaktionsverwaltung (bzw. der Planer als Teil der TV) hat dann die Aufgabe, aus dieser Aufruffolge einen Plan mit den gewŸnschten Eigenschaften (z.B. Serialisierbarkeit) zu schaffen. Da er die Operationen nicht verŠndern kann, bleiben nur die folgenden Optionen: 1. 2. 3. Sofortige AusfŸhrung der Operation Verzšgerung der AusfŸhrung der Operation (um eine Umordnung zu bewirken) Abweisen der Operation (fŸhrt zum Abbruch der Transaktion) T1 T2 © H.-U. Hei§, Uni-Paderborn Tn BezŸglich der Wahl der Optionen kann man Planer mit unterschiedlichem Verhalten unterscheiden Konservatives Vorgehen ¥ ¥ ¥ Aggressives Vorgehen ¥ Folge F von Operationen ¥ Planer (scheduler) Konservative Planer gehen von hŠufigen Konflikten aus und sind daher sehr vorsichtig. Sie verzšgern Operationen so lange, bis kaum noch etwas schiefgehen kann. Den Extremfall bildet der serielle Planer, der alle Transaktionen zwangsserialisert. Aggressive Planer neigen dazu, Operationen sofort auszufŸhren, weil sie davon ausgehen, da§ Konflikte ohnehin selten sind. Sollte sich doch ein Konflikt ergeben, so nimmt man in Kauf, Operationen zurŸckzuweisen, d.h. Transaktionen abzubrechen und zurŸckzusetzen. konservativ Folge F‘ von Operationen Daten 6-7 aggressiv keine Abbrüche lange Verzögerungen viele Abbrüche keine Verzögerungen 6-8 © H.-U. Hei§, Uni-Paderborn © H.-U. Hei§, Uni-Paderborn Das Zweiphasen-Sperrprotokoll (ZPP) (Two-Phase-Locking (2PL)) Modifikation: Striktes Zweiphasensperren Mithilfe von Lese- und Scheibsperren lŠ§t sich ein Protokoll angeben, das die Forderung nach Serialisierbarkeit erfŸllt. Das normale Zweiphasensperren erzeugt serialisierbare PlŠne, jedoch nicht unbedingt rŸcksetzbare: 1. Eine Transaktion mu§ jedes Datenelement vor dem ersten Zugriff mit einer dem Zugriff entsprechenden Sperre belegen. 2. Kein Datenelement darf mit unvertrŠglichen Sperren belegt werden. 3. Eine Transaktion darf nach der ersten Freigabe einer Sperre keine weitere Sperre setzen. 4. Am Ende der Transaktion mŸssen alle von ihr gehaltenen Sperren freigegeben sein. T1 write_lock(x) write(x) write_unlock(x) T2 read_lock(x) read(x) read_unlock(x) commit abort Daher zusŠtzliche Forderung: Forderung 3 gibt dem Sperrprotokoll seinen Namen, da durch sie die Transaktion in zwei Phasen zerlegt wird, eine, in der Sperren sukzessive erworben werden und eine, in der die Sperren wieder freigegeben werden. 5 Alle jemals erworbenen Sperren werden bis zum Ende der Transaktion gehalten. Dadurch werden strikte PlŠne erzeugt, die nicht nur rŸcksetzbar sind, sondern auch kaskadierendes RŸcksetzen vermeiden. 6-9 6-10 © H.-U. Hei§, Uni-Paderborn © H.-U. Hei§, Uni-Paderborn Komponenten und ihr Zusammenspiel Anzahl Sperren T1 Normales 2PL T2 T3 Zeit start, read, write, abort, commit Architektur eines Transaktionssystems c Anzahl Sperren recovery manager (RM) Zeit Stabiler Speicher Konservatives 2PL read, write fetch flush c Anzahl Sperren Transaktionsverwalter (transaction manager) Planer (scheduler) read, write, abort, commit Striktes 2PL read write Pufferverwalter (cache manager) Log Zeit c 6-11 Tn 6-12 read write Instabiler Speicher (Puffer) © H.-U. Hei§, Uni-Paderborn 6.2 Validierer (Optimistische Synchronisation) ¥ ¥ RŸckwŠrtsorientierte Validierung Sind Konflikte eher selten, so kann man die Transaktionen ohne Verzšgerung bis zu ihrem Ende durchlaufen lassen und erst dann prŸfen, ob Konflikte stattgefunden haben. In diesem (hoffentlich seltenen) Konfliktfall ist die Transaktion abzubrechen (zurŸckzusetzen) und erneut zu starten. Die Validierung, d.h. PrŸfung auf Konfliktfreiheit (zum Commit-Zeitpunkt von Ti) kann auf zwei Arten erfolgen: ¥ ¥ © H.-U. Hei§, Uni-Paderborn VorwŠrtsorientiert †berprŸfen aller aktiven Transaktionen, ob ein Konflikt mit Ti vorliegt. RŸckwŠrtsorientiert †berprŸfen aller abgeschlossenen Transaktionen, ob ein Konflikt mit Ti vorliegt. r(a) w(x) w(b) T2 w(y) r(z) c Konflikt r(x) c T3 Validierung von T2 r(y) T5 w(y) c T1 w(x) T4 GeprŸft wird auf Konflikte mit Ÿberlappenden, aber bereits bestŠtigten Transaktionen An die Stelle des Planers tritt der Validierer (certifier), der die PrŸfungen vornimmt und ggf. eine Transaktion abbricht. 6-13 6-14 © H.-U. Hei§, Uni-Paderborn VorwŠrtsorientierte Validierung T2 r(a) w(x) w(b) Ablauf der Validierung (VorwŠrtsvalidierung) Der Validierer unterhŠlt die folgenden Datenstrukturen w(y) r(z) c Konflikt r(x) c T3 Validierung von T2 T5 active_set Menge der aktiven Transaktionen r_set(Ti) Menge der von Ti gelesenen Datenelemente (fŸr alle Ti ) w_set(Ti) r(y) Menge der von Ti gelesenen Datenelemente (fŸr alle Ti ) validate_forward(Ti) begin conflict := false for all Tj ∈ active _ set ∧ i ≠ j do w(y) c T1 T4 © H.-U. Hei§, Uni-Paderborn w(x) ( ( ) ) ( ( ) ) ( ( ) if r _ set Tj ∩ w _ set (Ti ) ≠ ∅ ∨ w _ set Tj ∩ r _ set (Ti ) ≠ ∅ ∨ w _ set Tj ∩ w _ set (Ti ) ≠ ∅ GeprŸft wird auf Konflikte mit aktiven Transaktionen 6-15 then conflict := true end do; if conflict then abort(Ti) else commit(Ti) end validate 6-16 ) © H.-U. Hei§, Uni-Paderborn © H.-U. Hei§, Uni-Paderborn Struktur strikter optimistischer Koordination Strikter VorwŠrtsvalidierer Ein solcher Validierer erzeugt serialisierbare PlŠne. Die erzeugten PlŠne sind jedoch nicht notwendigerweise strikt. Der erzeugte serialisierbare Plan mu§ ja einem seriellen Plan (konflikt-)Šquivalent sein. Daher folgende €nderung: Sei nun Ti < Tj bezŸglich der seriellen Ordnung. ¥ Zur Vermeidung des Lesens oder Schreibens unbestŠtigter Daten greift jede Transaktion auf eine private Kopie des Datenemelents zu. Dann mu§ gelten: ¥ Nach erfolgreicher Validierung (Commit) werden die Kopien zurŸckgeschrieben und dadurch sichtbar gemacht. 1. Alle €nderungen von Ti mŸssen fŸr Tj sichtbar sein Dies fŸhrt zur sogenannten Dreiphasenstruktur der optimistischen (validierenden) Verfahren: Validierungsphase Lesephase START 2. Keine €nderungen von Tj dŸrfen fŸr Ti sichtbar sein 3. Bei Schreibzugriffen mu§ wi(x) vor wj(x) ausgefŸhrt werden Schreibphase COMMIT Entscheidung Ende 6-17 6-18 © H.-U. Hei§, Uni-Paderborn © H.-U. Hei§, Uni-Paderborn Realisierung der VorwŠrtsvalidierung Strikte Vorwärtsvalidierung von Ti 1. Die Bearbeitung der Commit-Operation (Validierungs- und Schreibphase) wird als kritischer Abschnitt durchgefŸhrt. Krit. Abschnitt und Sperrung des Write-Sets 2. In der Schreibphase werden die Datenelemente mit Sperren versehen, um einen Zugriff anderer Transaktionen zu verhindern. 3. Als Validierung bleibt dann nur noch folgendes validate_forward(Ti) begin conflict := false for all Tj ∈ active _ set ∧ i ≠ j do ( ( ) if r _ set Tj ∩ w _ set (Ti ) ≠ ∅ r v r r ) then conflict := true end do; if conflict then abort(Ti) else commit(Ti) end validate 6-19 w Ti warten v w warten r v Tj nicht in Konflikt mit Ti w Tk in Konflikt mit Ti Damit wird der Šquivalente serielle Plan durch die COMMIT-Reihenfolge festgelegt. 6-20 © H.-U. Hei§, Uni-Paderborn Variante der VorwŠrtsvalidierung: © H.-U. Hei§, Uni-Paderborn 6.3 Architektur verteilter Transaktionssysteme T11 T12 Idee: Im Falle eines Konflikts wird nicht die validierende Transaktion Ti, sondern die in Konflikt stehende aktive Transaktion Tj abgebrochen, weil ihr Abbruch (im Mittel) einen geringeren Aufwand (Neustart) bedeutet (Kill-Strategie). r v w r T1k1 TM T21 T22 T2k2 Tm1 Tm2 TM Tmkm TM Kommunikationsnetz Sched. Sched. Sched. RM RM RM Daten Daten Daten Ti Tj in Konflikt mit Ti umsonst geleistete Arbeit 6-21 6-22 © H.-U. Hei§, Uni-Paderborn Annahmen © H.-U. Hei§, Uni-Paderborn Fehlerarten Knotenfehler ¥ ¥ Wir nehmen eine homogene Umgebung an: Jeder Knoten besteht aus einem lokalen Transaktionsverwaltungssystem Jeder Knoten verwaltet einen Teil der Daten. Jedes Datum befindet sich auf genau einem Knoten (keine Replikate) ¥ Eine Transaktion sendet ihre Operationen an den lokalen Transaktionsverwalter TM. ¥ Falls das Datum lokal nicht verfŸgbar ist, wird eine Anforderung an den TM geschickt, bei dem das Datum sich befindet. ¥ Bei Commit oder Abort mu§ der TM alle Knoten verstŠndigen, die von der Transaktion betroffen waren. ¥ ¥ ¥ Bei Knotenausfall nehmen wir an, da§ der Knoten sofort stoppt, d.h. keinerlei Operationen mehr durchfŸhrt. Der Inhalt des flŸchtigen Speichers geht verloren und der Knoten mu§ eine Restart-Operation durchfŸhren. Ein Knoten ist daher entweder aktiv (und arbeitet korrekt) oder er ist ausgefallen (und rŸhrt sich nicht) Netzfehler 6-23 ¥ ¥ ¥ Ausfall der Verbindung Fehler in Kommunikationssoftware Ausfall eines Zwischenknoten ¥ ¥ ¥ Nachrichtenverlust NachrichtenverfŠlschung Netzpartitionierung 6-24 © H.-U. Hei§, Uni-Paderborn © H.-U. Hei§, Uni-Paderborn Fehlerbehandlung 6.4 Koordination verteilter Transaktionen Viele dieser Fehler werden von unteren Schichten der Kommunikationsoftware behandelt. 6.4.1 Zentrale Koordination Auch in einem verteilten System kann ein zentraler Planer eingesetzt werden: Kšnnen sie jedoch dort nicht behoben werden, so sind sie auch fŸr das Transaktionsverwaltungssystem auf Schicht 7 sichtbar. T11 T12 T 1k1 Tc1 Tc2 TM Tckc Tm1Tm2 TM Tmkm TM Erkennung von Fehlern Sched. Die GrŸnde fŸr die Nichterreichbarkeit eines anderen Knotens kšnnen auf dieser Ebene meist nicht herausgefunden werden. RM RM RM Daten Daten Daten In der Regel ist man auf Fristablauf-Mechanismen (Time out) angewiesen 6-25 6-26 © H.-U. Hei§, Uni-Paderborn Implikationen ¥ ¥ 6.4.2 Dezentrale Koordination Sperrprotokoll (2PL) Globale Sicht auf die Sperrsituation. Wie im lokalen Fall Optimistische Verfahren Nach Abschlu§ mu§ jede Transaktion ihren Read- und Write-Set an die zentrale Validierungsstelle schicken. Nur sinnvoll bei RŸckwŠrtsvalidierung. Bei VorwŠrtsvalidierung mŸ§ten die Read- und Write-Sets aller im Netz aktiven Transaktionen bestimmt werden Nachteile ¥ ¥ ¥ ¥ © H.-U. Hei§, Uni-Paderborn Zentrale darf nicht ausfallen ( keine Ausfalltoleranz) Zentrale wird leicht zum Engpa§ (keine Skalierbarkeit) Die Autonomie der Knoten ist stark eingeschrŠnkt Auch rein lokale Transaktionen mŸssen sich an den zentralen Planer wenden (unnšt. Aufwand) 6-27 T11 T12 T1k1 Tc1 Tc2 Tckc Tm1Tm2 TM TM TM Sched. Sched. Sched. RM RM RM Daten Daten Daten 6-28 Tmkm © H.-U. Hei§, Uni-Paderborn Zwei-Phasen-Sperrprotokoll bei dezentraler Koordinierung © H.-U. Hei§, Uni-Paderborn 6.5 Verteilte Verklemmungen Bei Verwendung von Sperren kšnnen Verklemmungen (deadlocks) entstehen. ¥ ZugriffswŸnsche werden an den Knoten gesendet, der das Datum verwaltet Die Sperren fŸr jedes Datum werden daher lokal und zentral am jeweiligen Ort gefŸhrt. ¥ Der lokale Scheduler kann jedoch nicht feststellen, ob eine Transaktion an einem anderen Ort schon Sperren freigegeben hat. ¥ Ohne weitere Ma§nahmen kommt es daher zu einer Verletzung der Zweiphasen-Regel. ¥ Die Zweiphasen-Eigenschaft kann jedoch durch striktes Sperren erzwungen werden: Sperren werden solange gehalten, bis fŸr die Transaktion die Commit-Anforderung eintrifft T1 T2 lock (x) lock (y) wartet auf T1 besitzt x T2 besitzt y lock (y) lock (x) wartet auf Verklemmungen sind gekennzeichnet durch eine zyklische Wartesituation: Zur Darstellung kann man den sogenannten Wartegraphen verwenden: Die Transaktionen sind die Knoten, und es fŸhrt ein Pfeil von Knoten i nach Knoten j, wenn Ti eine Sperre benštigt, die Tj besitzt. Eine Verklemmung liegt vor, wenn der Graph Zyklen besitzt. 6-29 6-30 © H.-U. Hei§, Uni-Paderborn Beispiel fŸr das Entstehen einer verteilten Verklemmung T2 = r2 (y ) w2 ( x ) c2 T1 = r1 ( x ) w1 (y ) c1 x liegt auf Knoten A Planer A © H.-U. Hei§, Uni-Paderborn Zentrale Zyklenentdeckung Ein globaler Verklemmungsentdecker (global deadlock detector, GDD) ¥ existiert zentral an einem Knoten ¥ sammelt periodisch lokale Wartegraphen und vereinigt sie zu einem globalen Wartegraphen empfange r2 (y ) ¥ prŸft den Wartegraphen auf Zyklen setze rl2 ( y ) ¥ wŠhlt bei Verklemmung ein ãOpferÒ (abzubrechende Transaktion) aus. y liegt auf Knoten B Planer B empfange r1 ( x ) setze rl1( x ) empfange w1 (y ) empfange w2 ( x ) füge w2 ( x ) in Warteschlange füge w1 (y ) in Warteschlange füge neue Kante T2 → T1 füge neue Kante T1 → T2 in Wartegraph in Wartegraph 6-31 Wegen der nicht ganz aktuellen Information Ÿber die globale Wartesituation kšnnen sogenannte Phantom-Verklemmungen auftreten, d.h. Verklemmungen, die gar nicht existieren 6-32 © H.-U. Hei§, Uni-Paderborn Verteilte Zyklenentdeckung (Path Pushing) © H.-U. Hei§, Uni-Paderborn Beispiel Das Zusammensetzen des globalen Wartegraphen kann auch dezentral erfolgen: T1 T2 T5 T3 Tex T2 T4 (1) Jeder Knoten unterhŠlt seinen lokalen Wartegraphen als Teil des globalen Wartegraphen (2) Der restliche, unbekannte Teil des Wartegraphen wird durch einen Knoten T ex reprŠsentiert: - Wartet eine lokale Transaktion Ti auf eine Sperre an einem anderen Knoten, so gibt es eine Kante von Ti nach Tex. - Wartet eine entfernte Transaktion Tk auf eine lokale Sperre, so wird eine Kante von Tex nach Tk eingefŸgt. (3) Bei jedem EinfŸgen einer Kante wird eine ZyklenprŸfung durchgefŸhrt: - Wird ein Zyklus gefunden, der Tex nicht enthŠlt, so liegt eine lokale Verklemmung vor. - Wird ein Zyklus gefunden, der Tex enthŠlt, so liegt eine potentielle verteilte Verklemmung vor. (4) Bei potentieller Verklemmung wird der zyklische Pfad als deadlock detection message (DDM) an einen der betroffenen Knoten geschickt. (5) Beim Empfang einer DDM fŸgt der Knoten den Pfad (ohne Tex ) in den lokalen Graphen ein und fŸhrt wiederum eine ZyklenprŸfung durch (3) (6) Nach endlich vielen Schritten wird eine Verklemmung erkannt oder der Algorithmus hŠlt an. Knoten 2 erkennt einen Zyklus, der Tex nicht enthŠlt: Daher liegt eine verteilte Verklemmung vor. 6-33 6-34 Tex T3 Knoten 1 Knoten 2 Da Knoten 1 einen Zyklus entdeckt, der Tex enthŠlt, schickt er die Nachricht (Tex, T2, T3, Tex) an Knoten 2, der seinen Wartegraphen entsprechend aktualisiert: Tex T2 T4 T3 © H.-U. Hei§, Uni-Paderborn © H.-U. Hei§, Uni-Paderborn Verteilte Zyklenentdeckung (Chandy-Misra-Haas) Kriterien fŸr die Auswahl der abzubrechenden Transaktion Ein weiterer verteilter Algorithmus kommt mit weniger Nachrichten aus und produziert auch keine Phantom-Verklemmungen (Chandy-Misra-Haas-Algorithmus): Wird ein Zyklus entdeckt, so mu§ eine der beteiligten Transaktionen abgebrochen werden. ¥ Mu§ ein Proze§ warten, so schickt er eine Nachricht an den Proze§, der das angeforderte BM besitzt. Mšgliche Kriterien: ¥ Die Nachricht enthŠlt: Die ID des wartenden Prozesses, die ID des Senders, die ID des EmpfŠngers ¥ bereits geleistete Arbeit der Transaktion ¥ RŸcksetzkosten der Transaktion ¥ Der EmpfŠnger prŸft, ob er selbst wartet. Wenn ja, modifiziert er die Nachricht: ¥ die erwarteten Restkosten (Zeit) zur vollstŠndigen Bearbeitung der Transaktion Die erste Komponente bleibt, die zweite wird durch seine ID ersetzt, die dritte ist die ID des Prozesses, auf den er wartet (und an den diese Nachricht geht) ¥ die Anzahl der Zyklen in der sich eine Transaktion befindet ¥ die Anzahl der AbbrŸche, die eine Transaktion schon erlebt hat ¥ Kommt die Nachricht beim ursprŸnglichen Sender an, so liegt ein Zyklus vor (0,8,0) P4 P0 P1 P2 (0,4,6) (0,2,3) P6 P8 P3 P5 (0,5,7) 6-35 P7 6-36 © H.-U. Hei§, Uni-Paderborn © H.-U. Hei§, Uni-Paderborn Zeitstempel-Verfahren (Verklemmungsvermeidung) Beispiel fŸr Livelock ¥ In einer Verklemmungssituation wartet eine Transaktion auf sich selbst. ¥ Existiert eine globale Ordnung der Transaktionen (Zeitstempel) und erzwingt man, da§ diese Ordnung im Wartegraph berŸcksichtigt wird (topologische Sortierung), so kann man Zyklen verhindern: Ti: w(x) w(y) TSC := TSC + 1; ts(Ti) := TSC; set wli(x); ¥ Tk: w(y) w(x) /* Ti started TSC := TSC + 1; ts(Tk) := TSC; /* Tk started set wlk(y); Praktisch bedeutet das: set wli(y); /* aborted since ts(Ti)< ts(Tk) TSC := TSC + 1; ts(Ti) := TSC /* Ti restarted set wli(x); Ti darf nur dann auf Tk warten, wenn ts(Ti) < ts(Tk) oder Ti darf nur dann auf Tk warten, wenn ts(Tk) < ts(Ti) set wlk(x); /* aborted since ts(Tk)< ts(Ti) TSC := TSC + 1; ts(Tk) := TSC; /* Tk restarted set wlk(y); Andernfalls findet ein Abbruch statt. ¥ Dabei kšnnen zyklische AbbrŸche stattfinden (sogenannte Livelocks) set wli(y); /* aborted since ts(Ti)< ts(Tk) 6-37 6-38 © H.-U. Hei§, Uni-Paderborn Varianten © H.-U. Hei§, Uni-Paderborn Beispiel Fordert Ti eine Sperre, die Tk besitzt, so hat der Planer mehrere Optionen: wait-die Die bekanntesten: ãwait-dieÒ ãwound-waitÒ if ts(Ti) < ts(Tk) then Ti waits else abort Ti /* Ti ist Šlter als Tk /* Ti ist jŸnger als Tk if ts(Ti) < ts(Tk) then abort Tk else Ti waits /* Ti ist Šlter als Tk /* Ti ist jŸnger als Tk 6-39 besitzt Sperre fordert Sperre besitzt Sperre alter Prozeß ts = 10 junger Prozeß ts = 20 junger Prozeß ts = 20 alter Prozeß ts = 10 abbrechen warten wound-wait In beiden FŠllen wird die jŸngere Transaktion abgebrochen, also die Šltere Transaktion bevorzugt, wobei wound-wait Šltere Transaktionen noch stŠrker favorisiert als wait-die fordert Sperre fordert Sperre besitzt Sperre fordert Sperre besitzt Sperre alter Prozeß ts = 10 junger Prozeß ts = 20 junger Prozeß ts = 20 alter Prozeß ts = 10 abbrechen warten 6-40 © H.-U. Hei§, Uni-Paderborn 6.6 BestŠtigung verteilter Transaktionen © H.-U. Hei§, Uni-Paderborn 6.6.1 Das Zwei-Phasen-Commit-Protokoll (2PC) Die Korrektheit eines Transaktionskonzepts baut auf der AtomaritŠt der Commit-Operation. Ihre GewŠhrleistung im verteilten Fall, wo es einer Abstimmung der Knoten bedarf und AusfŠlle nicht ausgeschlossen werden kšnnen, ist schwierig Einer der involvierten Knoten (Ÿblicherweise der ãHeimatknotenÒ der Transaktion) Ÿbernimmt die Rolle des Koordinators, alle anderen sind Teilnehmer (participants) Jeder Knoten unterhŠlt eine spezielle Log-Datei, in die alle relevanten Ereignisse geschrieben werden. Ein atomares Commit-Protokoll (ACP) hat den folgenden Anforderungen zu genŸgen: (1) Alle Knoten, die eine Entscheidung treffen, treffen dieselbe Entscheidung. Das Protokoll besteht aus vier Schritten: (2) Ein Knoten kann seine Entscheidung nicht nachtrŠglich Šndern. (1) Aufforderung zur Stimmabgabe (vote request) (3) Die Entscheidung, eine Transaktion zu bestŠtigen, kann nur von allen Knoten einstimmig getroffen werden. (2) Stimmabgabe (vote) (4) Falls keine AusfŠlle vorliegen und alle Knoten zugestimmt haben, wird die Transaktion bestŠtigt. (3) Mitteilung Ÿber die Entscheidung (decision) (4) BestŠtigung der Entscheidung (acknowledge) (5) Nach Behebung eventueller AusfŠlle mu§ eine Entscheidung getroffen werden 6-41 6-42 © H.-U. Hei§, Uni-Paderborn Struktur des Zwei-Phasen-Commit-Protokolls © H.-U. Hei§, Uni-Paderborn Verhalten im Fehlerfall (erkennbar durch Fristablauf) (1) Teilnehmer wartet auf vote-request: Koordinator Teilnehmer Teilnehmer Falls keine Nachricht eintrifft, entscheidet der Teilnehmer ãAbortÒ und stoppt. (2) Koordinator wartet auf vote-messages: Phase 1 Phase 2 vote mess st age (yes/n (3) Teilnehmer wartet auf Entscheidung no) age (yes/ o) vote mess ) decision ess. (C/A decision m Falls nicht alle Stimmabgaben eingetroffen sind, entscheidet der Koordinator ãAbortÒ, sendet die entsprechenden decision-messages und stoppt. vote reque est vote requ ack mess. (C /A) Ungewißheitsperiode der Teilnehmer ack Da die Entscheidung zu diesem Zeitpunkt vielleicht bereits getroffen ist, ist eine einseitige Entscheidung wie in (1) nicht mehr mšglich. Um die Ungewi§heit zu beenden, mu§ Teilnehmer p einen anderen Teilnehmer q nach dem Ergebnis fragen (Terminierungsprotokoll). Drei Mšglichkeiten: (a) q hat die Entscheidung erhalten und gibt sie an p weiter Warten auf Nachricht (b) q hat noch nicht abgestimmt. q kann einseitig ãAbortÒ entscheiden und eine entsprechende Nachricht an p senden (c) q ist selbst in der Ungewi§heitsphase und kann p nicht helfen. 6-43 6-44 © H.-U. Hei§, Uni-Paderborn Verhalten der Knoten bei Neustart (Recovery) © H.-U. Hei§, Uni-Paderborn Eigenschaften des 2PC-Protokolls Fehlertoleranz: Toleriert KnotenausfŠlle und Kommunikationsfehler (durch Fristablauf) (1) Log enthŠlt keinen ãStart 2PCÒ-Eintrag (d.h. Knoten ist Teilnehmer) Blockierung: (a) Log enthŠlt ãCommitÒ: Verhalten gemŠ§ Recovery-Verfahren (redo) (b) Log enthŠlt ãAbortÒ: Verhalten gemŠ§ Recovery-Verfahren (undo) (c) Log enthŠlt ãYesÒ, aber weder ãAbortÒ noch ãCommitÒ: Terminierungsprotokoll starten (d) Alle anderen FŠlle: verfahren ãAbortÒ entscheiden, ãAbortÒ ins Log schreiben und wie (b) ZeitkomplexitŠt: Das 2PC-Protokoll benštigt drei Runden. Im Fehlerfall kommen zwei Runden fŸr das Terminierungsprotokoll hinzu. (2) Log enthŠlt ãStart 2PCÒ-Eintrag (d.h. Knoten ist Koordinator) NachrichtenkomplexitŠt: (a) Log enthŠlt ãCommitÒ: Verhalten gemŠ§ Recovery-Verfahren (redo) Bei n Teilnehmern und 1 Koordinator: 3n Nachrichten (b) Log enthŠlt ãAbortÒ: Verhalten gemŠ§ Recovery-Verfahren (undo) (d) Alle anderen FŠlle: verfahren 2PC blockiert, wenn bei einem Teilnehmer ein Fristablauf wŠhrend seiner Ungewi§heitsperiode entsteht und nur Knoten erreicht werden kšnnen, die sich ebenfalls in Ungewi§heit befinden. ãAbortÒ entscheiden, ãAbortÒ ins Log schreiben und wie (b) Im Fehlerfall weitere O(n2) Nachrichten (worst case) 6-45 6-46 © H.-U. Hei§, Uni-Paderborn 6.6.2 Das Drei-Phasen-Commit-Protokoll (3PC) Das 3PC-Protokoll ist eine nichtblockierende Verbesserung des 2PC-Protokolls. © H.-U. Hei§, Uni-Paderborn Struktur des Drei-Phasen-Commit-Protokolls (3PC) Koordinator Teilnehmer vote reque est 6-47 Phase 2 3PC verhindert diese Situation, indem es sicherstellt, da§ kein Knoten ãCommitÒ entschieden haben kann, solange noch ein nicht ausgefallener Knoten ungewi§ ist. Phase 3 Blockieren im 2PC resultiert aus einer Situation, in der alle nicht ausgefallenen Knoten ungewi§ sind und nicht einseitig ãAbortÒ entscheiden kšnnen, weil einige Knoten vielleicht schon ãCommitÒ entschieden haben. Phase 1 Idee: vote requ vote mess o) vote mess decision /A) no) age (yes/ 2 ss. (pre-C ack 1 st age (yes/n e decision m Teilnehmer 4 mess. (p re-C/A) 3 ack Commit Commit 6-48 5 © H.-U. Hei§, Uni-Paderborn © H.-U. Hei§, Uni-Paderborn ZustandsŸbergŠnge beim 3PC-Protokoll Koexistenz von ZustŠnden No Finished Aborted Finished Aborted Uncertain PreCommitted Committed Finished + + + - - Aborted + + + - - Uncertain + + + + - PreCommitted - - + + + Committed - - - + + rt bo A Yes : t3 Timeout 5: TP: Abort Timeout 1,2 rt : TP o Ab ou me Ti Commit Uncertain Pre-Commit Timeout 3: TP: Pre-Commit Precommitted Timeout 5: TP: Commit Timeout 4 Committed (TP: Terminierungsprotokoll) 6-49 6-50 © H.-U. Hei§, Uni-Paderborn Das 3PC-Terminierungsprotokoll © H.-U. Hei§, Uni-Paderborn Beispiel (initiiert bei Timeout 3 und 5 (Koordinator-Ausfall) Alle Teilnehmer haben ãYesÒ gestimmt. ¥ ZunŠchst wŠhlen alle aktiven Teilnehmer einen neuen Koordinator ¥ Der neue Koordinator sammelt die Zustandsinformation aller Teilnehmer und verfŠhrt nach den folgenden Regeln: Der Koordinator beginnt, ãpre-commitÒ zu verschicken und fŠllt aus, so da§ nur ein Teil der Knoten die Nachricht erhalten hat. Einige Knoten sind im Zustand ãpre-commitÒ, die anderen im Zustand ãuncertainÒ R1: Falls ein Knoten im Zustand ãfinishedÒ oder ãabortedÒ ist, lautet die Entscheidung ãAbortÒ R2: Falls irgendein Knoten im Zustand ãcommitÒ ist, lautet die Entscheidung ãCommitÒ Die Knoten im Zustand ãpre-commitÒ fallen ebenfalls aus. Die restlichen Knoten starten das Terminierungsprotokoll: R3: Sind alle Knoten im Zustand ãuncertainÒ, lautet die Entscheidung ãAbortÒ R4: Sind einige Knoten im Zustand ãpre-committedÒ, aber keiner im Zustand ãcommitÒ, sendet er ãPre-CommitÒ an alle Knoten. Nach Eingang der Quittungen (Ack) kann ãCommitÒ entschieden werden ¥ Teilnehmer, die ihren Zustand nicht melden, werden ignoriert Der (gewŠhlte) neue Koordinator sammelt die ZustŠnde der operationalen Knoten (alle ãuncertainÒ) und beschlie§t gemŠ§ Regel R3: ãAbortÒ Ausgefallene Knoten verhalten sich nach Wiederanlauf wie in 6-25, Fall 1-c: Sie starten das Terminierungsprotokoll und erfahren die Entscheidung ãAbortÒ. Obwohl sie bereits ãpre-commitÒ erhalten hatten, entscheiden sie ãAbortÒ. 6-51 6-52 © H.-U. Hei§, Uni-Paderborn © H.-U. Hei§, Uni-Paderborn 6.7 Replikation Forderung: 6.7.1 Grundlagen In verteilten Systemen kšnnen Zugriffe auf Daten Replikationstransparenz (replication transparency) ¥ ¥ ¥ ¥ ist ¥ Dem Benutzer sollte die Existenz von Replikationen verborgen bleiben ¥ Er sollte seine Ÿbliche Sicht auf die Daten haben. ¥ BezŸglich Korrektheit (ACID-Eigenschaften) sollte sich das Transaktionssystem verhalten wie im replikationsfreien Fall zu lange Zeit in Anspruch nehmen, weil sie von weit her geholt werden mŸssen kurzfristig nicht mšglich sein, weil sie exklusiv gesperrt sind kurzfristig nicht mšglich sein, weil Kommunikationsfehler auftreten lŠngerfristig nicht mšglich sein, weil der Knoten, auf dem die Daten liegen, ausgefallen Dagegen kann Abhilfe geschaffen werden, wenn man die Daten ¥ in mehreren Kopien auf unterschiedlichen Rechnern bereitstellt Dies nennt man Replikation Wir wollen die Replikation von Daten im Kontext der Transaktionen behandeln, weil dafŸr ein einfacher, aber mŠchtiger Formalismus zur VerfŸgung steht 6-53 6-54 © H.-U. Hei§, Uni-Paderborn Annahmen ¥ ¥ ¥ ¥ Am Heimatknoten einer Transaktion Ti mu§ der Transaktionsverwalter eine Operation pi(x) umsetzen in eine oder mehrere Operationen der Art pi(xA), wobei xA eine Kopie von x ist, die auf Knoten A gespeichert ist. Um herauszufinden, welche Kopien von x verfŸgbar sind, unterhŠlt der Transaktionsverwalter ein Verzeichnis, in dem alle Kopien aller Datenelemente verzeichnet sind. (Das Verzeichnis wiederum kann zentral oder dezentral, mit oder ohne Replikation realisiert sein) Der Planer (scheduler) am Ort A wei§ nichts von der Existenz weiterer Kopien. Er behandelt pi(xA), als ob nur dieses eine Exemplar existiert, d.h. er koordiniert nur Zugriffe auf dieses eine Exemplar. Bei AusfŠllen kšnnen einige Kopien nicht verfŸgbar sein. Wir nehmen an, da§ eine Kopie xA an Knoten A fŸr Ort B verfŸgbar ist, wenn A die Operation an xA korrekt ausfŸhrt und B eine entsprechende Quittung erhŠlt. 6-55 © H.-U. Hei§, Uni-Paderborn 6.7.2 Schreiben aller verfŸgbarer Kopien (Write-All-Available-Algorithmus) ¥ Leseoperationen kšnnen auf jeder beliebigen Kopie durchgefŸhrt werden (diejenige, die zu den geringsten Kosten erreichbar ist) ¥ Schreiboperationen mŸssen auf allen Kopien durchgefŸhrt werden. ¥ Ist ein Knoten A ausgefallen, so kann eine Schreiboperation an einem xA nicht durchgefŸhrt werden, d.h. die Operation ist solange zu verzšgern, bis A wieder betriebsbereit ist. (Write-All-Algorithmus) Dies ist in der Regel nicht tolerabel. ¥ Man vermeidet eine solche lange Verzšgerung, indem man die Schreiboperation nur an den aktuell erreichbaren Kopien durchfŸhrt. (Write-All-Available-Algorithmus) Damit handelt man sich jedoch neue Probleme ein. 6-56 © H.-U. Hei§, Uni-Paderborn Beispiel: Write-All-Available-Algorithmus w0 (x A ) w0 (x B ) © H.-U. Hei§, Uni-Paderborn B fällt aus c0 B B ist wieder operabel r1 (yC )w1 (x A )c1 B r2 (x B )w2 (yC ) c2 w0 (yC ) T2 liest veraltete Daten Wegen der Unerreichbarkeit einiger Kopien kšnnen globale Konflikte zwischen Operationen gelegentlich unerkannt bleiben. Daher ist eine zusŠtzliche Validierung erforderlich. Ein Teil der fŸr die Validierung notwendigen Kommunikation kann in das Commit-Protokoll integriert werden. Der ãWrite-all-Available-Algorithmus ermšglicht ãbilligeÒ Leseoperationen auf Kosten ãteurerÒ Schreiboperationen. Sei listx die Liste aller Knoten, die eine Kopie von x besitzen. Transaktionsverwalter empfŠngt Read(x) von Ti failed := false; availx := listx; start:A:= nearest(availx); send (Read(xA)) to A; wait (response); on timeout begin availx := availx \ { A}; if (availx - ∅ ) then goto start; else failed := true; end; if (failed or response = ÔrejectedÕ) then abort(Ti); else begin send (xA) to Ti; access(Ti) := access(Ti) ∪ {xA}; end; 6-57 6-58 © H.-U. Hei§, Uni-Paderborn Transaktionsverwalter empfŠngt Write(x) von Ti abort := false; missingx := ∅ ; send (Write(xA)) to all A ∈ listx;; wait (responses); on timeout of response(A) begin missingx := missingx ∪ {xA}; for each response Aj received do; if (response = ÔrejectedÕ) then abort := true; else access(Ti) := access(Ti) ∪ {xA}; end do; if (missingx = listx) then abort := true; if (abort) then Abort(Ti); else begin missing(Ti) := missing(Ti) ∪ missingx; send ack to Ti end; 6-59 © H.-U. Hei§, Uni-Paderborn Validierung von Ti abort := true; send (UNAVAILABLE(xA)) to all sites A with xA ∈ missing (Ti); wait (responses); on timeout of all abort :=false; if (abort) then begin Abort (Ti); return; end; send (AVAILABLE(xA)) to all sites A with xA ∈ access (Ti); wait (responses) on timeout of any begin Abort (Ti); return; end; Commit (Ti); return; 6-60 © H.-U. Hei§, Uni-Paderborn © H.-U. Hei§, Uni-Paderborn 6.7.3 Der PrimŠrkopie-Algorithmus 6.7.4 Der Quorum-Algorithmus Um die Kosten fŸr eine Schreiboperation zu reduzieren, erfordert der Primary-CopyAlgorithmus lediglich die €nderung einer Kopie, der PrimŠrkopie (primary copy oder master copy) Das Schreiben der anderen Kopien wird erst nach der BestŠtigung der Transaktion vollzogen. Der Quorum-Algorithmus liegt gewisserma§en ãzwischenÒ dem Primary-Copy-Verfahren (ãnur eine Kopie wird geschriebenÒ) und dem ãWrite-all-Available-Verfahren (ãalle Kopien werden geschriebenÒ). Die Grundidee besteht darin, da§ es genŸgt, eine qualifizierte Mehrheit (Quorum) der Kopien zu aktualisieren. In Kombination mit dem Zwei-Phasen-Sperren gibt es zwei Alternativen Jede Kopie xA von x erhŠlt ein nichtnegatives Gewicht (Anzahl der Stimmen). a) Eine Schreiboperation erfordert Sperren auf allen (verfŸgbaren) Kopien. Dadurch wird eine konsistente Sicht gewŠhrleistet. Leseoperation werden verzšgert, da sie auf Freigabe der Sperren warten mŸssen. Eine Leseschwelle RT (read threshold) und eine Schreibschwelle WT (write threshold) sind so definiert, da§ gilt: b) Eine Schreiboperation erfordert eine Sperre lediglich auf der PrimŠrkopie. Lesetransaktionen, die nicht unbedingt die jŸngste Version benštigen, kšnnen irgendeine Kopie lesen. Lesetransaktionen, die die jŸngste Version brauchen, mŸssen eine Lesesperre aus die PrimŠrkopie anfordern. (i) WT > TW / 2 (ii) RT + WT > TW Dabei ist TW die Summe aller Gewichte (total weight), die den Kopien von x zugewiesen wurden. 6-61 6-62 © H.-U. Hei§, Uni-Paderborn Der Quorum-Algorithmus © H.-U. Hei§, Uni-Paderborn Beispiele für Quoren Eine Menge von Kopien von x hei§t Lese-Quorum (bzw. Schreib-Quorum), wenn ihr akkumuliertes Gewicht grš§er ist als die Leseschwelle (bzw. Schreibschwelle) RT = 2 Der Transaktionsverwalter, der eine Leseoperation (bzw. Schreiboperation) empfŠngt, erzeugt daraus Leseoperationen (bzw. Schreiboperationen) fŸr jede Kopie eines LeseQuorums (bzw. Schreib-Quorums). WT=8 A B C Die Schwellenbedingung (i) bewirkt, da§ nicht mehr als eine Schreiboperation zu einem Zeitpunkt stattfinden kann. D E F Die Schwellenbedingung (ii) bewirkt, da§ nicht auf dasselbe Datenelement nebenlŠufig gelesen und geschrieben werden kann. G H I RT = 5 Lesequorum Schreibquorum Es ist au§erdem sichergestellt, da§ jedes Lese-Quorum mindestens einen aktuellen Wert enthŠlt. 6-63 6-64 WT = 5 A B C D E F G H I © H.-U. Hei§, Uni-Paderborn Der Quorum-Algorithmus © H.-U. Hei§, Uni-Paderborn Versionssteuerung bei Quoren Transaktionsverwalter empfŠngt Write(x) von Ti RT = 5 WQ := find_write_quorum; send (Write(xA)) to all A WQ; wait (responses); vmax := max {vn(xA)| A ∈ WQ} for each A ∈ WQ do vn(xA) := vmax+1; end do; send (vn(xA)) to all A ∈ WQ; send (ack) to Ti; WT = 5 Versionsnummern 5 5 3 5 5 3 5 5 3 6 5 3 6 7 7 6 7 7 4 6 4 7 7 7 7 7 7 Transaktionsverwalter empfŠngt Read(x) von Ti RQ := find_read_quorum; send (Read(xA)) to all A ∈ RQ; wait (responses); youngest := xAj where vn(xAj) = max { vn(xA)| A ∈ RQ} send (youngest) to Ti; 6-65 Vor Schreiboperation Nach Schreiboperation 6-66 Nächste Leseoperation