VS-10-Verteilte Transaktionen
Transcription
VS-10-Verteilte Transaktionen
Verteilte Systeme Kapitel 10: Verteilte Transaktionen Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/fischer Inhaltsüberblick der Vorlesung 1. Einführung und Motivation 2. Protokolle und Schichtenmodelle 3. Nachrichtenrepräsentation 4. Realisierung von Netzwerkdiensten 5. Kommunikationsmechanismen 6. Adressen, Namen und Verzeichnisdienste 7. Synchronisation 8. Replikation und Konsistenz 9. Fehlertoleranz 10.Verteilte Transaktionen 11.Sicherheit 1-2 Übersicht • Transaktionen – Flach – Geschachtelt – Verteilt • Concurrency Control – ausgewählte Probleme • Hier nur Grundlagen von Transaktionen – Spezielle und vertiefende Grundlagen in Datenbankvorlesungen 3 Einführung • Transaktionen und gegenseitiger Ausschluss sind sehr ähnlich – Gegenseitiger Ausschluss: Eine Ressource darf nur von einem Client gleichzeitig benutzt werden – Transaktionen: Ebenfalls Schutz vor gleichzeitigem Zugriff • Transaktionen gehen wesentlich weiter – Möglich, auf mehrere Ressourcen in einer einzigen atomaren Operation zuzugreifen – Diverse Arten von Fehlern können abgefangen werden – Prozesse verbleiben im Zustand vor Beginn einer Transaktion, wenn diese zurückgesetzt wird 4 Transaktionen • Transaktionen bestehen aus einer Folge von Operationen (Anfragen an Server) – Für diese gelten bestimmte Eigenschaften – Die sog. ACID-Eigenschaften • Beispiel: Flugbuchung – – – – Kunde will von Hamburg nach Dallas fliegen Kein Nonstop-Flug verfügbar; nur mit 2x umsteigen Alle drei Flüge müssen einzeln gebucht werden Kunde hat nur Interesse an der Buchung, wenn alle drei Flüge buchbar sind Implementierung durch eine Transaktion 5 Die ACID-Eigenschaften • Von Härder und Reuter vorgeschlagenes Acronym – Atomicity: alle Operationen der Transaktion oder keine – Consistency: Transaktion überführt System von einem konsistenten Zustand in den anderen – Isolation: jede Transaktion muss von der Ausführung anderer Transaktionen unabhängig bleiben – Durability: wenn Transaktion abgeschlossen ist, müssen Ergebnisse in permanentem Speicher gesichert werden 6 Transaktions-Primitive • Mit diesen lassen sich alle interessanten Operationen einer Transaktion unabhängig von der spezifischen Anwendung ausdrücken Primitive Description BEGIN_TRANSACTION Start einer Transaktion END_TRANSACTION Beende Transaktion und versuche zu commiten ABORT_TRANSACTION Breche Transaktion ab, stelle alten Zustand wieder her READ Lese Daten von Datei, Tabelle, Socket, etc. WRITE Schreibe Daten in Datei, Tabelle, Socket, etc. 7 Beispiel Flugbuchung Erfolgreiche Transaktion • BEGIN_TRANSACTION reserve HH -> FRA reserve FRA -> JFK reserve JFK -> DAL END_TRANSACTION • Alle Flüge gebucht nach Ende der Transaktion Abgebrochene Transaktion • JFK -> DAL ausgebucht • BEGIN_TRANSACTION reserve HH -> FRA reserve FRA -> JFK reserve JFK -> DAL ABORT_TRANSACTION • Keine Flüge gebucht 8 Atomarer Commit von Transaktionen • Erinnerung: Atomicity – Alle Operationen der Transaktion oder keine • Einfach: Ein-Phasen-Commit-Protokoll – Koordinator fordert Teilnehmer solange zu commit/abort auf, bis er von allen Bestätigungen gesammelt hat – Teilnehmer haben keine Reaktionsmöglichkeit • Daher: Zwei-Phasen-Commit Security - 00 Layout Master #9 Two-Phase-Commit-Protokoll • Voting Phase – Koordinator fragt jeden Teilnehmer, ob er zum Commit bereit ist (Ja/Nein) – Bereit: Sende Ja; bereite permanente Speicherung des Commits vor – Nicht bereit: Sende Nein; breche sofort ab • Completion Phase – Alle Teilnehmer sagen Ja: Sende doCommit an alle • Nach Commit senden Teilnehmer haveCommitted – Ansonsten: Sende doAbort an alle „Ja“-Sager Security - 00 Layout Master #10 Klassifizierung von Transaktionen • Häufigster Fall: sog. „flache“ Transaktionen (flat transactions) • Probleme – Sehr strikt und erlauben kein Commit von Teilergebnissen – Möglicherweise nicht effizient, da alle Operationen sequentiell ausgeführt werden – Daten sind möglicherweise verteilt, so dass mehrere Rechner beteiligt werden müssen • Lösungen – Geschachtelte Transaktionen – Verteilte Transaktionen 11 Geschachtelte Transaktionen • Erweitern Modell der flachen Transaktionen T1 – Gestatten, dass Transaktionen aus anderen Transaktionen zusammengesetzt sind Op • Transaktion auf höchster Ebene: top-level transaction Op T1 – Alle anderen: Teiltransaktionen (sub-transactions) Op1_2 T1_1 • Problem geschachtelter Transaktionen – Was passiert, wenn eine Teiltransaktion abgebrochen wird? ... Op ... T1_3 Op Op ... Op 12 Vorteile geschachtelter Transaktionen • Zusätzliche Nebenläufigkeit – Subtransactions auf der selben Hierarchieebene können nebenläufig ausgeführt werden – Beispiel: Berechnung der Summe aller Konten einer Bank • Operation branchTotal() muss für alle Konten getBalance() aufrufen • Jeder dieser Aufrufe könnte als Untertransaktion gestartet werden • Unabhängiges Commit oder Abort – Einzelne Transaktionen werden dadurch potentiell robuster – Hängt von der Anwendung ab – Elterntransaktion muss jeweils entscheiden, welche Folge ein Abort der Untertransaktion haben soll 13 Beispiel für teilweisen Commit • Beispiel der Flugbuchung aus 3 Segmenten – Angenommen, der Flug JFK DAL ist nicht buchbar • Es könnte trotzdem sinnvoll sein, die Flüge HH FRA und FRA JFK zu buchen, da dies vielleicht schon schwierig war – Dies ist im geschachtelten Modell möglich T1: Buche Flug HH DAL COMMIT ABORT COMMIT T1.1: Buche HH FRA COMMIT T1.2: Buche FRA JFK T1.3: Buche JFK DAL 14 Regeln für Commit geschachtelter Transaktionen • Transaktion darf nur abgeschlossen werden, wenn alle Untertransaktionen abgeschlossen sind • Abbruch der Elterntransaktion: Abbruch aller Subtransaktionen • Abschluss einer Untertransaktion: Entscheidet unabhängig, entweder provisorisch zu comitten oder endgültig abzubrechen • Abbruch einer Untertransaktion: Elterntransaktion entscheidet, was weiter geschieht • Commit einer Elterntransaktion: Alle provisorisch committeten Untertransaktionen können committet werden 15 Verteilte Transaktionen • Geschachtelte Transaktionen entstehen durch logische Partitionierung größerer Transaktionen – Subtransaktionen werden unter Umständen auf unterschiedlichen Rechnern ausgeführt – Subtransaktionen sind auf Blattebene logisch nicht mehr teilbare Einheiten – Beispiel: Reservierung eines einzelnen Fluges • Trotzdem können diese Subtransaktionen auf mehreren Rechnern arbeiten – Man spricht dann von verteilten Transaktionen 16 Concurrency Control • Parallele Ausführung von Transaktionen zur Steigerung der Performance – Dabei können beim Zugriff mehrere Transaktionen auf dasselbe Datum Konflikte entstehen • Unterscheidung – READ-WRITE: eine Transaktion will Datum schreiben, das eine andere gerade liest – WRITE-WRITE: Transaktionen wollen dasselbe Datum schreiben – READ-READ ist kein Konflikt! • Concurrency Control verhindert Inkonsistenzen 17 Beispiel: “Lost update”-Problem Transaktion A Transaktion B • b = account1.getBalance(); • account1.setBalance(1.1*b); • account2.withdraw(0.1*b); • b = account1.getBalance(); • account1.setBalance(1.1*b); • account3.withdraw(0.1*b); b = account1.getBalance(); 200 b = account1.getBalance(); 200 account1.setBalance(1.1*b); 220 account1.setBalance(1.1*b); 220 account2.withdraw(0.1*b); 80 account3.withdraw(0.1*b); Initialer Zustand: account1: 100, account2: 200, account3: 300 280 18 Locking • Am weitesten verbreitete Form der Concurrency Control • Einfachste Variante: Exklusive Locks – Wenn Prozesse Zugriff auf Ressource benötigen, fordert er vom Scheduler (über Transaction Manager) ein exklusives Lock an – Nach Erhalt und Abschluss der Arbeit gibt er das Lock wieder zurück – Vergabe der Locks durch Scheduler sodass nur korrekte Schedules entstehen • Pessimistic locking – Es werden mit hoher Wahrscheinlichkeit Konflikten erwartet – Gegenteil: Optimistic Locking 19 Two-Phase Locking (2PL) • Bewiesen ist, dass 2PL korrekte Schedules erstellt • Zwei Phasen – Wachstumsphase: Locks werden erhalten, aber nicht freigegeben – Schrumpfphase: Locks nur freigeben, aber nicht anfordern • Bei Erhalt einer Operation op(T,x) – Prüfung ob Konflikt mit Operationen, für die schon Locks existieren – Falls ja, wird op(T,x) verzögert, falls nein, bekommt T das Lock für x • Unterscheidung zweier Lock-Typen – Read-Lock (auch shared): mehrere Prozesse können lesend auf das gesperrte Objekt zugreifen – Write-Lock (auch exclusive): nur der sperrende Prozess kann auf das Objekt zugreifen und dieses auch schreiben 20 Sonderfälle von 2PL: konservativ und strikt • Konservativ – Zu Beginn müssen alle Locks angefordert werden – Verhindert Deadlocks – Verlust an Parallelität Operation kann erst begonnen werden, wenn alle Locks erhalten wurden • Strikt – Locks dürfen erst am Ende freigegeben werden – Verhindert Schneeballeffekt (kaskadierendes Zurücksetzen wechselseitig abhängiger Transaktionen) – Locks werden ggf. länger gehalten als erforderlich • Kombination aus beidem: potenziell wie eine sequenzielle Ausführung von Transaktionen Security - 00 Layout Master Bildquelle: http://de.wikipedia.org/w/index.php?title=Datei:2pl.png&filetimestamp=20101022190055 #21 Deadlocks • Zustand, in dem jedes Mitglied einer Gruppe von Transaktionen darauf wartet, dass ein anderes Mitglied ein Lock freigibt • Je feiner die Granularität bei der Concurrency Control, desto geringer die Gefahr von Deadlocks • Kann man Deadlocks erkennen bzw. verhindern? 22 Beispiel für Deadlock und Wait-For-Graph Transaktion T Locks a.deposit(100); write(A) b.Withdraw(100); Transaktion U b.deposit(200); write(B) a.withdraw(200); wait for T‘s lock on write(A) wait for U‘s lock on write(B) Held by Waits for A T U U T Waits for B Held by 23 Allgemein: Zyklus im Wait-For-Graph • Wenn im Wait-for-Graph ein Zyklus existiert, dann ist das System in einem Deadlock U T V 24 Distributed Deadlocks • Verteilte Transaktionen verteilte Deadlocks – Problem der Deadlocks schwieriger – Verteilte Deadlocks können u.U. nicht am lokalen WaitFor-Graphen erkannt werden • Vielmehr muss ein globaler Graph untersucht und dieser dann auf Zyklen untersucht werden 25 Beispiel für verteilten Deadlock Server Z U Held by V d.deposit(10) c Wait for W b.deposit(10) W d a.deposit(20) c.deposit(30) Wait for V b.withdr(30) c.withdr(20) Server X Held By a.withdr(20) a Held by Wait-For-Graph Held By Server Y b Wait for V W U U 26 Konstruktion des globalen Wait-For-Graphen • Konstruktion aus lokalen Wait-For-Graphen • Einfachste Lösung 1. Zentraler Koordinator sammelt lokale Graphen und konstruiert daraus den Globalen 2. Anschließend untersucht er ihn auf Deadlocks 3. Fällt Entscheidung und informiert betreffenden Server über die Notwendigkeit eines Transaktionsabbruchs 4. Gehe zu 1 • Nicht immer gut wegen der üblichen Probleme (Bottleneck, single point of failure) 27 Verteilte Ermittlung des Graphen • Mittels eines Snapshot-Algorithmus • Alternative: „Edge Chasing“-Algorithmus – Keine Konstruktion des globalen Graphen – Server erhalten für sie relevante Informationen über einige Kanten – Server versenden Wartebeziehungen in „Probe-Nachrichten“ an andere Server, um Zyklen aufzudecken • Ein Prozess erkennt einen Deadlock, wenn er eine von Ihm gesendete Nachricht wieder erhält • Wenn ein Prozess auf eine Resource wartet, sendet er eine Probe an alle anderen Prozesse (Inhalt: ID von A, Pfad der Nachricht) – If eventually the probe returns to process A, there is a circular waiting loop of blocked processes, and a deadlock is detected. Efficiently detecting such cycles in the “wait-for graph” of blocked processes is an important implementation problem. 28 Edge-Chasing: Drei Phasen • Initiation – Prozess T wartet auf U: initiiert eine Erkennung – Sendet Probe mit „T U“ • Detection (Empfang einer Probe) – Entscheidung: Deadlock und/oder Weiterleiten – Empfang von T U • Füge Kante in lokale Sicht und prüfe au Deadlocks • Wartet U? Ja, auf V: Sende T U V • Resolution – Erkennung eines Deadlock: Eine Transaktionen im Zyklus wird abgebrochen Security - 00 Layout Master #29 X weiss, dass W auf U wartet. Er gibt die Info an Y weiter. Beispiel Held by W W U V W Deadlock detected Waits for Z X C A Z schließlich fügt hinzu, dass V auf W wartet und entdeckt den Zyklus Deadlock! W U V Waits for Held by W U V U Held by B Y fügt die Information hinzu, dass U auf V wartet. Er gibt die Info an Z weiter. Waits for Y 30 Zusammenfassung • Transaktionen sind ein mächtiges Mittel zur Realisierung nebenläufigen Zugriffs auf Daten • Geschachtelte und verteilte Transaktionen erweitern das Modell, benötigen aber auch neue Algorithmen 31