Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen Diplomarbeit von cand. inform. Jens Pflüger Universität Karlsruhe Fakultät für Informatik Institut für Programmstrukturen und Datenorganisation Lehrstuhl für Systeme der Informationsverwaltung Prof. Dr.-Ing. Klemens Böhm Verantwortlicher Betreuer: Prof. Dr.-Ing. Klemens Böhm Betreuender Mitarbeiter: Dipl.-Inform. Michael Klein Tag der Anmeldung: 15. Mai 2005 Tag der Abgabe: 14. November 2005 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen 1 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen Ich erkläre hiermit, dass ich die vorliegende Arbeit selbständig verfasst und keine anderen als die angegebenen Quellen und Hilfsmittel verwendet habe. cand. inform. Jens Pflüger Karlsruhe, 14. November 2005 2 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen 3 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Inhalt Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen Inhaltsverzeichnis 1 Einführung.........................................................................................................................8 1.1 Hintergrund ................................................................................................................8 1.2 Overlays .....................................................................................................................9 1.3 Projekt-Kontext.........................................................................................................10 1.4 Aufgabenstellung ......................................................................................................11 1.5 Gliederung ................................................................................................................12 2 Grundlagen: Lanes-Overlay .............................................................................................14 2.1 Struktur.....................................................................................................................14 2.2 Operationen ..............................................................................................................16 2.2.1 Strukturaufbau ...................................................................................................16 2.2.2 Strukturwartung .................................................................................................20 2.2.3 Dienste-Management .........................................................................................23 2.2.4 Strukturoptimierung ...........................................................................................26 3 Stand der Forschung ........................................................................................................28 3.1 Problemstellung ........................................................................................................28 3.2 Ansätze in der Literatur.............................................................................................30 3.2.1 Pastry.................................................................................................................30 3.2.2 Bamboo .............................................................................................................32 3.2.3 Chord.................................................................................................................32 3.2.4 CAN (Content Addressable Network) ................................................................33 3.2.5 DynaMO............................................................................................................35 3.2.6 Tapestry.............................................................................................................36 3.2.7 Lanes .................................................................................................................38 3.3 Zusammenfassung ....................................................................................................39 4 Konzeption ......................................................................................................................42 4.1 Gesamtarchitektur .....................................................................................................42 4.2 Commit-Protokoll .....................................................................................................44 4.2.1 Besonderheiten im vorliegenden Anwendungsfall ..............................................44 4.2.2 Commit-Protokoll-Analyse ................................................................................45 4.2.3 Funktionelle Anpassungen .................................................................................50 4.2.4 Netzwerkpartitionierungen .................................................................................52 4.3 Schedule-Protokolle..................................................................................................54 4.3.1 Sequentieller Scheduler ......................................................................................54 4.3.2 Optimistischer Ansatz ........................................................................................54 4.3.3 Vorab-Sperren....................................................................................................55 4.3.4 Zwei-Phasen-Sperren .........................................................................................55 4.3.5 Zeitstempel-Verfahren .......................................................................................56 4 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Inhalt 4.3.6 Scheduler ohne Schutz .......................................................................................56 4.4 Sperrenverwaltung ....................................................................................................56 4.4.1 Verklemmungsvermeidung ................................................................................57 4.4.2 Verklemmungserkennung...................................................................................57 4.5 Log-Manager ............................................................................................................58 4.6 Isolation, Transaktionen & Sessions ..........................................................................58 4.7 Zusammenfassung ....................................................................................................60 5 Realisierung.....................................................................................................................62 5.1 DIANEmu ................................................................................................................62 5.1.1 Aufbau des Simulators .......................................................................................62 5.1.2 Implementierung von Protokollen ......................................................................63 5.1.3 Simulation .........................................................................................................63 5.2 Das Wartungstransaktionssystem ..............................................................................64 5.2.1 Transaktionsverwaltung .....................................................................................64 5.2.2 Transaktionslog..................................................................................................68 5.2.3 Scheduler ...........................................................................................................69 5.2.4 Sperren- und Verklemmungsmanagement ..........................................................70 5.2.5 Integration in DIANEmu....................................................................................71 5.3 Implementierung von Lanes & 2PC-Protokoll ...........................................................73 5.3.1 Netzwerkpartitionierungen in Lanes ...................................................................74 5.3.2 Funktionelle Anpassungen des Lanes-Protokolls ................................................74 6 Evaluierung .....................................................................................................................76 6.1 Szenario....................................................................................................................76 6.2 Effektivität................................................................................................................77 6.3 Effizienz ...................................................................................................................78 6.4 Vergleich der Scheduleprotokolle..............................................................................80 6.5 Zusammenfassung ....................................................................................................81 7 Zusammenfassung & Ausblick.........................................................................................82 7.1 Zusammenfassung ....................................................................................................82 7.2 Ausblick ...................................................................................................................83 Anhang ...................................................................................................................................86 A Abkürzungen .................................................................................................................86 B Idee eines spezifischen Lösungsansatzes für Lanes.........................................................87 C Ergänzungen zur Lanes-Spezifikation ............................................................................88 C.1 Strukturinformationen..............................................................................................88 C.2 Methoden ................................................................................................................88 D Ergänzungen zu Pastry, Chord und Tapestry .................................................................93 D.1 Pastry ......................................................................................................................93 D.2 Chord ......................................................................................................................93 D.3 Tapestry ..................................................................................................................94 E Klassen- und Paketübersicht ..........................................................................................96 E.1 Transaktionssystem..................................................................................................96 5 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Inhalt E.2 Lanes-Protokoll .......................................................................................................98 E.3 Zwei-Phasen-Commit-Protokoll.............................................................................102 E.4 Sonstiges ...............................................................................................................103 F Parameter-Einstellungen...............................................................................................104 F.1 2-Phasen-Commit-Protokoll...................................................................................104 F.2 Lanes-Protokoll......................................................................................................104 Literatur................................................................................................................................106 6 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Inhalt 7 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 1 Einführung 1 1.1 Einführung Hintergrund In den letzten Jahren spielen mobile Kommunikationssysteme wegen ihrer Flexibilität eine immer wichtiger werdende Rolle. Diese Entwicklung kam mit der Einführung von GSM (Global System for mobile Communications, [1]) im mobilen Funktelefonmarkt ins Rollen. Mittlerweile hat sich auch WLAN (Wireless LAN (IEEE 802.11), [2]) im Bereich der mobilen Rechnerkommunikation etabliert. Das heute in der Praxis gängigste Verfahren zur Unterstützung der Mobilität ist die Verwendung einer möglichst flächendeckenden Infrastruktur in Form von Funk-Basisstationen. In Zugangspunkt- oder Zellnetzwerken wird über diese festen Bezugspunkte die Kommunikation abgewickelt. GSM und WLAN funktionieren auf diese Weise. Der WLAN-Standard spezifiziert darüber hinaus aber bereits einen Kommunikationsmodus, bei dem keine feste Infrastruktur erforderlich ist und die Netzteilnehmer direkt miteinander kommunizieren können. Diese Kommunikationsform, so genannte mobile Ad-hocNetze (MANETs), ist momentan noch wenig verbreitet und wird höchstens in kleinen Netzen in sehr begrenzten Rahmen, beispielsweise bei der Vernetzung der Laptops der Teilnehmer einer Firmensitzung, eingesetzt. Die derzeitige Forschung arbeitet jedoch daran diese Netze auch in größeren Bereichen, wie zum Beispiel in Innenstädten oder auf dem Universiätscampus, einsetzen zu können und geeignete Anwendungen für diese Szenarien bereitzustellen. MANETs zeichnen sich dadurch aus, dass die Kommunikation zwischen den Netzteilnehmern, im Gegensatz zu beispielsweise GSM, ohne zusätzliche, festinstallierte Infrastrukturkomponenten organisiert wird. Die Geräte müssen daher alle anfallenden Aufgaben, wie das Routing der Nachrichten, selbst übernehmen. MANETs sind besonders in Bereichen von Interesse, in denen eine feste Infrastruktur zu teuer, zu unzuverlässig oder überhaupt nicht verfügbar ist. Ein Überblick über die genannten und weitere aktuelle mobile Kommunikationstechniken ist in [3] zu finden. Die Suche nach Informationen und die Nutzung von Dienstleistungen im Internet sind heute selbstverständlich. Auch in mobilen Netzen soll der Zugriff auf im Netz vorhandenes Wissen, auf Dokumente oder Funktionen möglich sein. Wie solche Dienste in Ad-hoc-Netzen veröffentlicht werden können, wie man sie beschreibt und wie sie von interessierten Teilnehmern gefunden werden können, steht im Zentrum des Interesses des DIANE-Projekts [10], in dessen Rahmen auch diese Arbeit entstand und das unten näher beschrieben wird. DIANE bedeutet Dienste in Ad-hoc-Netzen . Die Ankündigung von Diensten und deren semantische Suche kann in mobilen Netzen mit festen Infrastrukturkomponenten relativ einfach mit serverbasierten Verzeichnisstrukturen, wie sie ähnlich schon lange Zeit im Internet verwendet werden, realisiert werden. Die semantische Suche nach gewünschten Diensten in MANETs stellt hingegen eine große Herausforderung dar. Wegen des vollkommen dezentralen Ansatzes sind klassische serverbasierte Dienst8 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 1.2 Overlays vermittlungstechniken des Internets nicht anwendbar. Fluten von Dienstankündigungs- und Dienstsuchenachrichten im Netz ist auf Grund der begrenzten Ressourcen der Teilnehmer ebenfalls nicht geeignet. Ein gängiges Mittel, um die Nutzung dynamischer Netze seien es drahtlose Ad-hoc-Netze oder Peer-to-Peer-Netze im Festnetz effizienter zu gestalten, ist die Definition von Overlaystrukturen über diesen Netzen. Overlays definieren logische Nachbarschaftsbeziehungen zwischen Knoten und ermöglichen es, Nachrichten nicht durch Fluten, sondern gezielter im Netz zu verbreiten. Im nachfolgenden Abschnitt wird auf grundlegende Ansätze solcher Overlay-Netze eingegangen. Bei der Lösung dieser funktionellen Herausforderungen ist jedoch auch zu berücksichtigen, dass mobile Endgeräte in der Regel nur über begrenzte Ressourcen verfügen. Dazu zählen sowohl Speicherkapazität und Rechenleistung als auch die verfügbare Batterieenergie. Protokolle im Bereich von MANETs müssen diesen Limits mit einem sparsamen Ressourcenverbrauch Rechnung tragen. 1.2 Overlays Unter einem Overlay-Netz, oder kurz Overlay, versteht man eine logische Netzstruktur, die über die tatsächliche physische Netzwerktopologie gelegt wird. Somit ist ein Overlay formal eine Schicht zwischen den unteren Netzwerkschichten des ISO-OSI-Basisreferenzmodells und dessen höheren benutzerorientierten Schichten. Durch diese Zwischenschicht soll die funktionelle Lücke zwischen dem unvollkommenen Kommunikationssystem und der vom Benutzer erwarteten Funktionalität in diesem Fall eine effiziente Dienstsuche verringert werden. Dieser Mehrwert ist vor allem in den infrastrukturlosen und dynamischen Ad-hocNetzen von Vorteil. Die Verbindungen in der Overlay-Struktur sind in der Regel Multi-Hop-Verbindungen. Das bedeutet, dass die Kommunikation benachbarter Knoten im Overlay-Netz über einen Pfad aus mehreren physischen Verbindungen (1-Hop-Verbindungen) abläuft. Der Ausfall einer physischen Verbindung muss nicht zwingend den Ausfall der Overlay-Verbindung bedeuten, da normalerweise mehrere Routen zwischen den benachbarten Overlay-Knoten existieren. Nicht in jedem Fall ist daher eine Anpassung der Overlay-Struktur erforderlich, sondern es reicht aus, die physische Route anzupassen. [3] liefert einen guten Überblick über Overlays zur Dienstfindung und kategorisiert diese. Drei Dimensionen dieser Einteilung lassen sich dabei unterscheiden: Aufgeprägte vs. selbstorganisierte Overlays: Aufgeprägte Overlays sind im Voraus festgelegt und passen sich nicht der Netzcharakteristik an. Dagegen liegt der Bildung selbstorganisierter Overlays ein Satz von Regeln oder Strategien zu Grunde, wobei die aktuellen Netzeigenschaften mit einbezogen werden. Nachrichtenverteilung vs. Adressabbildung: Overlays zur Nachrichtenvermittlung beeinflussen das Routing von Nachrichten. Adressabbildende Overlays dienen hingegen dazu, einen virtuellen Adressraum auf verfügbare Geräte zu verteilen. 9 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 1.3 Projekt-Kontext Semantikfreie vs. semantikorientierte Overlays: Semantikorientierte Overlays berücksichtigen beim Aufbau, welche Dienste angeboten werden. Semantikfreie Overlays sind dienstunabhängige Strukturen. Semantikfreie, aufgeprägte Overlays sowohl mit Nachrichtenvermittlung als auch Adressabbildung spielen in der Praxis die größte Rolle. In diese Kategorie fällt das OverlayNetz Lanes, das im Rahmen von DIANE entwickelt wurde und dessen Aufbau und Funktion später noch detailliert beschrieben wird. Auch weitere Overlay-Netze, die zur Ankündigung und Suche von Diensten genutzt werden können, werden im weiteren Verlauf vorgestellt. 1.3 Projekt-Kontext Diese Arbeit ist Teil des DIANE-Projekts (Dienste in Ad-hoc-Netzen, [10]) im Rahmen des Schwerpunktprogramms 1140 der DFG. Die Ziele von DIANE sind die Entwicklung und Evaluierung von Konzepten zur effizienten Bereitstellung und Nutzung von Diensten in mobilen Ad-hoc-Netzen (MANETs). Ein mögliches Anwendungsszenario könnte hierbei ein universitäres Ad-hoc-Netz zur Unterstützung der Prüfungsvorbereitungen von Studenten sein. Die Entwicklung eines solchen Gesamtsystems erfordert die gleichzeitige Lösung vieler Teilproblemstellungen. Abbildung 1-1 liefert einen Überblick dieser im Rahmen von DIANE anfallenden Aufgaben. M O T I V A T I O N (Semantische) Dienstbeschreibung (Dezentrale) Dienstsuche (Effiziente) Dienstausführung Transparente Dienstkombination S I M U L A T I O N Abbildung 1-1: Ziele von DIANE Diese Arbeit beschäftigt sich im Wesentlichen mit der Suche nach Diensten und den dafür notwendigen Mechanismen. Diese Suche muss sowohl verteilt als auch effizient erfolgen, da in Ad-hoc-Netzen weder eine zentrale Dienstverwaltung noch hohe Ressourcenkapazitäten zur Verfügung stehen. Overlay-Strukturen bieten ein effizientes Mittel zum Auffinden von Diensten. DIANE verfolgt hier zwei Ansätze. Semantische Overlays, wie zum eispiel Dienstringe [14], gruppieren die angebotenen Dienste auf Grund ihrer semantischen Ähnlichkeiten. Alternativ hierzu existieren Overlays, wie das in dieser Arbeit verwendete Lanes-Overlay [12], die von der Semantik der angebotenen Dienste abstrahieren. Weitere Aufgabenbereiche in DIANE sind die Entwicklung einer ausdrucksstarken und zugleich automatisch vergleichbaren Dienstbeschreibung, die Schaffung von Anreizen zur Bereitstellung und Erbringung von Diensten, eine effiziente Dienstausführung und das Ermöglichen von Dienstkombinationen. Für die Evaluation der Ergebnisse wurde speziell für DIANE der Simulator DIANEmu [11] entwickelt. 10 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 1.4 Aufgabenstellung 1.4 Aufgabenstellung Allen Overlay-Strukturen gemeinsam ist, dass sie gewartet werden müssen: Knoten kommen hinzu und verlassen das Netz. Dadurch ändern sich die physischen Nachbarschaftsbeziehungen, Informationen müssen übergeben werden, usw. Insbesondere in Ad-hoc-Netzen, deren Teilnehmer sich bewegen und häufig ein- und ausgeschaltet werden, kommt die Notwendigkeit zur fortlaufenden Anpassung an die zu Grunde liegende Topologie hinzu. Es ist relativ einfach, sich für jedes dieser Probleme geeignete Mechanismen zu überlegen schwierig ist es hingegen, sicherzustellen, dass diese Mechanismen nicht nur alleine korrekt ablaufen, sondern auch dann, wenn es während ihrer Ausführung zu Fehlern kommt oder mehrere Dinge gleichzeitig geschehen. A B C D Abbildung 1-2: Lane mit 4 Knoten Die prototypische Implementierung des Lanes-Overlays im DIANE-Projekt hat gezeigt, dass hier eine fehlerfreie Implementierung sehr komplex ist. Lanes strukturiert die Knoten zu kettenartigen Overlay-Beziehungen (so genannte Lanes). Abbildung 1-2 zeigt eine Lane mit vier Knoten. Kapitel 2 beschreibt detailliert die Struktur und Algorithmen des Lanes-Overlays. Ein kurzes Beispiel soll im Folgenden das Problem noch einmal verdeutlichen. Fällt Knoten B in der in Abbildung 1-2 gezeigten Lane aus, wird ein Reparaturalgorithmus angestoßen, der A und C miteinander verbindet. Dies ist unkritisch, solange währenddessen keine weiteren Ereignisse auftreten, die ebenfalls zu Korrekturen führen, zum Beispiel Auch Knoten C fällt aus. Die von D gestarteten Reparaturmechanismen kollidieren dann mit denen von A gestarteten. Währenddessen möchte ein neuer Knoten E in die Lane integriert werden. Die Lane ist mittlerweile zu kurz und soll mit einer anderen Lane verbunden werden. Im Rahmen dieser Diplomarbeit soll zunächst untersucht werden, wie andere Implementierungen von Overlays dieses Problem angehen und wie befriedigend diese Lösungen sind, insbesondere hinsichtlich der Schwierigkeit, eine korrekte Realisierung zu verwirklichen. In einem zweiten Schritt soll dann eine möglichst generische Lösung für die korrekte Abwicklung von Reparatur- und Optimierungsaufgaben in Overlays entwickelt werden. Ausgangspunkt der Überlegungen ist es dabei, dass diese Aufgaben korrekt ablaufen würden, wenn sie transaktional geschützt werden. Damit wären sowohl Atomizität (begonnene Aufgaben werden vollständig oder gar nicht ausgeführt) als auch Isolation (gleichzeitig ablaufende Aktionen stören sich gegenseitig nicht) und Konsistenz (das Overlay ist nach Ausführung der Aktionen wieder in einem gültigen Zustand) gewährleistet. Die letzte ACID-Eigenschaft von Transaktionen die Dauerhaftigkeit spielt in diesem Zusammenhang keine besondere Rolle. 11 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 1.5 Gliederung 1.5 Gliederung Lanes dient dieser Arbeit als Beispiel für ein Overlay-Netz. Daher wird in Kapitel 2 zunächst ausführlich die Struktur des Lanes-Overlays sowie die für dessen Aufbau und Erhaltung erforderlichen Operationen beschrieben. Kapitel 3 analysiert die Probleme bei parallelen Operationen und deren Ursachen. Es wird ein Überblick über bekannte Overlay-Peer-to-Peer-Systeme gegeben und deren Funktionsweise beschrieben. Gleichzeitig wird untersucht, wie diese Systeme die Probleme paralleler Operationen behandeln bzw. lösen. Außerdem wird am Beispiel von Lanes aufgezeigt, wie komplex eine protokollindividuelle Lösung ist. In Kapitel 4 erfolgt die Entwicklung eines Konzepts für ein transaktionales Schutzsystem für Wartungsoperationen in Overlay-Netzen sowie die Beschreibung der dafür notwendigen Komponenten. Kapitel 5 zeigt die softwaretechnische Realisierung dieses Konzepts und des Lanes-Protokolls im Kontext des Simulators DIANEmu und diskutiert einzelne Implementierungsdetails. Die Evaluation der Ergebnisse gegenüber einer schutzlosen Lanes-Implementierung und eine Analyse des zusätzlichen Aufwands erfolgt in Kapitel 6. Die Arbeit schließt in Kapitel 7 mit einer kurzen Zusammenfassung der erarbeiteten Ergebnisse und einem Ausblick auf zukünftige Tätigkeiten. Der Anhang ergänzt die beschriebenen Sachverhalte. Dort sind unter anderem ein Abkürzungsverzeichnis, ein Überblick über die Implementierung, bei der Evaluation verwendete Parameter und Ergänzungen zu Lanes zu finden. 12 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 1.5 Gliederung 13 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 2 Grundlagen: Lanes-Overlay 2 Grundlagen: Lanes-Overlay Diese Arbeit entwickelt einen Schutzmechanismus gegen Fehler durch parallele Wartungsoperationen in Overlay-Netzen. Als Beispiel für ein Overlay wird Lanes herangezogen, um die auftretenden Probleme zu analysieren, die Anforderungen an ein solches Schutzsystem zu bestimmen und die Ergebnisse an einer erweiterten Implementierung von Lanes im DIANE-Simulator DIANEmu [11] zu testen. Darum ist es sinnvoll in diesem Kapitel zunächst einen genauen Blick auf Lanes zu werfen. Lanes [12] ist ein strukturiertes Overlay-Netzwerk, das im Rahmen des DIANE-Projekts entwickelt wurde. Es ermöglicht eine effiziente Dienstsuche speziell im Bereich mobiler Adhoc-Netze. Beim Entwurf von Lanes musste untersucht werden, welche Dienstsuche-Mechanismen in hochdynamischen Netzen am besten geeignet sind. Dabei standen vier Grundarten dieser Mechanismen zur Auswahl. Der zentralisierte Ansatz, wie er aus der Internet-Welt bekannt ist, eignet sich kaum für Ad-hoc-Netze. Das Fluten von Nachrichten im gesamten Netzwerk (oder einem Teil davon) ist die einfachste Methode zur Verbreitung von Dienstangeboten und Dienstanfragen. Wegen des hohen Nachrichtenaufkommens ist dieses Vorgehen aber nur in Umgebungen mit einer sehr großen Dynamik sinnvoll. Ziel bei der Entwicklung eines neuen Dienstsuchemechanismus muss demnach eine gegenüber dem Fluten bessere Effizienz bezüglich des Nachrichtenaufkommens und/oder des Erfolgs der Suche sein. Interessante Mechanismen zur Dienstsuche stellen verteilte Hashverfahren und semantisches Routing dar. In der Lanes-Struktur werden Ideen beider Verfahren kombiniert. Für eine detailliertere Beschreibung dieser Dienstsuche-Verfahren wird an dieser Stelle auf [12] oder [13] verwiesen. Jedes strukturierte Overlay-Netz definiert eine logische Struktur, die besonders günstig für die Realisierung der Aufgabe des Overlays ist, auf der tatsächlich vorhandenen zu Grunde liegenden Netztopologie. Diese Struktur muss von den beteiligten Netzknoten zunächst aufgebaut und im weiteren zeitlichen Verlauf auch bei sich ändernden Verhältnissen in der Netztopologie erhalten und optimiert werden. Hierzu sind Wartungsoperationen erforderlich. Sowohl die Struktur des Lanes-Overlays als auch die Operationen, die zu deren Wartung notwendig sind, werden im Folgenden beschrieben. 2.1 Struktur Die Lanes-Struktur ist über der Transportschicht (4. Schicht des ISO-OSI-Modells [4]) realisiert. Die Lanes-Struktur besteht aus parallelen Bahnen eng gekoppelter Knoten, wovon sich auch der Name des Protokolls ableitet (lane: engl. Bahn). Jeder Knoten kennt seinen Vorgänger- und Nachfolgerknoten (sofern vorhanden) und kommuniziert innerhalb der Lane ausschließlich mit diesen beiden. Die Kommunikation zwischen zwei benachbarten Lanes erfolgt per Anycast. Anycast ist eine Gruppenkommunikationsform. Die Netzknoten werden zu Gruppen zusammengefasst und können unter einer gemeinsamen Gruppenadresse angesprochen 14 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 2.1 Struktur Dienstankündigung werden. Anders als beim Multicast wird eine Nachricht, die an eine Gruppenadresse gesendet wurde, nicht an alle Gruppenmitglieder weitergeleitet, sondern nur an ein Mitglied, in der Regel zu dem, das dem Sender am nächsten liegt. Somit verwaltet jeder Knoten neben den Adressen von Vorgänger und Nachfolger in der Lane auch die beiden Anycast-Adressen der benachbarten linken und rechten Lane. Lane a Lane b 1 4 Lane c 2 3 any cast 5 any cast 8 6 9 7 10 Lane d any cast 11 12 Dienstsuche Abbildung 2-1: Lanes-Struktur (nach [12]) Jede Lane verwaltet einen Teil des Anycast-Adressraums und besitzt zwei Anycast-Adressen eine rechte und eine linke. Diese Adressen entsprechen dem unteren und oberen Rand des durch die Lane abgedeckten Bereichs. Die Nachbar-Lanes kennen jeweils nur eine dieser beiden Adressen, je nachdem, ob sie in der Struktur weiter links oder weiter rechts angeordnet sind. Die Aufteilung einer Lane aus Optimierungsgründen in zwei neue Lanes ist mit einer Halbierung des Adressbereichs der ursprünglichen Lane zu vergleichen. Das hat den Vorteil, dass die äußeren Adressen von dieser Halbierung unberührt bleiben, was bedeutet, dass die Nachbar-Lanes der ursprünglichen Lane die Nachbar-Anycast-Adressen nicht aktualisieren müssen. Die Aufteilung einer Lane wird später noch detailliert vorgestellt. Angebotene Dienste der Mitglieder einer Lane werden nur innerhalb dieser Lane propagiert. Somit ist jeder Knoten darüber informiert, welche Dienste in seiner Lane angeboten werden. Bei der Suche nach einem geeigneten Dienst werden zunächst die gespeicherten Dienstbeschreibungen der eigenen Lane auf Übereinstimmungen überprüft. Zusätzlich wird die Anfrage an die Nachbar-Lanes weitergegeben. Dies geschieht solange bis keine weitere Nachbar-Lane mehr existiert. Durch die Gruppierung von Knoten zu Lanes (und somit auch ihrer Dienstbeschreibungen) gelingt es der Lanes-Struktur sowohl bei Dienstankündigungen als auch bei der Dienstsuche die Reichweite gegenüber dem Fluten zu begrenzen. Die Anzahl der für die Suche nötigen Nachrichten ist auf die Zahl der Lanes beschränkt. Des Weiteren ist die Lanes-Struktur vollkommen dezentral. Das bedeutet, dass kein Knoten eine herausragende Rolle bezüglich Funktion oder Aufbau spielt. Lanes ermöglicht außerdem eine semantische Dienstsuche ohne diese Dienstsemantik für den Aufbau der Overlay-Struktur zu verwenden. Stattdessen stehen die Dimensionen der Grundstruktur von Lanes für Dienstankündigung (vertikal) und Dienstsuche (horizontal). 15 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 2.2 Operationen Lanes stellt den Kompromiss zwischen stark strukturierten Ansätzen mit guten Benutzungseigenschaften, aber hohen Wartungskosten und schwach strukturierten Netzen mit geringem Verwaltungsaufwand dar. 2.2 Operationen Um die Struktur eines Overlays zunächst aufbauen zu können und im weiteren zeitlichen Verlauf auch bei Änderungen in der zu Grunde liegenden Netztopologie zu erhalten und gegebenenfalls zu optimieren, sind Wartungsoperationen der Overlay-Mitglieder erforderlich. Dieser Abschnitt beschreibt die Operationen, die im Lanes-Protokoll definiert sind. Diese Operationen lassen sich in vier Gruppen einteilen. Zunächst muss die Lanes-Struktur aufgebaut werden. Dies geschieht durch die Operationen Login und Logoff. Im Laufe der Zeit können Fehler in der Lanes-Struktur durch Knotenausfälle oder ähnliches entstehen, die durch regelmäßige Wartung behoben werden müssen. Die dritte Operationsart auf der Struktur einer Lane sind Optimierungen. Dazu gehört zum Beispiel das Teilen einer Lane, falls deren Größe ein bestimmtes Maß übersteigt. Die letzte Gruppe von Operationen sind die Funktionen des Dienstmanagements, die die Lanes-Struktur zum Veröffentlichen oder zur Suche von Diensten nutzen. In den folgenden Unterkapiteln werden diese Operationsgruppen vorgestellt. Zur Modellierung der Protokollabläufe werden UML 2.0 Zustandsdiagramme [29] verwendet. Einige Details sind dabei allerdings in Methodenaufrufen gekapselt. Der Pseudocode dieser Methoden ist im Anhang C zu finden. Komplexe Zustände, d.h. Zustände, die selbst umfangreiche Prozeduren in Form ganzer Zustandsdiagramme kapseln, sind durch zwei kleine ovale Symbole gekennzeichnet (vgl. zum Beispiel den Zustand loggingIn in Abbildung 2-2). Die Zustandsübergangsdiagramme wurden teilweise in Zusammenarbeit mit Mathias Röhl von der Universität Rostock erstellt, wo zurzeit ebenfalls an einer Lanes-Implementierung im dortigen Simulator JAMES [9] gearbeitet wird. Die im Folgenden beschriebenen Operationen können parallel ausgeführt werden. Daher kann sich ein Knoten zu einem Zeitpunkt gleichzeitig in mehreren Zuständen befinden. Beispielsweise ist ein Knoten weiterhin im Zustand loggedIn auch wenn parallel dazu eine Optimierung der Lanes-Struktur durchgeführt wird. Bei der Betrachtung der Zustandsübergangsdiagramme ist das zu beachten. 2.2.1 Strukturaufbau Jeder Knoten, der Dienste im Lanes-Overlaynetz anbieten oder nutzen möchte, muss in genau eine Lane integriert sein. Das Einfügen eines neuen Knotens in eine Lane erfolgt durch den Login, der durch einen LoginCall des Benutzers angestoßen wird. Der Austritt aus der LanesStruktur erfolgt durch einen Logoff. Abbildung 2-2 zeigt das grundlegende Verhalten dieses Login-Logoff-Zyklus. Die Ablaufdetails von Login und Logoff wird durch die komplexen Zustände loggingIn und loggingOff modelliert. 16 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 2.2 Operationen Abbildung 2-2: Login/Logoff-Zyklus Login Soll ein neuer Knoten in eine Lane integriert werden, muss die Kettenstruktur an einer Stelle aufgebrochen werden. Die Lanes-Mitglieder an dieser Nahtstelle registrieren den neuen Knoten als Vorgänger bzw. Nachfolger. Der neue Knoten aktualisiert seinerseits seinen Vorgänger und Nachfolger. Dadurch wird die Lanes-Kette wieder geschlossen. Der Login eines neuen Knotens (Initiator) wird durch einen LoginCall des Benutzers angestoßen. Der betreffende Knoten wechselt in den komplexen Zustand loggingIn, der in Abbildung 2-3 gezeigt wird. Abbildung 2-4 und Abbildung 2-5 zeigen den Login-Vorgang aus Sicht der beiden beteiligten Lane-Mitglieder. Der Initiator sendet eine LoginRequest-Nachricht (beinhaltet die Adresse des Knotens) an alle über einen Hop erreichbaren Knoten (Broadcast). Abbildung 2-3: Login-Details (Initiator) 17 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 2.2 Operationen Empfängt ein Mitglied einer Lane diesen Request, antwortet es mit einem LoginOffer-Angebot, sofern ein Login an dieser Stelle möglich bzw. gewünscht wird (vgl. Methode acceptRequest()). Beispielsweise kann die maximale Lane-Größe erreicht sein, sodass weitere Logins abgelehnt werden. Die LoginOffer-Nachricht beinhaltet die Adressen des Lane-Mitglieds und seines Nachfolgers sowie ggf. weitere Statusangaben (z.B. Lane-Länge). Der Initiator sammelt die Angebote für eine bestimmte Zeit (vgl. Zustand WaitForOffers). Nach Ablauf dieser Zeit wählt er das für sich günstigste Angebot aus (vgl. Methode chooseBestOffer()), sendet eine LoginAccept-Nachricht an den Knoten, der das Angebot gemacht hat (Reaktor1), und wartet auf dessen Antwort. Als Heuristik für die Auswahl des geeignetsten Angebots ist Verschiedenes denkbar. Zum Beispiel werden Angebote von Knoten bevorzugt, deren Nachfolger ebenfalls ein LoginOffer gesendet haben. Eine Alternative wäre die Wahl der kürzesten Lane, falls mehrere zur Auswahl stehen, um die Lane-Größen so gering wie möglich zu halten. Abbildung 2-4: Login-Details (Reaktor 1) Für den Fall, dass der neue Knoten keine Antwort auf seinen LoginRequest erhält, startet er eine neue Lane. Nach Erhalt einer LoginAccept-Nachricht informiert das Lane-Mitglied (Reaktor 1) zunächst seinen Nachfolger (Reaktor 2) mit einer LoginInformation-Nachricht (enthält die Adresse des neuen Knotens) über den neuen Knoten. Abbildung 2-5: Login-Details (Reaktor 2) 18 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 2.2 Operationen Der Nachfolger bestätigt per LoginInformationConfirmation-Nachricht und ändert daraufhin seinen Verweis auf den Vorgänger. Sobald Reaktor 1 die Bestätigung erhalten hat, sendet er eine LoginConfirmation-Nachricht (beinhaltet die Adressen beider Nachbarn des neuen Knotens) an den Initiator und ändert den Verweis auf seinen Nachfolger. Der neue Knoten setzt die Adressen der Nachbarn auf die übermittelten Werte und ist damit Mitglied der Lane. Logoff Tritt ein Lanes-Mitglied aus der Struktur aus entsteht eine Lücke in der Kette, die wieder geschlossen werden muss. Vorgänger und Nachfolger des die Lane verlassenden Knotens müssen ihre Nachbarschaftszeiger entsprechend aktualisieren. Der Logoff eines Lane-Mitglieds wird durch einen LogoffCall des Benutzers eingeleitet, worauf je eine LogoffInformation-Nachricht an die beiden Nachbarn des Knotens, falls vorhanden, versendet wird, die die Adresse des jeweils anderen Nachbarn enthält. Danach löscht der sich abmeldende Knoten sämtliche Statusinformationen und tritt aus der Lane aus (vgl. Abbildung 2-6). Falls der ausscheidende Knoten keinen Vorgänger und Nachfolger mehr besitzt, d.h. er bildet allein eine Lane, werden die Knoten der Nachbar-Lanes per Multicast-RemoveLaneNachricht über die Auflösung der Lane informiert. Die Nachbar-Lanes passen die AnycastAdressen ihrer Lane-Nachbarn daraufhin an. Die RemoveLane-Nachricht enthält die dafür notwendigen Anycast-Adressen der Nachbarn der aufzulösenden Lane (vgl. Abbildung 2-7). Abbildung 2-6: Logoff-Details (Initiator) Empfängt ein Mitglied eine LogoffInformation-Nachricht, so aktualisiert es seinen Nachbarn (Vorgänger oder Nachfolger) mit der in der Nachricht enthaltenen Information. Der Nachfolger des ausscheidenden Knotens informiert abschließend alle Lane-Mitglieder darüber, dass die Dienstbeschreibungen dieses Knotens zu löschen sind. Das Dienstmanagement wird unten genauer betrachtet. Abbildung 2-7: Logoff-Details (Reaktor) 19 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 2.2 Operationen 2.2.2 Strukturwartung Ad-hoc-Netze zeichnen sich durch eine relativ hohe Dynamik der Netztopologie aus. Knoten verlassen das Netz und neue Knoten kommen hinzu. Zudem können Verbindungen durch die Bewegung der mobilen Teilnehmer unterbrochen werden oder Knoten durch Abschattung der Funkübertragung oder erschöpfte Batteriekapazität nicht mehr erreichbar sein. Alle genannten Faktoren gefährden die Konsistenz der Lanes-Struktur. Daher müssen Mechanismen bereitstehen, um die Lücken innerhalb einer Lane, die durch ausgefallene Knoten entstanden sind, wieder zu schließen (Intra-Lane-Verbindungen). Auch die Anycast-Verbindungen zwischen benachbarten Lanes müssen aufrechterhalten werden (Inter-Lane-Verbindungen). Intra-Lane-Verbindungen Fehlerhafte Verbindungen oder ausgefallene Knoten müssen von den anderen LanesMitgliedern erkannt und, soweit dies möglich ist, repariert werden, um die Funktionsfähigkeit der Lanes-Struktur zu gewährleisten. Hierfür werden periodische Ping-Nachrichten verwendet. Jeder Knoten sendet in festen Zeitabständen (Ping-Timer) eine LanePing-Nachricht an seinen Nachfolger, sofern ein solcher vorhanden ist. Dieser antwortet mit einer LanePong-Nachricht. Die Ping-Nachrichten prüfen die Konnektivität zwischen benachbarten Knoten und dienen zudem der periodischen Auffrischung von Zustandsinformationen. Dazu gehören zum Beispiel der Vor-Vorgänger eines Knotens oder ein Zählerwert seiner Vorgänger. Letzterer wird später für die optimierenden Operationen benötigt. Abbildung 2-8: Überblick über die Verbindungsprüfung Die Ping-Kette kann durch einen Verbindungs- oder Knotenausfall unterbrochen werden (vgl. Abbildung 2-9). Die an die Schadensstelle angrenzenden Knoten können diesen Fehler erkennen, aber nicht unterscheiden, ob es sich um einen ausgefallenen Knoten oder eine unterbrochene Verbindung handelt. Der Knoten vor einer Fehlerstelle (Fehler-Predecessor) erkennt ein Fehlverhalten anhand der ausbleibenden LanePong-Nachrichten seines potentiell 20 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 2.2 Operationen ausgefallenen Nachfolgers. Der auf den Fehler folgende Knoten (Fehler-Successsor) bemerkt den Schaden durch ausbleibende LanePing-Mitteilungen des Vorgängers. Knotenausfall Netzwerkpartitionierung 1 1 Kein LaneBroken 2 2 kein Ping gesendet 3 LaneBroken 3 LaneBroken senden nicht möglich Ping senden nicht möglich 4 4 Abbildung 2-9: Lane-Broken-Prinzip (nach [12]) Beide leiten daraufhin einen Reparaturmechanismus ein, der im Zustandsdiagramm in Abbildung 2-8 im komplexen Zustand RepairLane gekapselt ist. Die Details der zwei Ausprägungen für Fehler-Predecessor und Fehler-Successor werden in Abbildung 2-10 und Abbildung 2-11 gezeigt. Nachdem der Fehler-Successor den Fehler durch das ausbleibende LanePing erkannt hat, wird versucht, den Vor-Vorgänger, also den Fehler-Predecessor, per LaneBroken-Nachricht zu erreichen, um die Lücke in der Lane zu schließen. Abbildung 2-10: LaneRepair-Zustand (Fehler-Successor) Der Fehler-Predecessor seinerseits wartet nach Erkennung des Fehlers auf eine LaneBrokenMitteilung. Die eintreffende Nachricht wird mit einer LaneBrokenConfirmation bestätigt. Der Fehler-Successor wird zum neuen Nachfolger (vgl. Zustand updateSuccessor ). Damit ist die Reparatur für den Fehler-Predecessor abgeschlossen. Für die Entfernung der Dienstangebote des ausgefallenen Knotens sorgt bei erfolgreicher Lane-Reparatur der Fehler-Successor. Ist aber die Verbindung zum Fehler-Successor unterbrochen, wartet der Fehler-Predecessor vergebens auf eine LaneBroken-Nachricht und leitet nach einer Timeout-Zeit die Partitionierung 21 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 2.2 Operationen der Lane ein. Der Nachfolger wird entfernt (vgl. Zustand removeSuccessor ). Der restliche Lane-Teil wird dann dazu angehalten, die Dienstangebote aller dem Fehler-Predecessor nachfolgenden Knoten zu löschen. Das Dienstmanagement wird im folgenden Kapitel genauer betrachtet. Damit ist Reparatur wenn auch gescheitert für den Fehler-Predecessor wiederum beendet. Abbildung 2-11: LaneRepair-Zustand (Fehler-Predecessor) Der Fehler-Successor wartet auf die LaneBrokenConfirmation-Nachricht. Bei deren Eintreffen wird der Fehler-Predecessor als neuer Vorgänger gesetzt (vgl. Zustand updatePredecessor ). Danach wird der kompletten, nun reparierten Lane mitgeteilt, welche Dienste durch den Knotenausfall entfernt werden müssen. Im Fall, dass die LaneBrokenConfirmation-Nachricht vor dem Ablauf eines Timers nicht eingetroffen ist, wird eine Lane-Partitionierung angenommen und analog umgekehrt zum Fehler-Predecessor der Vorgänger entfernt und die restliche verbliebene Lane über den Wegfall der Dienste informiert. Inter-Lane-Verbindungen Nicht nur die Verbindungen zwischen den Knoten innerhalb einer Lane, sondern auch zwischen den Lanes können unterbrochen werden. Für diesen Fall gibt es zwei Ursachen. Ein Grund für den Verbindungsverlust stellen Netzwerkpartitionierungen dar. Netzwerkpartitionierung wird in [12] und in dieser Arbeit nicht genauer betrachtet. Im Partitionierungsfall sind keine Reparaturmaßnahmen möglich. Ein besonderes Problem stellt in diesem Rahmen auch die Wiedervereinigung zweier getrennt voneinander fortentwickelter Partitionen dar. Ohne Adressreorganisation ist dieses Problem nicht zu lösen. Die andere Ursache eines Verbindungsverlusts zwischen Lanes ist der Ausfall einer einzelnen Lane, zum Beispiel durch den Ausfall des letzten verbleibenden Knotens einer Lane. Es ist durchaus möglich, dass die Nachbar-Lanes der ausgefallenen Lane auf Grund der darunter liegenden Netzwerktopologie miteinander kommunizieren könnten, um so die Lücke zu schließen. Das Problem ist aber, dass einer Lane die Adresse der übernächsten Lane nicht bekannt ist. Es muss also eine Möglichkeit gefunden werden, wie die Adresse der übernächsten Lane herausgefunden werden kann. Abbildung 2-12 zeigt das Prinzip dieses Mechanismus. 22 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 2.2 Operationen LaneMissingResponse(8, 9, 10) I 1 II 2 3 IV III 4 5 6 7 8 V 9 VI 10 11 12 LaneMissing(8, 9) Abbildung 2-12: Lane-Missing Mehrere Lanes entstehen ausschließlich durch die Teilung von existierenden Lanes (LaneSplitting, s.u.). Werden bei der Teilung an die neu entstandenen Lanes benachbarte Adressen vergeben, entsteht eine Sortierung der Lanes bezüglich ihrer Adressen. Diese Sortierung ist grundlegend dafür, den richtigen Nachbarn der ausgefallenen Lane zu finden. Eine Lane A, die einen rechten Nachbarn vermisst, sendet eine LaneMissing-Nachricht mit ihrer rechten Adresse sowie der linken Adresse der Ausgefallenen per Broadcast. Erhält eine Lane B, die ihren linken Nachbarn vermisst, diese Nachricht, antwortet sie, sofern die angegebene linke Adresse der ausgefallenen Lane kleiner ist als ihre eigene linke Adresse. Lane III würde im Beispiel auf die LaneMissing-Nachricht von Lane IV nicht antworten, da sie links davon liegt. Die LaneMissingResponse-Nachricht enthält neben den Adressen aus der LaneMissingNachricht zusätzlich die rechte Adresse der von Lane B vermissten Lane. Diese Adresse muss nicht mit der rechten Adresse der von Lane A vermissten Lane übereinstimmen! Lane A sammelt alle Antworten und wählt auf Grund der Sortierung als neue rechte Adresse die kleinste Adresse unter den Antworten aus, die größer ist als ihre eigene linke Adresse. Das Beispiel aus Abbildung 2-12 würde demnach nach Abarbeitung aller Lanes-Ausfälle wie folgt aussehen: Lane I (1,4), Lane III (5,6), Lane IV (7, 10) und Lane VI (11,12). Das beschriebene Problem ist ein seltener Ausnahmefall, der nur im Fehlerfall eintritt, da normalerweise die Nachbar-Lanes durch den letzten verbleibenden Knoten der Lane über ihre Auflösung informiert werden. 2.2.3 Dienste-Management Jeder Knoten einer Lane kennt sämtliche in seiner Lane verfügbaren Dienste. Neben einer beliebig weit reichenden Beschreibung der Dienstsemantik wird für jeden Dienst die UnicastAdresse des Knotens vermerkt, auf dem der Dienst zu finden ist. Für das Management der Dienstbeschreibungen einer Lane sind vier Funktionen notwendig: die Ankündigung neuer Dienste innerhalb der Lane, das Löschen nicht mehr aktueller Dienstbeschreibungen, die periodische Auffrischung der Dienstbeschreibungen zur Konsistenzerhaltung und schließlich die Suche nach Diensten. 23 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 2.2 Operationen Dienste veröffentlichen (Publish) Möchte ein Knoten einen Dienst in seiner Lane veröffentlichen (vgl. Abbildung 2-13), sendet er eine ServiceOffer-Nachricht an seinen Vorgänger und seinen Nachfolger (sofern vorhanden). Diese Nachricht beinhaltet die Adresse des Anbieters, sowie die eigentliche Dienstbeschreibung. Empfängt ein Knoten eine ServiceOffer-Nachricht von seinem Nachbarknoten, speichert er die enthaltene Dienstbeschreibung und leitet die Nachricht an den gegenüberliegenden Nachbarknoten weiter. Abbildung 2-13: Dienst veröffentlichen Dienst zurückziehen (Unpublish) Analog zur Bekanntgabe eines Dienstes kann ein Knoten auch eine bereits veröffentlichte Dienstbeschreibung wieder entfernen (vgl. Abbildung 2-14). Hierzu sendet er an seinen Vorgänger und Nachfolger eine ServiceRevoke-Nachricht mit der entsprechenden Dienstbeschreibung. Erhält ein Knoten eine ServiceRevoke-Nachricht von einem Nachbarknoten, entfernt er die angegebene Dienstbeschreibung und leitet die Nachricht an den anderen Nachbarknoten weiter. Eine ServiceRevoke-Nachricht kann auch mehrere zu entfernende Dienstbeschreibungen beinhalten, da beim Verlassen der Lane absichtlich (Logoff) oder auf Grund von Fehlern alle Dienste eines Knotens auf einmal gelöscht werden müssen. Abbildung 2-14: Dienstbeschreibung(en) entfernen 24 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 2.2 Operationen Dienstsuche Möchte ein Knoten einen Dienst nutzen, muss er zunächst wissen, wo dieser zu finden ist. Zunächst prüft er, ob der gesuchte Dienst in der eigenen Lane verfügbar ist, d.h. ob er eine entsprechende Dienstbeschreibung selbst gespeichert hat. Außerdem sendet er je eine ServiceRequest-Nachricht an die benachbarten Lane-Anycast-Adressen und wartet für bestimmte Zeit auf Beantwortung (ServiceRequestResult-Nachrichten) seiner Suche, um auch weitere passende Dienste im Netz zu finden. Abbildung 2-15 zeigt das Zustandsdiagramm der Dienstsuche. Ein Knoten, der eine ServiceRequest-Nachricht empfängt, prüft, ob er eine entsprechende Dienstbeschreibung gespeichert hat. Falls ja, ist der Dienst in der Lane verfügbar und der Knoten antwortet mit einer ServiceRequestResult-Nachricht, die die Dienstbeschreibung des gefundenen Dienstes sowie die Unicast-Adresse des Dienstanbieters beinhaltet. Danach leitet er die ServiceRequest-Nachricht an die gegenüber liegende Lane weiter, falls diese existiert. Abbildung 2-15: Dienstsuche In [12] hingegen ist hier ein etwas anderes Vorgehen beschrieben. Dort werden ServiceRequestNachrichten nicht an die gegenüberliegende Lane weitergeleitet, wenn bereits ein passender Dienst gefunden wurde. Der Nachteil dieser Methode besteht darin, dass eventuell besser passende Dienste, die weiter weg liegen, nicht gefunden werden. Das soll durch die Weiterleitung der ServiceRequest-Nachrichten wie sie hier beschrieben wurde verhindert werden. Dienstauffrischung Die Ankündigung eines neuen Dienstes oder die Löschanforderung von Diensten wird schrittweise von Knoten zu Knoten durch die Lane weitergereicht. Durch Übertragungsfehler kann es passieren, dass einzelne Knoten die Aktualisierung des Dienstangebots nicht mitbekommen. Ein periodischer Auffrischungsmechanismus soll diese Inkonsistenzen wieder ausgleichen. 25 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 2.2 Operationen Abbildung 2-16: Dienstbeschreibungen aktualisieren Der erste Knoten der Lane sendet in größeren Intervallen eine RefreshRequest-Nachricht durch die Lane. Jeder Knoten fügt die Beschreibungen der von ihm angebotenen Dienste zu einer empfangenen RefreshRequest-Nachricht hinzu und leitet sie an seinen Nachfolger weiter. Der letzte Knoten sendet die Liste der Dienstbeschreibungen in einer RefreshComplete-Nachricht zurück. Beim Empfang einer solchen Nachricht aktualisiert jeder Knoten seine gespeicherten Dienstbeschreibungen der Lane. 2.2.4 Strukturoptimierung Der Aufwand des Dienst-Managements ist unmittelbar abhängig von der Größe der einzelnen Lanes-Ketten. Wenige große Lanes bedeuten eine geringe Anzahl an ServiceRequestNachrichten, die zwischen den einzelnen Ketten ausgetauscht werden müssen. Dafür nimmt der Aufwand für die Ankündigung und Löschung von Dienstbeschreibungen in diesem Fall stark zu. Genau umgekehrt verhält es sich für zu kleine Lanes. Daher ist zu gewährleisten, dass die Größe der Lanes immer in einem festen Intervall gehalten wird. Gegebenenfalls sind zu große Ketten aufzuspalten oder zu kleine Ketten wieder mit den Nachbar-Lanes zu vereinigen Lane-Teilung (Splitting) [12] schlägt für die Teilung einer Lane ein Reißverschluss-Verfahren vor. Das bedeutet, die Knoten werden abwechselnd auf die neuen Lanes verteilt. Dahinter steht die Idee, dass dadurch zwischen den beiden neuen Lanes eine möglichst gute Konnektivität geschaffen werden kann. Die Teilung einer Lane ist in Abbildung 2-17 dargestellt. Der letzte Knoten einer Lane, d.h. der Knoten ohne Nachfolger, leitet die Teilung seiner Lane durch das Senden einer SplitRequestNachricht an seinen Vorgänger ein. Der letzte Knoten ist der einzige Knoten einer Lane, der die tatsächliche Lane-Größe durch die in der Ping-Nachricht enthaltenen Vorgängerzähler kennt (Lane-Größe = Vorgängerzähler + 1). 26 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 2.2 Operationen Abbildung 2-17: Lane-Teilung Die Nachricht wird bis zum ersten Knoten weitergeleitet, wobei jeder Knoten sich in eine der beiden enthaltenen Listen einträgt. Die Listen repräsentieren die neu zu erstellenden Lanes. Der erste Knoten antwortet mit einer SplitComplete-Nachricht, die die vollständigen Listen enthält und in gleicher Weise wieder zum letzten Knoten zurück gesendet wird. Jeder Zwischenknoten leitet die SplitComplete-Nachricht weiter und passt seinen Zustand anhand der Listen an. Um die Teilung abzuschließen, müssen noch die angebotenen Dienste der beiden Lanes aktualisiert werden, was jedoch nicht explizit realisiert werden muss. Diese Aufgabe übernimmt die periodische Auffrischung der Dienste in der jeweiligen Lane. Somit kann der Zustand updateServiceOffers (*) aus der Modellierung entfernt werden. Wiedervereinigung von Lanes (Merging) Unterschreitet die Größe einer Lane einen bestimmten Wert, ist die Lanes-Struktur ebenfalls nicht mehr effizient. Die Lane wird dann mit den Nachbar-Lanes wiedervereinigt. Anders als in [12] beschrieben, wird der Vereinigungsalgorithmus nicht im Reißverschlussprinzip durchgeführt, sondern durch das Aus- und erneute Einloggen der Mitglieder der zu kleinen Lane. Die Lokalität der Nachbarschaftsbeziehungen wird durch den erneuten Login besser gewährleistet. Zudem wird auf bereits Bekanntes zurückgegriffen und weitere Fehlerquellen vermieden. Auch hier startet der letzte Knoten (d.h. der Knoten ohne Nachfolger) wegen seiner Kenntnis über die Lane-Größe die Vereinigung mit einer MergeRequest-Nachricht an die anderen LaneMitglieder. Empfängt ein Lane-Mitglied diese Nachricht, wird der Logoff eingeleitet. Gegenüber dem normalen Logoff werden aber keine LogoffInformation- und OfferRemoveNachrichten versendet, da alle anderen Knoten der Lane sich ebenfalls ausloggen und somit sämtliche Statusinformation zurückgesetzt wird. Der letzte Knoten übernimmt die Aufgabe, die Nachbarlanes über die Auflösung der Lane per RemoveLane-Nachricht zu informieren. Nach dem Logoff wird nach einer zufälligen Wartezeit mit dem erneuten Login begonnen. Durch die Wartezeit wird die Wahrscheinlichkeit paralleler Logins verringert. Nach erfolgreichem Login in eine andere Lane werden die bereitgestellten Dienste wieder bekannt gemacht. 27 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 3 Stand der Forschung 3 Stand der Forschung Die Protokollbestandteile eines Overlays, wie sie beispielsweise für Lanes im letzten Kapitel definiert wurden, sind jedes für sich korrekt ausführbar. Was geschieht jedoch, wenn mehrere von ihnen gleichzeitig ausgeführt werden? Die Beschreibungen von Lanes in Kapitel 2 klammern diesen Fall bisher aus. Eine erste prototypische Implementierung [13] hat, wie bereits erwähnt, gezeigt, dass dieser Fall nicht ignoriert werden kann, da wegen des gemeinsamen Zugriffs auf die Zustandsdaten der Knoten Schäden an der Lanes-Struktur auftreten können. Dieses Kapitel untersucht zunächst, wo genau die Probleme liegen und welche Fehler entstehen können. In einem zweiten Schritt werden dann einige Overlay-Netze, die, wie Lanes auch, zur Dienstsuche genutzt werden können, vorgestellt und ihr Verhalten in den Problemfällen analysiert. Dabei wird auch untersucht, wie allgemein diese Ansätze sind und ob sie sich beispielsweise auf Lanes übertragen lassen. 3.1 Problemstellung Dass Fehler durch die parallele Ausführung mehrerer Overlay-Wartungsoperationen auftreten, wurde bereits beschrieben. Dieser Abschnitt soll nun zeigen, welche Fehler das sind und in welche Kategorien diese eingeteilt werden können. Die beschriebenen Situationen werden anhand von Beispielen des Lanes-Overlays verdeutlicht. Alle Fehlersituationen entstehen dadurch, dass mehrere Wartungsoperationen nebenläufig die Strukturdaten des Overlays lesen und ändern. Das Lesen und Schreiben der Werte erfolgt dabei für jede der Operationen nicht punktuell, sondern sequentiell. Diese Lese-Schreib-Sequenzen der Operationen werden zu einer gemeinsamen globalen Sequenz, einem so genannten Schedule, vereinigt. Je nachdem, welche Reihenfolge die Lese- und Schreiboperationen auf den Strukturdaten aufweisen, können Inkonsistenzen entstehen. Die gleiche Problematik ist auch bei nebenläufigen Operationen in Datenbanksystemen bekannt (vgl. [8]). Die erste Fehlergruppe, die identifiziert werden kann, sind verloren gegangene Änderungen (Lost Updates). Sie entstehen, wenn zwei nebenläufige Operationen zunächst das gleiche Datenobjekt lesen und dann Änderungen vornehmen. Nur die letzte Änderung hat einen dauerhaften Effekt. Die anderen geschriebenen Werte gehen verloren. Der Schedule hat schematisch dargestellt in diesem Fall folgende Struktur: r1(x)r2(x)w1(x)w2(x) (ri(x): Leseoperation der Operation i auf Datum x, analog Schreiboperation wi(x)). Die Schreiboperation der ersten Operation geht verloren. Abbildung 3-1 zeigt ein Lanes-Beispiel. Wird ein Login zwischen der SplitRequest- und der SplitComplete-Phase durchgeführt (vgl. Kapitel 2), geht die Information darüber bei der Vollendung des Splits wieder verloren. Das liegt daran, dass bereits in der SplitRequest-Phase die Struktur der neuen Lanes festgelegt wird. Die SplitCompletePhase dient dann der Verwirklichung dieser Struktur ungeachtet etwaiger zwischenzeitlicher Änderungen. 28 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 3.1 Problemstellung Split-Request (1) Split-Complete (3) 1 2 3 4 7 5 6 Login (2) 1 3 5 2 4 6 7 Abbildung 3-1: Lost Update Ein weiterer Grund für das Auftreten von Fehlern ist das Fehlen von Abbruchoperationen. Operationen, die in mehreren Schritten durchgeführt werden, wie der Lanes-Login, können nicht zurückgesetzt werden. Wird beim Login-Vorgang (vgl. Kapitel 2) durch Reaktor 1 eine LoginInformation-Nachricht an Reaktor 2 gesendet, aktualisiert dieser seinen Verweis auf den Vorgänger. Fällt jetzt der Reaktor 1 aus oder loggt er sich absichtlich aus, muss der Login eigentlich abgebrochen werden. Hierfür ist aber keine Routine vorgesehen. Die Strukturdaten von Reaktor 2 wurden aber bereits geändert und sind somit inkonsistent. Doch selbst wenn Abbruchoperationen vorhanden wären, können Probleme dadurch auftreten, dass eine Operation Werte einer anderen Operation liest, obwohl noch nicht feststeht, ob diese erfolgreich beendet werden kann (Schema: r1(x)w1(x)r2(x)a1). Dieses Problem, für das das Beispiel des vorangegangenen Abschnitts gleichfalls angeführt werden kann, wird als Dirty Read bezeichnet. Ein weiteres Problem, das aus der Datenbankwelt bekannt ist, sind so genannte Non-repeatable Reads. Es tritt im einfachsten Fall dann auf, wenn eine Operation Werte liest, die aus ihrer Sicht zu unterschiedlichen Zeitpunkten gültig sind. Das Sequenzschema lautet in diesem Fall beispielsweise r1(x)r2(y)w2(y)r1(y)r2(x)w2(x). Operation 1 liest das Datum x bevor es von Operation 2 geändert wird, das Datum y aber erst nach dessen Änderung. Ein Beispiel für Operation 1 bei Lanes sind Dienstankündigungen, die entlang einer Lanes-Kette weitergeleitet werden. Dabei werden die Vorgänger- und Nachfolgerverweise gelesen. Durch eine nebenläufige Split-Operation kann es passieren, dass einer der beiden bereits aktualisiert wurde, der andere jedoch noch nicht. Die Dienstankündigungsnachricht wird also falsch weitergeleitet. Da bei dieser Fehlersituation die Struktur des Overlays keinen Schaden nimmt, ist dieses Problem bei reinen Leseoperationen gegebenenfalls tolerierbar. 29 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 3.2 Ansätze in der Literatur 3.2 Ansätze in der Literatur In diesem Abschnitt werden einige bekannte strukturierte Overlay-Netze, die für die Dienstbereitstellung und -suche genutzt werden können, vorgestellt und darauf hin untersucht, wie sie mit dem Problem paralleler Wartungs- und Optimierungsoperationen umgehen. Dabei ist besonders von Interesse, wie befriedigend diese Lösungen im Anwendungsbereich mobiler Ad-hoc-Netze sind und ob sie allgemein genug sind, um auf andere Overlays, wie Lanes, übertragen werden zu können. Einige der im Folgenden beschriebenen Overlays sind verteilte Hash-Tabellen (Distributed Hashtable, DHT). Die Netzknoten einer DHT realisieren einen verteilten Speicher. Die zu speichernden Objekte in unserem Fall Dienstbeschreibungen werden mit Hilfe einer Hashfunktion auf numerische Werte abgebildet. Diese Werte sind den Adressen, der Netzknoten zugeordnet, auf denen das dazugehörende Objekt gespeichert ist. Somit kann mit Hilfe einer einfachen mathematischen Berechnung überprüft werden, ob ein gesuchtes Objekt vorhanden ist und wo es sich befindet. 3.2.1 Pastry Pastry [16] ist ein generisches internetbasiertes Wide-Area-Peer-to-Peer-System für Routing und verteilte Objektspeicherung. Als Distributed Hashtable (DHT) dient es als allgemeine Grundlagen-Komponente für verschiedene P2P-Anwendungen. Die einzigen Benutzerfunktionen, die angeboten werden, sind daher das Ablegen und Auslesen von Schlüssel-ObjektPaaren im verteilten Objektspeicher. Pastry wurde ursprünglich von Microsoft Research entwickelt. Mittlerweile existiert aber mit FreePastry auch eine weitere frei verfügbare Implementierung der Rice University in Houston (USA) [17]. Struktur & Routing Das Pastry-Overlay-Netzwerk ist selbstorganisierend und besteht aus gleichberechtigten Knoten. Jeder Knoten besitzt eine Knoten-ID, die durch ein Hashverfahren aus der IP-Adresse beim Eintritt in das Pastry-Netz berechnet wird. Der Knoten-ID-Raum ist kreisförmig angeordnet (vgl. Abbildung 3-2). Dabei wird die Kreisstruktur implizit durch die Reihenfolge der IDs gebildet. Dabei müssen nicht alle IDs belegt sein. 0 2 128 -1 d 47 1 f1 d 4 6a 01 d 46 2b a d 46 a1 c d4 2 13 f d 1a 08 e R ou te (d 46 a1 c) 65 a1 fc Abbildung 3-2: Pastry-Stuktur (nach [16]) 30 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 3.2 Ansätze in der Literatur Die einzigen Operationen, die Pastry verwendet, dienen dem Aufbau und der Optimierung der in jedem Knoten für das Routing benötigten Komponenten (vgl. Anhang D). Dazu gehören unter anderem eine Routingtabelle und der so genannte Leaf-Set. Der Leaf-Set eines Knotens beinhaltet Knoten, deren IDs zur eigenen ID am ähnlichsten sind. Mit Hilfe dieser Komponenten läuft das Routing folgendermaßen ab. Trifft eine Nachricht mit Schlüssel D bei einem Knoten mit Knoten-ID A ein, wird zunächst überprüft, ob sich D innerhalb der Werte des Leaf-Sets befindet. Falls ja, wird die Nachricht direkt zu dem Knoten des Leaf-Sets weitergeleitet, dessen Knoten-ID am wenigsten von D abweicht. Sonst wird die Nachricht mit Hilfe der Routingtabelle an einen Knoten weitergeleitet, dessen Knoten-ID-Präfix um ein Bit mehr mit D s ID übereinstimmt. Einfügen neuer Knoten Kommt ein Knoten X neu ins Pastry-Netz hinzu, müssen die Routingtabelle und der Leaf-Set zunächst initialisiert werden. Nachdem der neue Knoten seine Knoten-ID berechnet hat, bittet er einen ihm bekannten Pastry-Knoten Y, eine spezielle Join-Nachricht mit Schlüssel X zu versenden. Die Nachricht wird ganz normal durch das Pastry-Netz zu dem Knoten Z weitergeleitet, dessen Knoten-ID am besten mit Schlüssel X übereinstimmt. Alle Knoten, die die Join-Nachricht weitergeleitet haben, inklusive Y und Z, senden ihre Zustandsinformation an X. Aus den erhaltenen Informationen kann X seine Strukturinformationen berechnen. Zum Schluss teilt er seine Ankunft seinen Nachbarn mit, damit eine Anpassung der Routingeinträge erfolgen kann. Fehlerbehandlung & Knotenaustritt Verlassen Knoten das Netz absichtlich oder durch Ausfall werden die Zustandsinformationen der anderen Knoten durch eine faule Änderungsstrategie angepasst. Das bedeutet, dass die Einträge bezüglich des ausgeschiedenen Knotens in den Routingtabellen und den Leaf-Sets der benachbarten Knoten erst dann entfernt werden, wenn diese bei einer zukünftigen Operation das Fehlen des Knotens bemerken. Bewertung Die implizite Ringstruktur von Pastry erfordert keine Wartung, da die Knotenreihenfolge einzig von der natürlichen Ordnung der Knoten-IDs abhängt. Inkonsistenzen durch parallele Operationen, vor allem den Logins, aber auch durch Knotenausfälle sind möglich, stellen aber keine Problem dar. Werden die Routingtabellen oder die Leaf-Sets fehlerhaft gesetzt, nimmt lediglich die Performanz des Routing ab, da der Routing-Mechanismus von Natur aus schon fehlertolerant ist. Zudem sind die Routingtabellen weniger anfällig für den parallelen Zugriff mehrerer Operationen, da diese auf verschiedenen Bereichen der Tabelle operieren. Fehler in den Leaf-Sets sind bei Pastry am gefährlichsten. Um die Leaf-Sets möglichst korrekt zu halten werden sie periodisch oder nach Änderungen unter den Nachbarn ausgetauscht, um Inkonsistenzen zu erkennen und zu beheben. Pastry wurde für das Internet konzipiert, sodass die beschriebenen Maßnahmen ausreichen. Diese Maßnahmen sind jedoch speziell auf die Gegebenheiten und Anforderungen von Pastry abgestimmt. Eine Übertragung dieser protokollspezifischen Lösungen zur Fehlerbehebung auf andere Overlays ist daher kaum möglich. 31 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 3.2 Ansätze in der Literatur FreePastry, eine frei verfügbare Java-Implementierung der Rice University in Houston (USA), verwendet das Prinzip des wechselseitigen Ausschlusses (Semaphoren), um den Zugriff auf exklusive Ressourcen zu steuern. In Java wird hierfür das Schlüsselwort synchronized verwendet. Dadurch können parallele Zugriffe auf die lokalen Strukturwerte durch mehrere Operationen verhindert werden. Die globale Konsistenz kann dadurch aber dennoch nicht garantiert werden. Zusammenfassend lässt sich also feststellen, dass die Fehlerkorrekturansätze von Pastry nicht den mit dieser Arbeit verfolgten Zielen erfolgreicher Schutz vor parallelen Operationen und ein allgemeiner Ansatz genügen. 3.2.2 Bamboo Bamboo ([18], [19]) ist eine Distributed Hashtable (DHT) auf der Basis von Pastry. Dabei wurden Anpassungen im Routing und in der Bestimmung von nahen Nachbarn vorgenommen, um auch bei hohen Zuwachs- und Abwanderungsraten von Knoten eine Bandbreite-sparende Lösung zu ermöglichen. Versuche mit FreePastry, einer Implementierung von Pastry der Rice University, haben nämlich gezeigt, dass bei hohen Zu- und Abwanderungsraten ein großer Teil der Lookups fehlschlagen. Als Grund hierfür nennen S. Rhea et al. in [19], dass Knoten auf Grund der langen Wartezeiten das Netz wieder verlassen, obwohl sich noch Anfragen in ihren Warteschlagen befinden. In Phasen der Ruhe erholte sich das Netz gut, doch leider sind solche Phasen in der Realität selten. Trotz dieses Mangels wurde Pastry als Grundlage für Bamboo gewählt. Ein Hauptunterschied zu Pastry besteht darin, statt reaktivem Recovery periodische Korrekturen durchzuführen. Die grundlegenden PastryMechanismen und die Zustandsinformationen der Knoten bleiben davon aber unberührt, sodass bei Bamboo kein anderes Verhalten bezüglich des Problems paralleler Operationen zu erwarten ist. 3.2.3 Chord Chord ([21]) ist ein weiteres Internet-Peer-to-Peer-Protokoll für Routing und verteilte Objektspeicherung mit viel Ähnlichkeit mit Pastry. Chord wurde am MIT in Cambridge entwickelt und legt den Fokus auf die Realisierung der Funktionalität einer verteilten Hashtabelle. Struktur & Routing Beim Chord-Overlay-Netzwerk handelt es sich, wie bei Pastry, ebenfalls um ein Ringnetzwerk, wobei die Knoten in der Reihenfolge ihrer IDs angeordnet sind. Objekte werden auf dem Knoten gespeichert, der bezüglich des Objektschlüssels die nächsthöhere ID hat. Die Nachfolger eines Knotens werden in einer so genannten Fingertabelle verwaltet (vgl. Anhang D). Dort wird gespeichert, welcher Knoten für welches Schlüsselintervall verantwortlich ist, um eine gezielte Weiterleitung der Nachrichten zu ermöglichen. Einfügen neuer Knoten Möchte ein Knoten in das Netzwerk eingegliedert werden, muss er einen bereits im Netz angemeldeten Knoten kontaktieren. Der neue Knoten erhält die Fingertabelle des 32 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 3.2 Ansätze in der Literatur Netzwerkmitglieds, um seine eigene Fingertabelle zu initialisieren. Danach werden die anderen Knoten über das neue Mitglied informiert, um ihre Fingertabellen anzupassen. Als letzter Schritt müssen die Objekte, die zukünftig auf Grund ihrer ID von dem neuen Knoten zu verwalten sind, von dessen Nachfolger übertragen werden. Fehlerbehandlung & Knotenaustritt Die bis jetzt beschriebenen Mechanismen sind noch nicht einsetzbar, da in der Praxis Knoten ausfallen, sodass Lücken im Ring entstehen, oder mehrere Knoten gleichzeitig hinzukommen, wodurch Überschneidungen möglich sind. Um Störungen des Netzwerks besser begegnen zu können, speichert ein Knoten nicht nur seinen direkten Nachfolger sondern mehrere. Das Hinzukommen und Wegfallen von Knoten kann dazu führen, dass die Nachfolgerlisten und die Fingertabellen schadhaft werden, wobei Fehler in den Fingertabellen nur zu einer verlangsamten Suche führen. Um Fehler durch neue Knoten, ausgefallene Knoten oder fehlerhafte Nachrichten zu beheben, führt jeder Knoten periodisch eine Stabilisierungsroutine aus. Jeder Knoten führt dabei eine Selbstsuche im Netzwerk durch, d.h. er befragt seine Nachbarn nach ihren Vorgängern und Nachfolgern. Dadurch können noch nicht erkannte Lücken oder neue Knoten gefunden werden. Auf Grund dieses Fehlerprotokolls muss jeder Peer neben seinem Nachfolger also auch seinen Vorgänger speichern. Bewertung Für die korrekte Funktionsweise des Chord-Protokolls ist eine periodische Ausführung der Stabilisierungsroutine zwingend erforderlich. Kann das durch zu viele hinzukommende oder wegfallende Knoten nicht mehr garantiert werden, sind Ringbrüche und Partitionierungen möglich [20]. Zusätzlich können parallele Logins, die in mehreren Schritten die Fingertabellen aktualisieren, zu Fehlern in der Struktur führen. Das Chord-Protokoll baut bei der Fehlerbekämpfung zum einen auf Verringerung der Auswirkung von Fehlern durch Redundanzen und zum anderen auf die Korrektur von Fehlern durch die Stabilisierungsroutine. Beides kann aber in einer hochdynamischen Umgebung Fehler nicht beheben, sodass die ChordLösungen für den vorliegenden Fall bei Ad-hoc-Netzen nicht geeignet sind. Aber auch bei den niedrigeren Fehlerwahrscheinlichkeiten im Internet können die in dieser Arbeit betrachteten Probleme auftreten. Chord bietet keine Mechanismen an, um diese Probleme explizit zu lösen. Stattdessen wird die Behebung ihrer Auswirkungen den beschriebenen Fehlerkorrekturverfahren überlassen. Auch die Chord-Verfahren sind nicht auf andere Overlays übertragbar. Insgesamt zeigen sie sich damit ebenfalls als nicht zufriedenstellend für die hier betrachteten Probleme. 3.2.4 CAN (Content Addressable Network) Das Content Addressable Network (CAN) ([22]) ist ein weiterer Vertreter eines strukturierten Overlay-Netzes zur Realisierung einer verteilten Hashtabelle der Universität von Kalifornien in Berkeley. 33 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 3.2 Ansätze in der Literatur Struktur & Routing Anders als bei den bisher beschriebenen Overlay-Netzen, handelt es sich bei CAN nicht um ein Ringnetzwerk. Stattdessen bildet ein d-dimensionaler begrenzter Koordinatenraum die Basis für das CAN-Netzwerk. Jeder Knoten des Netzwerks verwaltet einen Teil dieses Raums, eine so genannte Zone, und somit die Objekte, deren Schlüssel mittels einer Hashfunktion auf einen Punkt in dieser Zone abgebildet wurden. Die Zonen sind untereinander disjunkt und die Vereinigung aller Zonen ergibt den gesamten Koordinatenraum. y 1 2 4 01 110 111 5 3 00 10 0 1 0 1 0 5 1 3 VID 1 0 1 2 4 x Abbildung 3-3: Beispiel CAN-Zonen (nach [22]) Kommen neue Knoten ins Netz hinzu, müssen bestehende Zonen geteilt werden, um diese Regeln einzuhalten. Dabei werden die Zonen abwechselnd entlang der einzelnen Dimensionen halbiert. Es entsteht somit ein binäres Buddy-System. Das bedeutet, dass je zwei wohldefinierte Zonen aus einer gemeinsamen Zone durch Halbierung hervorgehen bzw. zu einer Zone wiedervereinigt werden können. Dieser Sachverhalt kann durch einen binären Baum (vgl. Abbildung 3-3) dargestellt werden. Dabei kann jeder Zone eine eindeutige virtuelle ID (VID) zugeordnet werden. Bei jeder Halbierung wird diese um ein Bit verlängert, je nachdem, ob die Zone die linke oder rechte Hälfte darstellt. Diese virtuellen Adressen dienen auch zur Adressierung der Knoten, die die jeweiligen Zonen verwalten. Das Routing durch das CAN-Netz wird durch die Speicherung der IP-Adressen und der VIDs der Nachbarknoten jedes Knotens unterstützt. Als Nachbarn eines Knotens werden alle Knoten bezeichnet, deren Zonen eine gemeinsame Grenze mit der Zone dieses Knotens besitzen. Das Routing erfolgt anhand des Greedy-Prinzips entlang der Dimensionen des CAN-Raums. Das bedeutet, dass ein Knoten eine ankommende Nachricht immer zu dem Nachbar weiterleitet, dessen VID am ähnlichsten zur Empfängeradresse ist. Natürlich existieren mehrere mögliche Wege zu einem Ziel, was dazu genutzt wird, ausgefallene Knoten zu umgehen. Einfügen neuer Knoten Um einen neuen Knoten in das CAN-Netzwerk zu integrieren, muss ihm eine eigene Zone zugewiesen werden. Hierzu kontaktiert der neue Knoten einen Netzwerkknoten, dessen Zone halbiert und inklusive der verwalteten Information zur Hälfte an den neuen Knoten übermittelt wird. Die VIDs der Knoten wird um ein Bit vergrößert. Als nächster Schritt müssen die Nachbarschaften aktualisiert werden. Die Menge der Nachbarknoten ist eine Teilmenge der Nachbarn des alten Knotens inklusive des neuen Knotens. Nach der Berechnung der jeweiligen 34 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 3.2 Ansätze in der Literatur Nachbarn müssen diese auch über die Änderung informiert werden. Hierzu werden UpdateNachrichten gefolgt von periodischen Refresh-Nachrichten versendet. Fehlerbehandlung & Knotenaustritt Verlässt ein Knoten das Netzwerk, ist sicherzustellen, dass die von ihm verwaltete Zone durch einen anderen Knoten den so genannten Takeover-Knoten übernommen wird. Durch das Buddy-System ist nicht immer eine Wiedervereinigung der Zonen möglich. Gegebenfalls muss der Takeover-Knoten temporär mehrere Zonen verwalten und hat somit auch mehrere VIDs. Um langfristig wieder eine Zone pro Knoten zu erhalten, wird in [22] ein Algorithmus vorgestellt. Die Nachbarn eines ausgefallenen Knotens erkennen den Fehler durch ausbleibende RefreshNachrichten. Sie entfernen daraufhin den Knoten aus ihrer Nachbarliste und versuchen den Takeover-Knoten zu kontaktieren. Hierfür wird eine spezielle Recovery-Nachricht an die VID des ausgefallenen Knoten gesendet. Die anderen Peers routen die Nachricht immer näher zum Takeover-Knoten, da dessen VID der VID des ausgefallenen Knotens am ähnlichsten ist. Dadurch lernt der Takeover-Knoten die Nachbarn seiner neu übernommenen Zone kennen und umgekehrt. Bei mehrfachen Fehlern kann dieses Verfahren jedoch scheitern, da RecoveryNachrichten ins Leere laufen. Eine periodische Stabilisierungsprozedur ähnlich zu Chord soll dieses Problem lösen. Bewertung Die CAN-Struktur ist die komplexeste der betrachteten Overlay-Netze. Sie ist strenger als beispielsweise die Lanes-Struktur, da neben den oberen und unteren Nachbarknoten auch die linken und rechten explizit gespeichert werden müssen. Letztere werden bei Lanes durch das Anycast-Routing ersetzt. Der Erhalt dieser CAN-Struktur ist dementsprechend aufwändig. Bei mehrfachen Fehlern, Knotenausfällen und nebenläufigen Strukturoperationen sind inkonsistente Zustände leicht möglich. Sowohl der Login als auch der Logoff eines Knotens stellen komplexe Operationen dar, die umfangreiche Reorganisationen der Netzstruktur nach sich ziehen. Dass auch Inkonsistenzen durch parallele Operationen möglich sind, ist daher leicht einzusehen. Der Stabilisierungsalgorithmus kann an dieser Situation nur wenig ändern. Er benötigt gewisse Ruhephasen, um die vollständige Konsistenz der Zustandinformation wieder herzustellen. Diese Art der Fehlerbehebung ist im hochdynamischen Umfeld von Ad-hocNetzen und für das betrachtete Problem paralleler Operationen nicht ausreichend. Zudem sind die CAN-Mechanismen, wie auch die von Pastry und Chord, protokollspezifisch. 3.2.5 DynaMO Das Overlay DynaMO der Freien Universität Berlin [28] wurde als Peer-to-Peer-System für mobile Netze entwickelt. DynaMO greift die Struktur des internetbasierten Peer-to-PeerSystems Pastry auf und passt es an die Gegebenheiten im mobilen Netzwerk-Bereich an. Der Hauptunterschied zu Pastry besteht in der Wahl der Knoten-IDs. Pastry verfolgt einen TopDown-Ansatz und berechnet die Knoten-IDs aus der Netzwerkadresse, dem Public Key oder ähnlichem. Dadurch entsteht im Bezug auf die darunterliegende Netzwerktopologie eine zufällige Verteilung der IDs. DynaMO hingegen berücksichtigt die Struktur des 35 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 3.2 Ansätze in der Literatur darunterliegenden Netzwerks bei der Vergabe der IDs, verfolgt also einen Bottom-Up-Ansatz. Das Ziel dabei ist, ähnliche IDs an Knoten zu vergeben, die in diesem Basisnetzwerk benachbart sind. Dadurch wird erreicht, dass das Routing im Overlay-Netz möglichst ähnlich zum darunterliegenden physikalischen Netzwerk erfolgt. Um die Lokalität der IDs zu gewährleisten verwendet DynaMO das so genannte Landmarking. Einige Knoten sind als Landmarken ausgezeichnet und verwalten jeweils einen Teil des ID-Raumes. Die IDs der Landmarken sind fest und im ganzen Netz bekannt. Ein neu hinzukommender Knoten kontaktiert die Landmarken, um herauszufinden, welche ihm am nächsten liegt. Von diesem LandmarkenKnoten erhält er daraufhin eine seinem Standort entsprechende ID. DynaMO übernimmt die Mechanismen sind von Pastry erweitert diese, um Lokalitätseigenschaften besser zu nutzen und dadurch Ressourcen zu sparen. Damit ist DynaMO für die Anwendung in MANETs besser geeignet als Pastry. Die hier betrachtete Problematik findet aber auch in DynaMO keine tiefere Aufmerksamkeit, obwohl sich bei der Dynamik mobiler Netze die Frage noch dringender stellt. 3.2.6 Tapestry Die Routing-Infrastruktur Tapestry [24] ist das letzte Overlay-Peer-to-Peer-System, das im Rahmen dieser Arbeit untersucht werden soll. Es ist Teil der von Oceanstore [27], einem System zur globalen verteilten Datenspeicherung der Universität von Kalifornien in Berkeley. Struktur & Routing Jeder Tapestry-Knoten wird durch eine Knoten-ID eindeutig identifiziert. Die einzige Information, die jeder Knoten besitzt, ist die so genannte Neighbor Map, eine Routingtabelle, die sowohl die Knoten-IDs als auch die IP-Adressen benachbarter Knoten enthält. Tapestry folgt, wie Pastry auch, dem Plaxton-Routingschema. Das bedeutet, Nachrichten werden anhand des längsten Präfixes der Knoten-ID weitergeleitet, bis der gewünschte Knoten gefunden wurde. Abbildung 3-4 gibt ein Beispiel für das Routing mit dem Zielknoten 4598 an. Gleichzeitig lässt sich daran erkennen, dass Tapestry im Unterschied zu beispielsweise Pastry oder Chord, die eine Ringstruktur bilden, keine besondere Struktur auf dem darunter liegenden Netz etabliert, sondern einen durch die Neighbor Maps erzeugten Graphen aufweist. 84F8 3E98 0325 9098 0098 2888 7598 1598 4598 D598 87CA 2118 Abbildung 3-4: Beispiel Tapestry-Routing (nach [26]) 36 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 3.2 Ansätze in der Literatur Um veröffentlichte Objekte im Netz schnell zu finden, wird ein verteiltes Verzeichnissystem aufgebaut. Für die hier betrachteten Probleme paralleler Operationen spielt diese Zeigerstruktur aber eine untergeordnete Rolle. Die Beschreibung dieses Aspekts ist daher in den Anhang D verschoben. Einfügen neuer Knoten Damit sich ein neuer Knoten N in ein bestehendes Tapestry-Netz einloggen kann, muss er zunächst seine Knoten-ID berechnen. Zudem ist es notwendig einen Peer des Netzes zu kennen, der als Gateway-Knoten bezeichnet wird. Die Neighbor Map des neu hinzukommenden Knoten muss initialisiert werden. Dies geschieht in einem iterativen Verfahren, das die Nachbarknoten, die in der Neighbor Map enthalten sind, kontaktiert und mit Hilfe derer Neighbor Maps die eigene Routingtabelle vervollständigt bis eine hinreichende Genauigkeit erreicht wurde. Als Ausgangspunkt für das Verfahren wird die Neighbor Map des Gateway-Knotens verwendet. Der Login schließt mit der Übernahme der Objektverweise ab. Fehlerbehandlung & Knotenaustritt Verlässt ein Knoten freiwillig das Netz, teilt er dies zuvor den Knoten aus seiner Neighbor Map mit. Die Nachbarn passen ihre Routingtabellen daraufhin an. Nun können die Objektverweise vom ausscheidenden Knoten auf seinen Surrogatknoten in gleicher Weise übertragen werden, wie beim Einfügen eines neuen Knotens. Im Fall eines unfreiwilligen Knotenausfalls müssen die anderen Knoten die entstandene Lücke erkennen und wieder schließen. Ausgefallene Knoten oder unterbrochene Verbindungen werden von den Peers durch periodische Beacon-Nachrichten erkannt. Daraufhin können fehlerhafte Einträge aus den Neighbor Maps entfernt werden. Das Objektrepublishing erfolgt ebenfalls periodisch. Dadurch werden automatisch Objektverweise, die vom ausgefallenen Knoten verwaltet wurden an den neuen Surrogatknoten weitergeleitet und die Server-Pointer neu gesetzt. Alte Server-Pointer werden nach einer bestimmten Zeit entfernt. Bewertung Tapestry definiert keine neue Struktur über dem physischen Netzwerk. Stattdessen erweitert es die physische Struktur um ein Zeigersystem, das zum Auffinden von gespeicherten Objekten dient. Tapestry kann daher auf Wartungsoperationen zur Strukturerhaltung verzichten. Beim komplexen Login-Vorgang, der dazu dient die Routingtabellen des neuen Knoten und dessen Nachbarn zu aktualisieren, sind Inkonsistenzen durch parallele Operationen durchaus möglich. Die Weiterleitung von Nachrichten auf Basis von Routingtabellen ist aber sehr robust, da der Zielknoten über verschiedene Routen erreicht werden kann. Die periodische Aktualisierung der Zeigerstruktur ist für den Anwendungsbereich von Tapestry im Internet bei niedrigen Fehlerwahrscheinlichkeiten völlig ausreichend. Temporäre Inkonsistenzen werden toleriert. Für Netzwerke mit hoher Dynamik ist Tapestry nicht geeignet. Zhao, Kubiatowicz und Joseph weisen darauf auch in [24] hin. Auch hier gilt, wie bei den zuvor betrachteten Overlays, dass der 37 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 3.2 Ansätze in der Literatur Ansatz durch die spezielle Struktur und die Verwendung von Routingtabellen nicht allgemein genug ist, um auch auf andere Overlays angewendet zu werden. 3.2.7 Lanes Alle bisher beschriebenen Ansätze waren individuell auf die Anforderungen des jeweiligen Overlay-Netzes zugeschnitten. Auch für Lanes wäre eine protokollspezifische Lösung denkbar, um Fehler durch Knotenausfälle und parallele Operationen zu beheben. Im Folgenden wird eine Möglichkeit für eine solche Lösung für Lanes vorgestellt. Grundlage dieses Fehlermechanismus ist die Priorisierung der einzelnen Protokollteile, wodurch eine Totalordnung auf den Operationen induziert wird. Eine Operation mit Priorität x kann eine andere mit Priorität y abbrechen, wenn x<y gilt. Zudem wird eine Operation mit niedrigerer Priorität als die der laufenden Operation nicht gestartet. Eine mögliche Ordnung der LanesOperationen könnte, beginnend mit der höchsten Priorität, wie folgt lauten: LaneBroken, LaneSplit, LaneMerge, Logoff, Login. Das kann damit begründet werden, dass das LaneBroken als Reparatur-Mechanismus elementar für die Funktionalität von Lanes ist. Darauf folgen die langlaufenden Operationen Split und Merge. Die kurzen Operationen Login und Logoff haben die geringste Priorität. Grundsätzlich ist aber auch eine andere Ordnung möglich. Zu einem Zeitpunkt kann stets nur eine Operation ausgeführt werden. Dadurch wird ein paralleles Ändern der Strukturdaten durch mehrere Operationen verhindert. Für die kritischen Strukturvariablen Vorgängeradresse, Nachfolgeradresse und Adressen der linken und rechten Nachbar-Lane werden temporäre Kopien angelegt, auf denen Änderungen vorgenommen werden können. Nach erfolgreicher Ausführung einer Operation werden die temporären Werte wieder in die Originalvariablen zurückkopiert. Der Pseudocode in Abbildung 3-5 beschreibt den grundlegenden Ablauf einer Operation. Durch ein Flag wird angezeigt, welche Operation aktuell ausgeführt wird. Der Index des Bit-Arrays entspricht der Priorität. operation(int priority) { if(bitArray.selectedIndex() > priority){ //Operation niederer Priorität abbrechen cancelOperation(bitArray.selectedIndex()); bitArray[priority] = 1; copyTempVars(); //Temporäre Variablen initialisieren //Operationscode ... bitArray[priority] = 0; putTempVars(); //Temporäre Werte zurückschreiben } } cancelOperation(int priority) { bitArray[priority] = 0; send(AbortMessage);//Versende Abbruchnachricht (z.B. LoginAbort) } Abbildung 3-5: Prioritätsgesteuerte Operationsausführung 38 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 3.3 Zusammenfassung Um den Abbruch einer Operation zu behandeln, wird jeder Teil des Protokolls individuell um einen Zustand Cancel ergänzt. Dieser Zustand wird erreicht, wenn durch eine höher priorisierte Operation auf demselben Knoten die Funktion cancelOperation() aufgerufen wird oder eine Abort-Nachricht von anderen Knoten eintrifft. Daraufhin wird das entsprechende Bit zurückgesetzt und die temporären Werte verworfen. Im ersten Fall wird zudem eine AbortNachricht an die anderen beteiligten Knoten gesendet. Zusätzlich zu dem neuen Zustand ist noch eine Prüfung zu Beginn der Operation erforderlich, ob diese bezüglich ihrer Priorität momentan überhaupt ausgeführt werden kann. Zustandsdiagramme, die den LoginMechanismus mit den beschrieben Erweiterungen darstellen sind im Anhang B zu finden. Das beschriebene Verfahren besitzt kein atomares Commitment, was zu Problemen führt, da die Knoten unterschiedlich lange mit einer Operation beschäftigt sind und somit zu unterschiedlichen Zeitpunkten abschließen. Zum Beispiel hat der Reaktor 2 beim Lanes-Login am wenigsten Aufwand und beendet den Vorgang deshalb als Erster. Ist eine Operation einmal abgeschlossen, d.h. die temporären Variablenwerte wurden in die Originalvariablen zurückkopiert, kann sie nicht mehr rückgängig gemacht werden. Eine danach noch eintreffende Abbruch-Nachricht eines anderen Knotens kann nicht mehr behandelt werden. Die Erweiterung jeder Operation des Overlay-Protokolls um einen Mechanismus für das atomare Commitment, beispielsweise das 2-Phasen-Commitprotokoll, ist nicht praktikabel. Stattdessen werden Wartefunktionen am Ende der Operationsausführung jedes Knotens verwendet, um annähernd zeitgleiche Fertigstellungen der Operationen zu erreichen. Die aktuell existierende Lanes-Implementierung [13] verwendet zwar nicht das soeben beschriebene Verfahren, versucht aber in ähnlicher Weise die einzelnen Fehlersituationen, die eintreten können, zu behandeln. Diese Implementierung, aber auch das beschriebene Verfahren zeigen deutlich, dass eine individuelle Erweiterung jeder Operation des Overlay-Protokolls aufwändig, komplex, schwer überschaubar und dadurch auch kaum wartbar ist. Dadurch wird die Entwicklung von neuen korrekten Overlays sehr erschwert. 3.3 Zusammenfassung Dieses Kapitel hat gezeigt, welche Probleme durch Operationen, die nebenläufig auf den Strukturdaten des Overlays arbeiten, auftreten können. Die anschließende Analyse verschiedener Overlay-Strukturen hat verschiedene Strategien aufgezeigt, wie mit diesen Problemen umgegangen werden kann. Alle beschriebenen Lösungsansätze für den Umgang mit Fehlern sind protokollspezifisch auf die jeweiligen Overlay-Strukturen und Einsatzgebiete angepasst. Keine Lösung ist damit aber allgemein genug, um einfach auf andere Overlays angewendet werden zu können. Die Entwicklung korrekter Fehlermaßnahmen ist sehr komplex. Die potenziell eintretenden Fehlerfälle sind schwer zu überschauen. Der entstehende Code ist aus diesem Grund auch schlecht wartbar. Bei der Entwicklung neuer Overlays muss deshalb viel Aufwand in Fehlerbehebungsmechanismen investiert werden. Eine generische, wiederverwendbare Komponente wäre in diesem Fall wünschenswert. Natürlich haben individuelle Lösungen aber auch den Vorteil die Besonderheiten und Gegebenheiten des jeweiligen Protokolls einbeziehen zu können und daher eine für jeden Fall möglichst effiziente Lösung zu erreichen. Einige der betrachteten Ansätze verwenden reaktive Fehlerkorrekturmaßnahmen in Form von periodischen Reorganisationsmaßnahmen. Temporäre Inkonsistenzen werden toleriert. Im Internet, wo im Vergleich zu mobilen Ad-hoc-Netzen, mit einer geringeren Fehlerrate und 39 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 3.3 Zusammenfassung weniger Fluktuationen der Teilnehmerzahl zu rechnen ist, reichen diese Maßnahmen in der Regel aus. Unter hohen Belastungen können diese Prozeduren die strukturelle Konsistenz der Netze aber nicht mehr sichern. In diesem Fall wäre ein proaktiver Ansatz, d.h. die Vermeidung von Fehlern, geeigneter. Einige Overlays verwenden fehlertolerante Strukturen, beispielsweise Routingtabellen, die Inkonsistenzen leichter verkraften, bauen erst gar keine expliziten neuen Strukturen auf, wie zum Beispiel Tapestry, oder definieren ihre Struktur nur implizit. Dadurch sind weniger und zudem fehlerresistentere Wartungsoperationen möglich. Die vorgestellte prioritätsbasierte Lösung für Lanes hat zum Ziel, die Operationen zu einer globalen Sequenz zu ordnen, um nebenläufige Datenzugriffe zu verhindern. Dieser Ansatz hat aber den Nachteil, dass dadurch vollkommen auf die parallele Ausführung von Operationen verzichtet wird, auch wenn diese möglich wäre. Zudem können durch die Verzögerungen bei den wartenden Operationen Timeouts in den Overlay-Algorithmen auftreten. Keiner der gefundenen Ansätze zeigte sich für den Einsatz in dynamischen mobilen Ad-hocNetzen als gut geeignet und zugleich generisch genug, um in verschiedenen Overlays zum Einsatz zu kommen. 40 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 3.3 Zusammenfassung 41 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 4 Konzeption 4 Konzeption Es wurde bereits ausführlich beschrieben, dass Overlay-Netze insbesondere in Ad-hocNetzen gewartet werden müssen, um auf neu hinzukommende Knoten, Knoten, die das Netz verlassen, oder Topologieänderungen des darunter liegenden Netzes reagieren zu können. Jeder Knoten verwaltet einen Teil der dafür nötigen Strukturinformationen des Overlays. Werden mehrere Operationen, die Änderungen an diesen Zustandsdaten vornehmen, gleichzeitig ausgeführt, können Dirty Reads, Inconsistent Reads und Lost Updates auftreten, wie es Kapitel 3 gezeigt hat. Bei der prototypischen Implementierung von Lanes konnten diese Effekte beobachtet werden. Dort wurde versucht durch Hinzufügen von Fehlerzuständen und Abbruchoperationen in den Protokollablauf, die einzelnen Protokollbestandteile zu isolieren. Es hat sich aber gezeigt, dass auf diese Weise eine fehlerfreie Implementierung sehr komplex und unüberschaubar wird. Eine Analyse anderer Overlay-Netze ergab ebenfalls keine zufriedenstellende Lösung. Die Grundidee, die hinter dieser Arbeit steht, ist daher, die Fehlerbehandlung nicht im OverlayProtokoll, sondern in einem eigenständigen System zu realisieren. Dabei orientiert sich diese Arbeit an Datenbanksystemen, wo die gleichen Probleme auftreten und mit Hilfe von Transaktionen gelöst werden können. Dieses Kapitel beschreibt, wie ein solches Transaktionssystem für die Wartungsoperationen in Overlay-Netzen aussehen kann, welche Komponenten und Techniken erforderlich sind und wo die Probleme und Unterschiede zu klassischen Transaktionen in Datenbanksystemen liegen. Zunächst wird ein Überblick über das ganze System gegeben, bevor auf die einzelnen benötigten Teile genau eingegangen wird. 4.1 Gesamtarchitektur Das zu realisierende System ist vergleichbar mit einem verteilten Datenbanksystem (vgl. Abbildung 4-1). Jeder Knoten kann dabei als Server für den Zugriff auf die von ihm verwalteten Strukturdaten angesehen werden. Die Operationen des darüber liegenden Overlay-Protokolls werden durch globale Transaktionen zwischen den beteiligten Knoten geschützt. Das System ist homogen, da in der Regel alle Knoten eines Overlays gleichberechtigt agieren und die gleichen Strukturen verwalten. Somit ist ein verteilter Transaktionsmanager und die von ihm benötigte Komponenten zu entwickeln. Durch diese Transaktionsschicht wird verhindert, dass die Algorithmen des Overlay-Protokolls direkt auf die Strukturdaten zugreifen. Abbildung 4-2 zeigt, wie sich diese neue Schicht und ihre Komponenten, die im Folgenden beschrieben werden, zu einem Gesamtsystem zusammenfügen. Das System muss die ACID-Eigenschaften der Wartungstransaktion garantieren können. Dabei spielt die Dauerhaftigkeit im vorliegenden Fall eine eher untergeordnete Rolle, da Knotenausfälle ein Zurücksetzen des jeweiligen Knotenzustands beim Wiederanlauf zur Folge haben. Die Wahrung von Atomizität, Konsistenz und Isolation erfolgt in zwei Ebenen. 42 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 4.1 Gesamtarchitektur 1 T 2 5 TA K 3 T 4 Abbildung 4-1: Lanes vs. Verteiltes DBMS Zum einen müssen die Knoten diese Eigenschaften lokal garantieren (lokale Konsistenz). Hierzu greifen die Overlay-Operationen über Transaktionen auf die Strukturinformationen zu. Ein Scheduler serialisiert Lese- und Schreiboperationen dieser Transaktionen so, dass keine Inkonsistenzen möglich sind, bzw. macht gegebenenfalls fehlerhafte Transaktionen rückgängig. Prinzipiell sind alle gängigen Schedule-Protokolle (vgl. [8]), beispielsweise sperrenbasierte Verfahren, hier denkbar. Je nachdem, welcher Scheduler gewählt wurde, sind verschiedene zusätzliche Komponenten für dessen Funktion notwendig. Im Allgemeinen sind das ein LogManager, eine Sperrenverwaltung sowie ein System zur Erkennung, Beseitigung und Vermeidung von Verklemmungen. Abbildung 4-2: Gesamt-Architektur 43 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 4.2 Commit-Protokoll Neben der Wahrung der lokalen Konsistenz muss darüber hinaus auch die Atomizität und somit auch die Konsistenz zwischen den Knoten untereinander sichergestellt werden können (globale Konsistenz). Das bedeutet, dass die Knoten sich gegenseitig darüber abstimmen müssen, ob und wann ein Commit der Wartungsoperationen stattfinden kann. Zur Lösung dieses Problems wird eines von vielen in der Literatur ([5], [7]) beschriebenen Commit-Protokolle eingesetzt. Das Commit-Protokoll und das Overlay-Protokoll, in diesem Fall das Lanes-Protokoll, arbeiten unabhängig voneinander. Dem Overlay-Protokoll steht eine wohldefinierte Schnittstelle des Transaktionsmanagers zur Verfügung, mit deren Hilfe der Zugriff auf den Knotenzustand und dessen Änderung ermöglicht wird. Trotz der weitgehenden Analogie zu verteilten Datenbanksystemen gibt es auch Unterschiede. Im Gegensatz zu Datenbanken ist die Anzahl zu schützender Daten gering. Bei Lanes sind das nur sieben Werte (Vorgänger, Nachfolger, Vor-Vorgänger, linke und rechte Lane-Adresse, linke und rechte Nachbar-Lane). Zudem ist die Anzahl paralleler Operationen auf einem Knoten eher niedrig. Dauerhaftigkeit spielt, wie bereits beschrieben, keine Rolle. Ein interessanter Aspekt ist darüber hinaus, dass die zu schützenden Zustandsdaten, insbesondere die Knotenadressen, gleichzeitig als Metadaten für das verteilte Datenbanksystem dienen. Diese Unterschiede sind auch der Grund dafür, dass statt der Verwendung eines verfügbaren verteilten Datenbanksystems eine individuelle Entwicklung des Transaktionssystems geeigneter ist. 4.2 Commit-Protokoll Das so genannte Consensus-Problem [6] beschreibt eine Gruppe von Problemen. Die Gemeinsamkeit dieser Probleme besteht darin, dass sich eine Menge von Prozessen auf einen gemeinsamen Wert einigen müssen. Dabei spielen zwei Funktionen eine wesentliche Rolle: Vorschlagen (engl.: propose) und Entscheiden (engl.: decide). Zunächst wird von jedem Prozess ein möglicher finaler Wert vorgeschlagen. Daraufhin entscheidet jeder Prozess, welcher der vorgeschlagenen Werte gewählt werden soll. Dabei sind folgende Randbedingungen zu beachten: 1. Keine 2 Prozesse entscheiden unterschiedlich (Einigung) 2. Jeder korrekte Prozess erreicht letztendlich eine Entscheidung (Terminierung) 3. Die Prozesse müssen sich für einen vorgeschlagenen Wert entscheiden (Gültigkeit) Das atomare Commitment von Transaktionen, d.h. die gemeinsame Entscheidung aller beteiligten Knoten eines verteilten DBMS auf Commit oder Abort, ist eine spezielle Ausprägung des Consensus-Problems und im vorliegenden Fall der Wartung von OverlayNetzen von Interesse. Der transaktionale Schutz der Wartungsoperationen kann helfen, die Atomizität und Isolation dieser Operationen zu garantieren. 4.2.1 Besonderheiten im vorliegenden Anwendungsfall Um die Atomizität und Isolation von Wartungsoperationen in Overlay-Netzen sicherzustellen, muss wie gerade beschrieben am Ende dieser Operationen eine gemeinsame Entscheidung der beteiligten Knoten über den Erfolg oder Misserfolg der Operation getroffen werden. Dabei eignet sich ein analoges Vorgehen wie beim Commitment bei Transaktionen in Datenbanksystemen. Folgende Besonderheiten sind im vorliegenden Fall jedoch zu beachten: 44 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 4.2 Commit-Protokoll 1. Knoten können ausfallen: Im Gegensatz zu VDBMS können die anderen Knoten trotz des Ausfalls mit der getroffenen Entscheidung abschließen. Der Knotenausfall wird in höherer Ebene vom Overlay-Protokoll behandelt. Dabei ist es unerheblich, ob der ausgefallene Knoten die Aktion noch ausführen konnte oder nicht, da nach einem Ausfall sämtliche Statusinformation gelöscht wird und der Knoten sich erneut im Overlay-Netz anmelden muss. 2. Verbindungen zwischen Knoten können abbrechen: Gehen Nachrichten zwischen Knoten verloren, so wird ein Verbindungsabbruch zwischen diesen Knoten vermutet. Ist ein Knoten dadurch isoliert, so muss dieser Knoten das erkennen. Die Isolation eines Knotens ist gleichbedeutend mit dem unfreiwilligen Ausscheiden aus dem Overlay-Netz, d.h. der Knoten ist aus der Netzstruktur ausgeschlossen und muss sich wie im ersten Fall ggf. neu anmelden. Die anderen Knoten können nicht unterscheiden, ob ein Knoten ausgefallen ist oder nur die Verbindung unterbrochen wurde. Die Konsistenz der Statusdaten wird durch den Ausfall von Knoten oder durch Wegfallen der Verbindung also nicht verletzt. Dadurch lassen sich die Protokolle etwas vereinfachen. Insbesondere ist keine Sicherung des Fortgangs des Commits durch Logdateien erforderlich, da keine Wiederanlauf-Recovery nach einem Knotenausfall erforderlich ist. 4.2.2 Commit-Protokoll-Analyse Beim vorliegenden Problem sind aus der Literatur ([5], [7]) viele Verfahren zur Lösung des Commit-Problems am Ende verteilter Transaktionen bekannt. Im Folgenden werden mögliche Protokolllösungen vorgestellt und auf ihre Tauglichkeit für den Einsatz in mobilen Ad-hocNetzen hin untersucht. Lineares 2-Phasen-Commit-Protokoll Beim linearen 2-Phasen-Commit übernimmt ein Knoten die Rolle eines Koordinators. Der Koordinator legt eine fest definierte lineare Ordnung der Knoten fest (vgl. Abbildung 4-3). Er selbst ist der erste Knoten. Soll die Transaktion abgeschlossen werden, sendet der Koordinator eine Ready-Meldung an den Nachfolgeknoten. Ist dieser zu einem Commit bereit gibt er seinerseits eine Ready-Meldung an seinen Nachfolger weiter. Andernfalls sendet er eine AbortNachricht an den Vorgängerknoten zurück und führt das Abort aus. Die nachfolgenden Knoten erkennen den Abort durch einen Timeout auf Grund der fehlenden Ready-Meldung. Abbildung 4-3: lineares 2PC Empfängt der letzte Knoten die Ready-Meldung (Die Knotenreihenfolge wird in der ReadyMeldung mitgeschickt.) antwortet er mit einer Ack-Nachricht, falls er mit dem Commit einverstanden ist, und führt das Commit aus. Die anderen Knoten leiten das Ack bis zum Koordinator weiter und führen ebenfalls das Commit aus. 45 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 4.2 Commit-Protokoll Auftretende Fehler in der ersten Phase, d.h. während der Kommunikation von Koordinator weg, sind unkritisch. Der Wegfall einer Ready-Nachricht würde von den nachfolgenden Knoten durch einen Timeout erkannt und ein Abort eingeleitet. Die restlichen Knoten könnten auf das resultierende Ausbleiben eines Acks ebenfalls mit Abort reagieren. Damit wäre auch der Wegfall einer Abort-Nachricht auf dem Rückweg kein Problem mehr, da alle vorangehenden Knoten das Abort sowieso nach einem Timeout durchführen. Der kritische Punkt liegt im Verlust einer Ack-Nachricht, da alle Knoten nach und einschließlich dem Sender des Acks bereits ein Commit ausgeführt haben, alle vorangehenden Knoten aber auf Grund des Fehlens einer Nachricht auf Abort entscheiden würden. Es ist also einem Knoten nicht möglich festzustellen, ob er isoliert von den anderen Knoten ist. Umgekehrt kann ein isolierter Knoten dazu führen, dass die restlichen Knoten zu einem inkonsistenten Ergebnis kommen. Das lineare 2-Phasen-Commit-Protokoll benötigt nur 2(N-1) Nachrichten (N: Anzahl der beteiligten Subtransaktionen) und scheint somit für den mobilen Bereich, in dem Ressourcen knapp sind und somit möglichst wenig Aufwand getrieben werden soll, geeignet zu sein. Dieser Vorteil wird jedoch durch den Verlust der Parallelität erkauft, da die Teilnehmer sequentiell nacheinander über Commit oder Abort entscheiden. Ein weiterer Nachteil dieses Verfahrens ist das Aufprägen der linearen Struktur ungeachtet der Struktur des dazugehörenden OverlayNetzes. Die möglichen Inkonsistenzen beim Ausfall von Knoten sind aber der entscheidende Grund, das lineare 2-Phasen-Commitprotokoll nicht zu wählen. Zentrales 2-Phasen-Commit-Protokoll Das zentrale 2-Phasen-Commit-Protokoll verwendet wie im linearen Fall zwei Schritte: Abstimmung und Entscheidung. Die Entscheidungsfindung geschieht jedoch von allen Teilnehmern gleichzeitig unter Koordination eines Koordinators. Abbildung 4-4 und Abbildung 4-5 zeigen den Protokollablauf für den Koordinator bzw. für die Teilnehmer. Sobald die laufende Operation abgeschlossen werden soll, sendet der Koordinator eine Prepare-Nachricht an alle Teilnehmer und wechselt in den Prepare-Zustand. Dort wartet er auf die ankommenden Abstimmungsergebnisse der Teilnehmer. Die Teilnehmer antworten auf eine Prepare-Nachricht mit einer Ready-Meldung und wechseln ebenfalls in den PrepareZustand, um auf das Abstimmungsergebnis vom Koordinator zu warten, oder senden eine NotReady-Nachricht, falls sie zu einem erfolgreichen Abschluss der Operation nicht bereit sind. Im letzten Fall führen sie sofort ein Abort aus, da durch ihre negative Stimme der Koordinator sicher nicht mehr auf Commit entscheiden kann. Abbildung 4-4: 2PC Koordinator 46 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 4.2 Commit-Protokoll Empfängt der Koordinator ausschließlich Ready-Nachrichten entscheidet er auf Commit. Fehlen Antworten bis zum Ablauf eines Timers oder ist unter den Abstimmungsnachrichten der Teilnehmer eine NotReady-Nachricht wird die Operation abgebrochen. Die Teilnehmer warten auf die Entscheidung des Koordinators und bestätigen sie mit einem Ack. Nach dem Erhalt der Acks der Teilnehmer für die Entscheidung oder einem weiteren Timeout ist die Operation seitens des Koordinators beendet. Auch die Teilnehmer führen die vom Koordinator erhaltene Aktion aus und schließen ihre Transaktion ab. Abbildung 4-5: 2PC Teilnehmer Während des gesamten Protokollablaufs können aber wiederum Fehler auftreten, die vor allem in der Unsicherheitsphase, d.h. den Zeitraum zwischen dem Senden der Ready-Nachricht des Teilnehmers und der Ankunft der Entscheidung des Koordinators zu Problemen führen. Im Original-2PC-Protokoll führt ein Fehler an dieser Stelle zur Blockade des Protokolls bis der Koordinator dem Teilnehmer die Entscheidung mitteilen kann. In dem vorliegenden speziellen Fall des Schutzes von Wartungsoperationen, kann ein Terminierungsprotokoll angegeben werden, um eine Blockade zu vermeiden. Es ist in den Zustandsdiagrammen hellgrau und gestrichelt hervorgehoben und wird im Folgenden zusammen mit den möglichen Fehlersituationen beschrieben. Das Ausbleiben von Nachrichten wird mit Hilfe von Timern abgehandelt. Bei ausbleibender Prepare-Nachricht reagiert der Teilnehmer nach Ablauf der festgelegten Maximaldauer der Transaktion mit einem Abbruch. Der Koordinator erkennt den Fehler anhand der ausbleibenden Abstimmungsnachricht. Gehen Abstimmungsnachrichten verloren wird laut Protokoll ohnehin vom Koordinator auf Abort entschieden. Probleme bereiten jedoch Nachrichtenausfälle in der Unsicherheitsphase, also das Ausbleiben der Entscheidung des Koordinators oder der Acks. Diese Fälle müssen wie bereits erwähnt über ein Terminierungsprotokoll gelöst werden. Empfängt ein Teilnehmer keine Entscheidung vom Koordinator innerhalb einer festgelegten Zeitspanne, sendet er eine MissingResult-Nachricht an 47 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 4.2 Commit-Protokoll alle an der Operation beteiligten Knoten. Kennt ein anderer Knoten die Entscheidung des Koordinators, gibt er sie per MissingResultAnswer-Nachricht an den anfragenden Knoten zurück, sodass dieser die Operation ebenfalls korrekt abschließen kann. Erhält ein Knoten keine Antwort auf seine Anfrage, geht er davon aus, dass die Verbindung zu den anderen Knoten unterbrochen wurde. In diesem Fall ist aber auch die Overlay-Struktur nicht mehr zu reparieren, sodass eine ConnectionLost-Meldung an den Anwendungsprozess des Knotens zurückgeliefert wird, um ein Logout zu erzwingen. Die anderen Knoten bleiben davon unberührt. Sie können die Operation gemäß Koordinatorentscheidung beenden. Der Verlust eines Knotens wird später durch die Overlay-Mechanismen erkannt und durch eine neue Wartungsoperation behoben. An dieser Stelle ist der Unterschied zum normalen 2PC-Protokoll. Dort muss der Teilnehmer auf die Antwort des Koordinators warten und ist solange blockiert. Der Verlust der Ack-Nachrichten ist nicht so kritisch, da der Koordinator davon ausgeht, dass sich der Teilnehmer die Entscheidung von den anderen Teilnehmern besorgt. Erhält der Koordinator jedoch keine Acks, kann er davon ausgehen, dass er selbst der isolierte Knoten ist und verlässt das Overlay-Netz. Falls der Koordinator ausfällt, hat das zur Folge, dass alle an der Transaktion beteiligten Knoten das Netz verlassen und sich neu einloggen müssen. Das könnte durch einen Mechanismus vermieden werden, der es erlaubt, einen neuen Koordinator zu wählen. Ein solcher Mechanismus ist nicht trivial und führt seinerseits zu neuen Schwierigkeiten, die gelöst werden müssen. Der Aufwand, der durch das Overlay-Netz inklusive dem Schutzsystem verursacht wird, muss so gering wie möglich gehalten werden, da sonst die Gefahr besteht den beschriebenen Vorteil gegenüber der naiven Fluten-Methode zu verlieren. In dieser Arbeit wird daher auf ein Verfahren zur Koordinatorwahl verzichtet. Das 2-Phasen-Commit-Protokoll stellt eine mögliche Lösung im vorliegenden Anwendungsfall dar. Es besitzt einen Kommunikationsaufwand von 4(N-1) Nachrichten. 3-Phasen-Commit-Protokoll Das 3-Phasen-Commit-Protokoll ist eine Erweiterung des 2-Phasen-Commits mit dem Ziel Blockierungen, die in der Unsicherheitsphase durch die Abhängigkeit der Teilnehmer vom Koordinator beim Ausfall von Knoten entstehen können, zu verhindern. Dies ist jedoch nur möglich, wenn nicht alle Knoten ausfallen und keine Kommunikationsfehler auftreten. Es kann bewiesen werden, dass ein atomares Commit-Protokoll für diesen Fall nicht existieren kann [4]. Die Grundidee dieses Protokolls ist, dass kein Knoten bereits auf Commit entschieden haben kann, solange ein anderer Knoten noch unsicher ist. Dies wird durch einen zusätzlichen Schritt im Commit-Fall erreicht, einem so genannten Pre-Commit-Zustand. Diese Erweiterung bedeutet aber auch, dass das Nachrichtenaufkommen weiter auf 6(N-1) steigt. Der Koordinator (vgl. Abbildung 4-6) sendet eine Prepare-Nachricht an jeden Teilnehmer, wenn eine verteilte Transaktion abgeschlossen werden soll, und wechselt in den Prepare-Zustand. Dort verweilt er bis zum Ablauf eines Timers und sammelt alle von den Teilnehmern ankommenden Antworten. Ein Teilnehmer antwortet entweder mit Ready, falls ein Commit durchgeführt werden kann, oder sonst mit NotReady und wechselt ebenfalls in den PrepareZustand. Sind nach Ablauf des Timers beim Koordinator alle Antworten eingetroffen und es handelt sich ausschließlich um Ready-Nachrichten, wird eine PreCommit-Nachricht an die Teilnehmer versendet und in den Vor-Commit-Zustand gewechselt (Hier ist der Unterschied zum 2-Phasen-Commit-Protokoll, bei dem direkt in den Commit-Zustand gewechselt würde). Falls nicht alle Antworten der Teilnehmer pünktlich eintreffen oder mindestens eine NotReadyNachricht dabei sein sollte, wird auf Abort entschieden, eine Abort-Nachricht versendet und in den Abort-Zustand gewechselt. 48 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 4.2 Commit-Protokoll Der Teilnehmer (vgl. Abbildung 4-7) wartet im Prepare-Zustand auf die Entscheidung des Koordinators. Beim Empfang einer Pre-Commit-Nachricht wird mit einem PreAck bestätigt, in den PreCommit-Zustand gewechselt und auf die entgültige Entscheidung des Koordinators gewartet. Wird eine Abort-Nachricht empfangen, wird diese mit einer Bestätigung quittiert und die Transaktion abgebrochen. Abbildung 4-6: 3PC - Koordinator Der Koordinator wartet im Erfolgsfall im PreComit-Zustand auf die PreAcks der Teilnehmer. Falls alle PreAcks innerhalb einer Zeitspanne empfangen werden, wird eine Commit-Nachricht gesendet und in den Commit-Zustand gewechselt, andernfalls eine Abort-Nachricht, wie bereits beschrieben. Der Teilnehmer wartet im PreCommit-Zustand auf die endgültige Entscheidung des Koordinators und bestätigt diese mit einem Ack. Die Transaktion wird daraufhin je nach Entscheidung des Koordinators abgebrochen oder abgeschlossen. Abbildung 4-7: 3PC - Teilnehmer Wie bereits im 2PC-Protokoll sind Nachrichtenverluste außerhalb der Unsicherheitsphase unkritisch und werden nach einem Timeout mit einem Abort behandelt, wie zum Beispiel beim Verlust von Prepare-, Ready-, NotReady-, PreCommit- oder PreAck-Nachricht. 49 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 4.2 Commit-Protokoll Das Problem bereitet auch hier der Verlust der entgültigen Entscheidung des Koordinators. Beim Verlust der Commit-Nachricht bleibt der Teilnehmer unsicher, ob nicht vielleicht doch noch vom Precommit-Zustand in den Abort-Zustand gewechselt werden soll. Dieser Fall kann allerdings nur auftreten, wenn vorher bereits ein PreAck verloren gegangen ist. An dieser Stelle könnte ein ähnliches Terminierungsprotokoll zum Einsatz kommen, wie es bereits beim 2PCProtokoll beschrieben wurde. Zusammenfassung Es wurden die gängigsten Commit-Protokolle aus dem Transaktionsbereich vorgestellt und auf die Gegebenheiten in Overlay-Netzen angepasst. Welches dieser Protokolle eignet sich nun am besten für den Einsatz als Schutzmechanismus der Wartung von Overlay-Netzen? Das lineare 2-Phasen-Commit-Protokoll hat gerade für den mobilen Bereich den Vorteil, wenige Nachrichten zu benötigen. Dem entgegen steht das Problem, dass bereits ein ausgefallener Knoten den ganzen Protokollablauf stören und zu einem erneuten Start des Protokolls unter Ausschluss dieses Knotens führen kann. Gerade im mobilen Bereich ist, auf Grund der geringen Reichweite der Geräte, der Ausfall von Nachrichten keine Seltenheit, sodass dieses Protokoll wenig geeignet erscheint. Eine mögliche Lösung für das Problem stellt das 3-Phasen-Commit-Protokoll dar. Mit dem zusätzlichen Terminierungsprotokoll kann es den Ausfall einzelner Knoten überstehen. Der Nachteil besteht jedoch in der hohen Zahl der benötigten Nachrichten. Zudem kann das 3Phasen-Commit-Protokoll seinen Vorteil gegenüber dem 2-Phasen-Commit im vorliegenden Fall nicht ausspielen, da durch das Entfernen isolierter Knoten aus dem Overlay-Netz keine langen Blockierungen auftreten. Am geeignetsten der untersuchten Protokolle ist somit das zentrale 2-Phasen-Commit-Protokoll, das mit dem gegebenen Terminierungsprotokoll eine funktionell zufriedenstellende Lösung der Problemstellung verspricht. Dennoch ist der Aufwand des Terminierungsprotokolls nicht unerheblich. Gerade für Operationen, die viele Knoten betreffen muss der Aufwand dem Nutzen kritisch gegenübergestellt und alternative Möglichkeiten abgewägt werden. Kritisch sind Verbindungsabbrüche und Nachrichtenausfälle während des Commitments. Die betroffenen Knoten versuchen, sich die Entscheidung des Koordinators mit Hilfe eines Fehlerprotokolls zu besorgen. Ist diese Fehlerbehebung jedoch erfolglos, kann die Konsistenz der Zustandsdaten nicht mehr gewährleistet werden, da die Gefahr besteht, dass der isolierte Knoten anders entscheiden könnte als der Koordinator. Bei Inkonsistenzen der Zustandsdaten kann auch der transaktionale Schutz die Korrektheit späterer Operationen nicht mehr gewährleisten, da das Transaktionssystem mit denselben Adressen arbeitet wie das zu schützende Overlay-Protokoll. Zum Schutz vor solchem Verhalten muss der isolierte Knoten daher einen Zwangslogout, wie für das zentrale 2-Phasen-Commitprotokoll bereits beschrieben, durchführen. 4.2.3 Funktionelle Anpassungen Der vorhergehende Abschnitt hat gezeigt, dass das 2-Phasen-Commit-Protokoll das für die gegebenen Anforderungen geeignetste der hier vorgestellten Protokolle ist. Allerdings ist eine Verwendung des Protokolls in seiner Grundform, wie sie oben beschrieben wurde, direkt nicht 50 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 4.2 Commit-Protokoll möglich, sodass einige Anpassungen vorgenommen werden müssen. Warum diese notwendig sind und wie sie im Einzelnen aussehen wird nachfolgend geschildert. Zwei Zielsetzungen werden mit den Änderungen im funktionellen Ablauf des 2-PhasenCommits verfolgt. Einerseits soll durch die Änderungen eine weitgehende Transparenz des Commit-Protokolls gegenüber dem Overlay-Protokoll erreicht werden. Zum anderen wird zusätzlich versucht den Aufwand des Commitments zu reduzieren. Beim 2-Phasen-Commit ist es für die Funktion des Protokolls erforderlich, dass sich die Teilnehmer und der Koordinator kennen. Welche Knoten an einer Operation beteiligt sind hängt vom jeweiligen Overlay ab. Dennoch sollen die Wahl des Koordinators sowie die Bekanntgabe der Teilnehmer gegenüber der Implementierung des Overlays weitgehend transparent sein. Es wird deshalb darauf verzichtet diese Variablen durch explizite Methodenaufrufe des Transaktionsmanagers zu setzen. Stattdessen ist ein anderer Mechanismus zu finden, der diese Aufgabe übernimmt. In dieser Arbeit wird der Ansatz verfolgt, eine Protokollierung der Empfängeradressen gesendeter Nachrichten jedes beteiligten Knotens durchzuführen. Diese Adresslisten werden von jedem Knoten zusammen mit seinem Transaktionsergebnis an den Koordinator gesendet. Als Koordinator wird immer der Initiator einer Aktion gewählt. Die Koordinatoradresse ist dann Teil der verwendeten Session-ID und somit jedem Knoten bekannt. Bis zum Empfang der Listen sind dem Koordinator die Teilnehmer unbekannt. Deshalb wird auf die initiale Aufforderung zum Commit verzichtet. Stattdessen wird einfach auf die Ankunft der Abstimmungsnachrichten gewartet. Durch die Konsolidierung der Adresslisten kann der Koordinator alle beteiligten Teilnehmer herausfinden und gegebenenfalls fehlende Abstimmungsnachrichten erkennen. Die Behandlung dieser Fehler beschreibt der folgende Abschnitt. Das beschriebene Kennenlernprotokoll (Get-to-Know-Protokoll) wird an einem Beispiel in Abbildung 4-8 dargestellt. Das Beispiel zeigt eine Operation, an der drei und manchmal auch vier Knoten beteiligt sind. Knoten 1 ist der Initiator der Operation und somit auch der Koordinator. Beim Commit senden alle beteiligten Knoten ihren Abschlusswunsch und die Adressen der Knoten, mit denen sie während der Operation kommuniziert haben an den Koordinator. Knoten 2 teilt dem Koordinator beispielsweise mit, das er mit Knoten 1 und 3 in Kontakt stand. C True 2 1 True 2, (4) 2 True 1, 3 3 optional 4 True Abstimmung Abbildung 4-8: Get-to-Know-Protokoll Auf Grund der Kenntnis der Teilnehmer kann der Koordinator nun das Transaktionsergebnis bestimmen und den Teilnehmern auch direkt bekannt geben. Eine explizite Bestätigung durch die Teilnehmer ist nicht erforderlich, wenn auf ein zuverlässiges Transportprotokoll aufgesetzt wird. Der Koordinator erkennt dadurch nicht angekommene Ergebnisse. Probleme bereitet das Terminierungsprotokoll der Teilnehmer bei Nichterhalt eines Ergebnisses, da einem Teilnehmer durch das eingeführte Verfahren nicht notwendigerweise die anderen Teilnehmer bekannt sein müssen. An dieser Stelle wird daher statt einer gezielten Anfrage eine 51 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 4.2 Commit-Protokoll Broadcastsuche durchgeführt, auf die ein anderer Knoten, der das Ergebnis der Transaktion kennt, antwortet. Neben der Transparenz haben die beschriebenen Anpassungen des 2-Phasen-Commits einen Aufwandsvorteil. Da die Abstimmungsanforderungsnachrichten des Koordinators sowie die abschließenden Bestätigungen der Teilnehmer entfallen, halbiert sich die Anzahl der benötigten Nachrichten auf 2(N-1). Allerdings nimmt der Aufwand im Fehlerfall durch die verwendete Broadcastfunktion zu. 4.2.4 Netzwerkpartitionierungen Während der Kommunikation der Knoten können Netzwerkpartitionierungen entstehen. Das 2Phasen-Commitprotokoll reagiert auf diese Verbindungsabbrüche unterschiedlich, je nachdem, in welcher Phase die Störungen auftreten. Alle Knoten müssen ihre Stimme an den Koordinator melden. Bleiben Stimmen aus, wird auf Abort entschieden. In der Entscheidungsphase sorgt das Terminierungsprotokoll dafür, dass ein isolierter Knoten nach einem vergeblichen Versuch, die Entscheidung von den anderen Knoten zu erfahren, aus dem Overlay-Netz entfernt wird. Treten also Netzwerkpartitionierungen bereits vor Beginn des Commit-Protokolls auf, wird momentan auf Abort entschieden und die entsprechende Transaktion zurückgesetzt. Die Analyse des LanesBroken-Mechanismus im Lanes-Overlay hat jedoch gezeigt, dass das nicht immer wünschenswert ist. Trotz einer gebrochenen Lane findet der Algorithmus einen erfolgreichen Abschluss. Der Grund für diesen Gegensatz liegt in der eigenständigen Fehlerbehebung des Lanes-Protokolls. Im Gegensatz zum Lanes-Login, für den keine Fehlerbehandlung in der Lanes-Spezifikation beschrieben ist, wird beim LaneBrokenAlgorithmus explizit auf Fehler reagiert, die bei anderen Operationen zum Zurücksetzen führen würden. Das Commit-Protokoll wird somit ganz oder zumindest teilweise von seiner Aufgabe enthoben. Im Nichtfehlerfall bleibt die Funktionalität des Commit-Protokolls aber unberührt. Um das Problem zu lösen kann eine spezielle Commit-Operation eingeführt werden. Auf der Teilnehmerseite dient sie dazu, eine zum Zwangslogoff alternative Aktion für den Fall der Isolation von den anderen Knoten auszuwählen. Jedes Overlay-Protokoll definiert einen Satz solcher Alternativoperationen, auf die durch Angabe ihrer Kennziffer zugegriffen werden kann. Die Null bezeichnet dabei den erzwungenen Knotenausstieg also die Defaultoperation. Auf der Seite des Koordinators ist das Toleranzverfahren komplexer. Ihm wird mitgeteilt, wie viele fehlende Teilnehmerstimmen im Fehlerfall tolerierbar sind. Durch die Modifikationen des 2-Phasen-Commits, die im letzten Kapitel beschrieben wurden, entsteht hierbei jedoch ein Problem. Die Anzahl aller an einer Operation beteiligten Knoten lässt sich nur abschätzen, da beim Verlust von Abstimmungsnachrichten nicht nur das gewünschte Ergebnis des Teilnehmerknotens verloren geht, sondern auch die Adressen der Kommunikationspartner dieses Knotens. Daher kann es vorkommen, dass der Koordinator von der Abwesenheit eines Knotens nichts weiß, falls auch dessen Abstimmungsnachricht verloren geht. Das Beispiel in Abbildung 4-9 verdeutlicht den beschriebenen Sachverhalt. Das Netzwerk ist zwischen Knoten 2 und 3 partitioniert. Der Koordinator (Knoten 1) erkennt den Fehler, da in der Adressliste von Knoten 2 der dritte Knoten enthalten ist, von diesem aber keine Abstimmungsnachricht vorliegt. Knoten 4 ist dem Koordinator jedoch völlig unbekannt, weil er nur in der verlorenen Adressliste von Knoten 3 genannt wird. 52 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 4.2 Commit-Protokoll Partitionierung 2 C True 2 1 optional 3 True 1, 3 4 True 2, (4) True - Abstimmung Abbildung 4-9: Beispiel Netzpartitionierung Für die Gesamtknotenzahl K gilt: K k11 k12 k 21 k 22 mit k11: (1) Anzahl der Knoten, die in einer erhaltenen Adressliste enthalten sind und deren Abstimmungsnachricht durch den Koordinator empfangen wurde (im Beispiel: Knoten 1 + 2) Anzahl der Knoten, die in einer keiner erhaltenen Adressliste enthalten sind, deren Abstimmungsnachricht aber durch den Koordinator empfangen wurde (im Beispiel: kein solcher Knoten vorhanden) Anzahl der Knoten, die in einer erhaltenen Adressliste enthalten sind, deren Abstimmungsnachricht aber durch den Koordinator nicht empfangen wurde (im Beispiel: Knoten 3) Anzahl der Knoten, die weder in einer erhaltenen Adressliste enthalten sind, noch deren Abstimmungsnachricht durch den Koordinator empfangen wurde (im Beispiel: Knoten 4) k12: k21: k22: Zwei Fälle können unterschieden werden. Gilt k12= k21= k22=0 ist kein Fehler aufgetreten. Hier ist aber vor allem der zweite Fall, d.h. das Vorhanden sein von Fehlern (k12, k21, k22 0) von Interesse. Unter Hinzunahme von Anwendungsinformationen über die minimale bzw. maximale Anzahl an der Operation beteiligter Knoten (kmin bzw. kmax (Im Beispiel 3 bzw. 4)) lässt sich die einzige Unbekannte k22 abschätzen: (1) k min K k max k min k11 k12 k 21 k 22 k max k min k11 k12 k 21 k max k 22 k11 k12 k 21 (2) Für die Anzahl ausgefallener Knoten kx ergibt sich daraus: kx (2) k min X min 53 k 21 k 22 k11 k12 kx kx X max k max k11 k12 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 4.3 Schedule-Protokolle Wird beim Commit als Toleranz die maximale erlaubte Anzahl ausgefallener Knoten X angegeben, kann damit direkt entschieden werden, dass das Commit durchgeführt werden kann, falls X Xmax die Operation abgebrochen werden muss, wenn X < Xmin In der Praxis sind die beiden Randfälle X = 0 (keine Toleranz) und X = kmax (vollständige Isolation des Koordinators) von größter Bedeutung. Unsicherheit bei der Entscheidung existiert im Bereich X [Xmin, Xmax), da die tatsächliche Anzahl ausgefallener Knoten nicht exakt bestimmt werden kann. Um auch in diesem Fall eine Entscheidung herbeizuführen, werden zwei Toleranzlevel eingeführt. Bei einer strengen Strategie wird bei Fällen im unsicheren Bereich stets auf Abort entschieden und die Menge tolerierbarer Fälle somit eingeschränkt (hartes Toleranzlevel). Die Alternative hierzu ist die Entscheidung auf Commit in den betreffenden Fällen (weiches Toleranzlevel). Dadurch wird die tolerierte Fall-Menge erweitert. Im Einzelfall ist es somit erlaubt, dass die tatsächliche Anzahl ausgefallener Knoten größer als X ist. Durch das beschriebene Toleranzverfahren kann die momentane Wirkung des CommitProtokolls bei Bedarf abgeschwächt werden. 4.3 Schedule-Protokolle Aus der Literatur [8] sind eine Vielzahl von Schedule-Protokollen zur Durchsetzung von Serialisierbarkeit der Transaktionshistorien in Datenbanksystemen bekannt. Die meisten davon arbeiten dabei auf Basis von Sperren oder Zeitstempeln. Viele dieser Verfahren könnten auch im vorliegenden Fall zum Einsatz kommen. Daher ist es sinnvoll das Schedule-Protokoll in der späteren Implementierung ebenfalls als abgeschlossene Komponente anzusehen, um eine einfache Austauschbarkeit verschiedener Protokolle und Protokollimplementierungen zu erlauben. Im Folgenden werden einige mögliche Lösungen vorgestellt. 4.3.1 Sequentieller Scheduler Die einfachste Möglichkeit Inkonsistenzen durch parallele Operationen zu verhindern, ist ihre strenge sequentielle Ausführung. Das könnte mittels Warteschlangen oder einem kompletten Sperren aller Strukturdaten erreicht werden. Auf diese Art wird aber jegliche Parallelität aufgegeben, auch wenn die Operationen verschiedene Daten bearbeiten und somit keine Überschneidungen auftreten. 4.3.2 Optimistischer Ansatz Der optimistische Ansatz geht davon aus, dass während der Operationsausführung keine Fehler auftreten. Falls dies doch der Fall ist, muss eine Operation rückgängig gemacht werden. Dabei wird im vorliegenden Fall wie folgt vorgegangen. Die benötigten Variablen werden in den lokalen Arbeitsbereich der Transaktion kopiert, wenn sie benötigt werden, aber nicht gesperrt. Auf diesen lokalen Variablen wird die Operation ausgeführt. Dabei beginnt die Transaktion für jeden Knoten zusammen mit der dazugehörenden Session beim Empfang bzw. 54 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 4.3 Schedule-Protokolle Versand der ersten Nachricht. Am Ende der Operation werden nun die Variablen gesperrt. Es wird geprüft, ob zwischenzeitlich Veränderungen durchgeführt wurden, zum Beispiel durch parallel laufende Operationen. Es folgt das Commit-Protokoll, nach dessen erfolgreicher Ausführung die Werte festgeschrieben werden. Zum Schluss werden die Sperren wieder freigegeben. Dieses Verfahren begrenzt die Isolation auf den Zeitraum zwischen der Korrektheitsprüfung und der Ausführung des Commit-Protokolls und verspricht daher eine möglichst große Parallelität von Operationen. Bei vielen gleichzeitig auszuführenden Operationen ist aber eine große Rücksetzquote wahrscheinlich, sodass sich erst durch eine Evaluierung zeigen muss, ob der optimistische Ansatz mehr Vor- oder Nachteile gegenüber einer sperrenbasierten Lösung bietet. 4.3.3 Vorab-Sperren Beim Vorab-Sperren werden sämtliche für eine Overlay-Operation notwendigen Zustandsvariablen, bevor mit der Ausführung der Operation begonnen wird, gesperrt. Anders als in den meisten Fällen bei Datenbanksystemen sind für jede Overlay-Operation die notwendigen Variablen schon im Voraus bekannt. Diese werden dem Transaktionsmanager beim Aufruf der Start-Operation der Transaktion mitgeteilt. Vorab-Sperren ermöglicht somit die Isolation der Overlay-Operationen in einer sehr einfachen Weise. Verklemmungen können nicht auftreten. Eine mögliche Parallelität konkurrierender Operationen wird auf diese Weise stark eingeschränkt. Ein strenges Vorab-Sperren der Form, dass alle Knoten gleichzeitig zu Beginn der Operation ihre benötigten Variablen sperren, ist allerdings im vorliegenden Fall nicht möglich. Hierfür wäre ein Startprotokoll nötig, in dem sich die Knoten über den Startzeitpunkt verständigen. Diese Kommunikation ist aber, wie am Beispiel des LaneBroken-Verfahren zu sehen ist, nicht immer möglich. Außerdem wird so zusätzlicher Nachrichten-Overhead erzeugt. Stattdessen wird eine abgeschwächte Variante des Vorab-Sperrens verwendet. Die Knoten sperren alle benötigten Variablen, sobald sie die Transaktion erreicht. 4.3.4 Zwei-Phasen-Sperren Eine Alternative zum Vorab-Sperren könnte das klassiche strenge Zwei-Phasen-Sperrprotokoll sein. Die Zustands-Variablen werden dabei nach und nach gesperrt, wenn sie von der Operation das erste Mal benötigt werden. Die Sperren werden dann bis zur Beendigung des CommitProtokolls gehalten und dann auf einmal freigegeben. Die Strenge des Vorab-Sperrens kann dadurch abgeschwächt werden. Die Sperrphasen der einzelnen Knoten werden verkürzt, wodurch potentiell eine größere Parallelität erreicht werden kann. Abbildung 4-10 verdeutlicht dies schematisch am Beispiel des Lanes-Login. Die Knoten haben kürzere Sperrzeiten gegenüber dem Vorab-Sperren und können damit andere Operationen noch fortführen und beenden, obwohl der neue Knoten bereits den Login begonnen hat. Man erkennt vor allem beim Initiator eine erhebliche Verkürzung der Sperrzeit. Das liegt daran, dass dieser erst ganz am Ende des Logins Schreiboperationen auf seinen Strukturdaten ausführt, diese aber beim Vorab-Sperren bereits zu Beginn gesperrt werden müssen. Ein Startprotokoll wird über dies nicht benötigt. 55 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 4.4 Sperrenverwaltung LoginRequest Vorabsperren LoginInformation LoginAccept Ende Commit-Protokoll LoginConfirmation Initiator Reaktor 1 Reaktor 2 2-Phasen Initiator Reaktor 1 Reaktor 2 Optimistisch Initiator Reaktor 1 Reaktor 2 Abbildung 4-10: Vergleich der Sperrphasen 4.3.5 Zeitstempel-Verfahren Auf Zeitstempel basierende Scheduler verwenden keine Sperren. Stattdessen wird jeder Transaktion ihr Startzeitpunkt als Zeitstempel zugeteilt. Jede Operation dieser Transaktion trägt ebenfalls diesen Zeitstempel. In Konflikt stehende Operationen zweier Transaktionen werden auf Basis ihrer Zeitstempel sortiert. Anders ausgedrückt wird eine Operation zurückgewiesen und somit die dazugehörende Transaktion zurückgesetzt, wenn bereits eine Operation einer anderen Transaktion auf dem gleichen Datenelement ausgeführt wurde, die einen höheren Zeitstempelwert aufweist. 4.3.6 Scheduler ohne Schutz Dieser Scheduler, der streng genommen keiner ist, dient ausschließlich einer späteren Evaluation. Er leitet sämtliche Lese- und Schreiboperationen des Overlay-Protokolls ohne Sperren zu setzen an den Variablenmanager weiter. Dadurch wird ein System ohne transaktionalen Schutz simuliert, das als Vergleich herangezogen werden kann. Details zur Evaluation sind in Kapitel 6 zu finden. 4.4 Sperrenverwaltung Im Simulator DIANEmu ist bereits eine Sperrenverwaltung integriert, die vom neuen Transaktionsmanager genutzt werden kann und somit nicht neu entworfen werden muss. Diese Sperrenverwaltung bietet nur eine Sperrenart (Exklusivsperre). Da aber nur wenige parallele Operationen auf einem Knoten zu erwarten sind, kann der daraus resultierende Parallelitätsverlust akzeptiert werden. 56 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 4.4 Sperrenverwaltung Der so genannte Variablen-Manager jedes Knotens stellt folgende Operationen zur Verfügung: Checkout: Setzt eine exklusive Sperre auf einer Variablen, andere Zugriffe werden bis zur Sperrenfreigabe geblockt. Peek: Dient ausschließlich zum Lesen einer Variablen. Es wird keine Sperre gesetzt. Somit kann kein Repeatable Read gewährleistet werden und Dirty Reads sind möglich. Checkin: Schreibt einen Wert zurück und gibt die zuvor gesetzte Sperre wieder frei. Remove: Sperrt die angegebene Variable, löscht sie und gibt die Sperre wieder frei. Diese Funktion wird nicht verwendet, da der Satz von Strukturdaten konstant ist und sich nur deren Werte ändern (vgl. Funktion checkin). TryCheckout: Testet, ob auf einer Variablen eine Sperre gesetzt ist. Damit kann vermieden werden, dass mehrere Operationen parallel Änderungen der Daten für einen Knoten durchführen und Inkonsistenzen hervorrufen. An einer Operation für die Erhaltung der Lanes-Struktur sind jedoch mehrere Knoten beteiligt, deren lokaler Zugriff auf ihre Zustandsdaten zwar isoliert abläuft, aber keine Koordination bzgl. der Datenänderungen zwischen den einzelnen Knoten garantiert wird. Aus diesem Grund ist wie oben beschrieben zusätzlich ein Commit-Protokoll nötig. 4.4.1 Verklemmungsvermeidung Bei der Verwendung von Sperren können zwei oder mehr Transaktionen verklemmen, wenn sie gegenseitig benötigte Sperren halten. Um Verklemmungen (Deadlocks) zu vermeiden, wird vor der Vergabe einer Sperre der so genannte Wartegraph auf Zyklen geprüft. Die Knoten des Wartegraphen sind mit den Transaktionskennungen markiert. Eine Kante von Knoten x nach Knoten y bedeutet, das die Transaktion x auf eine Sperre wartet, die Transaktion y hält. Für die Prüfung auf einen Zyklus wird zunächst mit Hilfe des Warshall-Algorithmus die transitive Hülle des Wartegraphen bestimmt. Danach kann ein Zyklus leicht durch gesetzte Diagonalelemente der Adjazenzmatrix erkannt werden. Würde durch die Vergabe einer Sperre eine Verklemmung eintreten, wird die anfordernde Transaktion zurückgesetzt. 4.4.2 Verklemmungserkennung Obwohl mit Hilfe des Wartegraphen ein System für die Vermeidung von Verklemmungen realisiert werden kann, ist trotzdem zusätzlich eine Erkennung von Verklemmungen notwendig, da Transaktionen hängen bleiben könnten. Die von diesen Transaktionen gehaltenen Sperren würden nie mehr freigegeben. Um das zu verhindern wird ein Timer verwendet. Periodisch wird geprüft, ob eine Transaktion ihre maximale Dauer überschritten hat. Falls ja, wird die Transaktion zurückgesetzt. 57 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 4.5 Log-Manager 4.5 Log-Manager Die Log-Manager-Komponente hat die Aufgabe, sämtliche sowohl lesende als auch schreibende Zugriffe auf die Zustandsvariablen der laufenden Transaktionen eines Knotens mitzuprotokollieren. Jedem dieser Einträge wird mit einem Zeitstempel und den Werten vor und nach der Änderung (nur bei Schreibzugriffen) versehen. Durch den Log-Manager kann gewährleistet werden, dass überschriebene Werte von Transaktionen, die abgebrochen werden müssen, wieder zurückgesetzt werden können. Zudem ist die Erstellung einer Operationen-Historie möglich. Im Gegensatz zu herkömmlichen Datenbanksystemen wird das Log im vorliegenden Fall nicht dazu eingesetzt, Robustheit gegenüber Knotenausfällen zu erreichen. Ein ausgefallener Knoten wird in jedem Fall aus der Struktur des Overlay-Netzes entfernt und die Zustandsinformationen nach seinem Re-Start neu initialisiert. Transaktionen, die zum Zeitpunkt des Ausfalls noch nicht abgeschlossen hatten, müssen daher auch nicht zurückgesetzt werden. Außerdem erfolgt keine dauerhafte Speicherung der Zustandsdaten, sodass eine Wiederausführung bereits abgeschlossener aber noch nicht festgeschriebener Transaktionen ebenfalls nicht notwendig ist. Das Log muss somit nicht dauerhaft angelegt sein, sondern nur eine Protokollierung zur Laufzeit ermöglichen. 4.6 Isolation, Transaktionen & Sessions Das verteilte atomare Commitment ist eine aufwändige Operation. Gerade in Ad-hoc-Netzen sollte der nötige Aufwand aber so gering wie möglich gehalten werden. Daher ist zu überlegen, ob die Ausführung des Commit-Protokolls in jedem Fall notwendig ist. Ein Beispiel für einen solchen Fall sind die periodischen Ping-Nachrichten des Lanes-Overlays. Ein transaktionaler Schutz ist hier nicht sinnvoll, da zum einen keine tiefgreifenden Eingriffe in die Overlaystruktur vorgenommen werden und zum anderen durch die Häufigkeit dieser Nachrichten ein solcher Schutz einfach zu aufwändig wäre. Die Aktualisierungsfunktionen für Dienste (ServiceOffer und ServiceRemove) können hier ebenfalls als Beispiel angeführt werden. Das Löschen und Einfügen eines Dienstes ist zeitgleich nicht möglich, außerdem können Inkonsistenzen, die durch den Ausfall einzelner Nachrichten entstehen, beispielsweise durch periodische Auffrischungen der vorhandenen Dienstbeschreibungen einfacher behoben werden. Fehler, die dadurch in der Zwischenzeit bei der Dienstsuche auftreten, sind zum Teil tolerierbar. Mit Fehler ist in diesem Zusammenhang gemeint, wenn eine Dienstsuche scheitert, obwohl der Dienst verfügbar ist, oder umgekehrt. Ähnliches gilt zum Beispiel auch beim bereits bekannten Overlaynetz Bamboo. Dort wird lediglich versucht sämtliche Objekte mit bestimmtem Schlüssel, die in der verteilten Hashtabelle abgelegt wurden zu finden. Garantien gibt es dafür aber nicht. Sowohl der Ping-Mechanismus als auch die Dienstfunktionen können somit als unkritische Operationen bezeichnet werden, zu denen des Weiteren auch reine Leseoperationen (z.B. die Lanes-Dienstsuche) gezählt werden können. Bei unkritischen Operationen kann der Aufwand des Commit-Protokolls eingespart werden. 58 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 4.6 Isolation, Transaktionen & Sessions Operationstypen unkritisch nur lesend kritisch schreibend u. fehlertolerant schreibend (garantiertes Gruppen-Commit) schreibend (Einzelentscheidungen erlaubt) Abbildung 4-11: Operationstypen Dem entgegen stehen kritische Operationen, die in die Netzstruktur eingreifen, und somit isoliert ablaufen müssen, um schadhafte Strukturinformationen zu vermeiden. Solche Operationen sind ausschließlich schreibend. Prinzipiell ist hier ein Commit-Protokoll erforderlich. Kapitel 4.2 hat jedoch gezeigt, dass Fälle existieren, in denen das CommitProtokoll wegen einer Netzpartitionierung nicht abschließen kann, die dazugehörende OverlayOperation jedoch als korrekt ausgeführt gilt. Daher unterscheidet man bei kritischen Operationen zwei Typen, je nachdem, ob ein Commitprotokoll ausführbar ist oder nicht. Der normale Fall ist dabei das garantierte Gruppen-Commit, d.h. das Commit-Protokoll ist durchführbar und muss erfolgreich abschließen, andernfalls gilt die Operation als gescheitert und wird zurückgesetzt. Ein Beispiel für diesen Typ ist der Lanes-Login. Der zweite kritische Operationstyp, zum Beispiel der LaneBroken-Mechanismus, erlaubt Einzelentscheidungen der Knoten im Fall von Netzwerkpartitionierungen, da hier ein Gruppen-Commit nicht möglich ist. Die Entscheidung, von welchem Typ eine kritische Operation ist, kann erst am Ende getroffen werden. Die Typwahl muss dem Transaktionsmanager über zwei verschiedene Commitvarianten mitgeteilt werden. Abbildung 4-11 zeigt alle möglichen Operationstypen. SessionID: 1 Ping/Pong Vorbereitung Timeout SessionID: 2 LaneBroken Reparatur erfolgreich transaktional geschützter Kern Timeout SessionID: 3 Dienstaktualisierung Nachbearbeitung Abbildung 4-12: Sessions LaneBroken-Algorithmus Die einzelnen Protokollfunktionen von Overlays, wie Login, Logoff oder die Reparaturmaßnahmen sind nicht immer genau einem Operationstyp zuzuordnen. Stattdessen besteht eine Wartungsoperation aus mehreren Suboperationen und besitzt einen dreiteiligen Aufbau. In Abbildung 4-12 wird dieser Aufbau am Beispiel des LaneBroken-Algorithmus verdeutlicht. Ein transaktional geschützter kritischer Kernbereich nimmt wichtige Änderungen an den Strukturinformationen vor. Er ist von einer vorbereitenden Phase und einer Nachbearbeitung umgeben, die keinen Transaktionsschutz benötigen, da dort unkritische Operationen zu finden sind, wie sie im vorangegangenen Abschnitt beschrieben wurden. Jeder dieser drei Bereiche kann muss aber nicht vorhanden sein. 59 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 4.7 Zusammenfassung Ein Beispiel für diese Dreiteilung ist der LaneBroken-Algorithmus des Lanes-Overlays. Hier sind alle mit Ausnahme der rein lesenden Operation vorgestellten Operationstypen zu finden. Den geschützten Kern bildet die Lane-Reparatur. Ihn umschließen der Ping/PongMechanismus und die Dienstaktualisierung. Gegebenenfalls kann auf die explizite Dienstaktualisierung wegen der periodischen Dienstauffrischung sogar verzichtet werden. Beim Lanes-Login, um ein weiteres Beispiel zu nennen, ist nur ein dem geschützen Bereich vorrausgehender Randbereich vorhanden. Vor der eigentlichen Aktualisierung der Strukturvariablen werden unverbindlich Login-Anfragen und -Angebote versendet. Erst ab dem Zeitpunkt des Akzeptierens eines Angebots durch den neuen Knoten ist ein Schutz erforderlich. Um parallel ablaufende Protokollprozesse auf einem Knoten grundsätzlich unterscheiden zu können, verwendet DIANEmu ein Sessionkonzept. Jedem Prozess wird eine eindeutige SessionID zugewiesen. Mit Hilfe dieser ID werden dann eintreffende Nachrichten automatisch den richtigen Prozessen zugeordnet. Beim Aufruf eines Benutzer-Calls wird jeweils eine neue Session gestartet. Zusätzlich besteht die Möglichkeit Sessions aus einer bereits bestehenden Session heraus durch Versenden einer mit der neuen Session-ID versehenen Nachricht manuell zu starten oder sie auch manuell zu beenden. Das neue Transaktionskonzept muss in das vorhandene Sessionkonzept integriert werden. Dabei wird eine 1-zu-1-Zuordnung zwischen den geschützten Bereichen und Sessions verwendet. Jeder durch eine Transaktion geschützte Bereich verwendet genau eine Session. Als eindeutige Transaktions-ID kann daher die Session-ID verwendet werden. Die Session-IDs beinhalten neben einer laufenden Nummer auch die Adresse des Initiators dieser Session. Dieser Knoten ist somit allen an der Session beteiligten Knoten automatisch bekannt und übernimmt beim Commit-Protokoll aus diesem Grund immer die Rolle des Koordinators. Es ist sinnvoll, die Randbereiche vom geschützten Kernbereich durch die Verwendung unterschiedlicher SessionIDs abzukoppeln. Diese Trennung erlaubt eine einfache Ausführung der einzelnen Bereiche mit ihren unterschiedlichen Operationstypen. 4.7 Zusammenfassung In diesem Kapitel wurde ein Konzept für ein System vorgestellt, das Inkonsistenzen durch nebenläufig ausgeführte Wartungsoperationen verhindern soll. Die Idee, die dieser Ansatz verfolgt, ist die Verwendung von Transaktionen, da bei Datenbanksystemen, dem Ursprung des Transaktionskonzepts, ähnliche Probleme existieren. Tatsächlich hat die entwickelte Lösung Ähnlichkeiten mit einem verteilten Datenbanksystem. Um verteilte Transaktionen erfolgreich zu isolieren, sind zwei Aspekte zu beachten. Sowohl die lokale Konsistenz als auch die globale Konsistenz müssen gewährleistet werden. Die dafür benötigten Komponenten, wie Scheduleprotokolle oder das Commitprotokoll, wurden beschrieben. Es wurden aber auch Unterschiede zu verteilten Datenbanken dargelegt, die zusammen mit der Forderung nach der Entwicklung einer generischen Schutzkomponente, die für viele Overlays einsetzbar sein soll, einige Anpassungen vor allem am Commit-Protokoll erforderlich machten. Hier ist zum Beispiel das Kennenlernprotokoll (Get-to-Know-Protokoll) zu nennen. 60 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 4.7 Zusammenfassung 61 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 5 Realisierung 5 Realisierung Dieses Kapitel stellt die wichtigsten Punkte der softwaretechnischen Realisierung des beschriebenen Transaktionssystems vor. Dieses System erweitert den Simulator DIANEmu des DIANE-Projekts und wurde wie dieser in Java implementiert. Die Implementierungen des Lanes-Protokolls sowie des verwendeten Zwei-Phasen-CommitProtokolls verwenden die Gegebenheiten des DIANEmu zur Realisierung von Protokollen. Daher werden dazu hier nur Besonderheiten und interessante Aspekte beleuchtet. Gleich im Anschluss wird ein Einblick in die Entwicklung von Protokollen für den DIANE-Simulator sowie dessen Aufbau gegeben. Eine detaillierte Auskunft darüber liefert [11]. Ein Überblick über alle im Rahmen dieser Arbeit erstellten Java-Klassen und Pakete ist im Anhang E zu finden. 5.1 DIANEmu Für ein besseres Verständnis des Entwurfs des entwickelten Schutzsystems ist es sinnvoll, hier zunächst einen Überblick über den im DIANE-Projekt verwendeten Simulator zu geben. 5.1.1 Aufbau des Simulators Der Netzwerk-Simulator DIANEmu besitzt eine fünfschichtige Architektur, auf die hier ein kurzer Blick geworfen wird. Die unterste Schicht bildet der Connectivity Layer. Hier wird die Funkreichweite der einzelnen Knoten unter Beachtung der Umgebung (Gebäude, Bäume, ) berechnet. Die zweite Ebene ist der Network Layer. Diese Schicht stellt ein zuverlässiges Transportsystem zum Nachrichtenaustausch zwischen den Netzteilnehmern zur Verfügung. Sie ist damit mit den Schichten 2 bis 4 des ISO-OSI-Referenzmodells vergleichbar. Die Protokoll-Schicht (Protocol Layer) stellt die wichtigste Schicht des Simulators dar. Hier werden die Overlay-Protokolle, wie Lanes, implementiert (vgl. nächstes Kapitel). In der User Layer werden die Verhaltensweisen der einzelnen Benutzer simuliert. Dazu gehören seine Bewegungen, sein Nutzungsverhalten (Ein- / Ausschalten des Geräts, Suche nach Diensten oder andere Protokollfunktionen, usw.) aber auch die Eigenschaften der Geräte, wie Prozessorleistung oder Speicherkapazität. Die oberste Schicht bildet der Meta Layer. Sie dient der Definition und der Ausführung komplexer Testfälle (Benchmarks). 62 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 5.1 DIANEmu Die Benutzeroberfläche des Simulators zur grafischen Darstellung der Simulationsabläufe folgt einem Model-View-Controller-Entwurf. Die Protokolle der Protocol Layer manipulieren Strukturdaten, die für jeden Netzteilnehmer in einem Modell hinterlegt sind, und stellen damit den Controller dar. In speziellen View-Komponenten kann spezifiziert werden, wie die Modelldaten grafisch dargestellt werden sollen. 5.1.2 Implementierung von Protokollen DIANEmu stellt eine umfangreiche Sammlung von Komponenten zur Verfügung, die die Implementierung und Integration eigener Protokolle in die Simulationsumgebung (ProtokollSchicht) ermöglichen. Die Klasse Protocol dient dazu, die Funktionen zu definieren, die dem Benutzer zur Verfügung stehen sollen, zum Beispiel Login, Logoff oder Dienstsuche. Durch diese Funktionsaufrufe werden die einzelnen Protokoll-Prozesse mit Hilfe eines Calls gestartet. Ein Ergebnis des Prozesses, beispielsweise die gefundenen Dienste, wird mit einer Response an den Benutzer zurückgegeben. Jedes Protokoll besteht aus mehreren Zuständen (Klasse ProtocolState), zwischen denen gewechselt wird, falls bestimmte Ereignisse eintreten. In den Zuständen ist die eigentliche Funktionalität des Protokolls gekapselt. Es können Aktionen angegeben werden, die beim Eintritt in den Zustand oder beim Empfang von festgelegten Nachrichten (Klasse Message) ausgeführt werden sollen. Neben diesen abstrakten Komponenten werden einige grundlegende Funktionen zur Verfügung gestellt, die immer wiederkehrende Aufgaben bei der Implementierung von Protokollen übernehmen. Hier ist vor allem das Sammeln von Nachrichten über einen bestimmten Zeitraum, Timer und das Session-Konzept, das eine automatische Zuordnung von ankommenden Nachrichten zu den parallel ablaufenden Protokoll-Prozessen ermöglicht, zu nennen. Darüber hinaus existiert ein so genannter Variablenmanager, der die Verwaltung beliebiger Daten übernimmt. Jeder Knoten des Netzwerks verfügt über eigene Instanzen aller verwendeten Protokolle und der von ihnen verwendeten Komponenten. 5.1.3 Simulation Abbildung 5-1 zeigt die grafische Oberfläche des Simulators DIANEmu, der zur Evaluation der Ergebnisse dieser Arbeit verwendet wurde. Der linke Bereich visualisiert die aktuelle Netzwerktopologie, die vorhandenen Knoten und deren Position sowie den Versand und Empfang von Nachrichten. In der Abbildung ist hier eine Lane aus sechs Knoten zu sehen. Der rechte Bereich liefert Detailinformationen über Ereignisse, Nachrichten und Wartezustände, wie Empfänger- und Senderadressen, ausführender Knoten, Session-IDs und die zeitliche Abfolge. Der Simulator kann mit verschiedenen Szenarien, so genannten Benchmarks, initialisiert werden, durch die das Verhalten der einzelnen Knoten definiert wird [15]. Dadurch ist 63 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 5.2 Das Wartungstransaktionssystem zusammen mit den angezeigten Werten ein umfassender schrittweiser Test realisierter Protokolle in verschiedenen Situationen möglich. Eine detaillierte Beschreibung des Simulators ist in [11] zu finden. Abbildung 5-1: Grafische Oberfläche des DIANEmu 5.2 Das Wartungstransaktionssystem Abbildung 5-2 zeigt ein UML-Klassendiagramm des realisierten Systems. Auf die Darstellung der Attribute und Methoden wurde aus Gründen der Übersichtlichkeit verzichtet. Einige dieser Details werden im Laufe des folgenden Kapitels erläutert. Sowohl das Lanes- als auch das 2Phasen-Commitprotokoll sind nur angedeutet, um deren Integration in das System aufzuzeigen. Ihre benötigten Protokollzustände und Nachrichten wurden bereits ausführlich dargelegt und bedürfen keiner weiteren Beschreibung. Um die Grafik zusätzlich zu strukturieren und die Zusammengehörigkeit der Klassen zu verdeutlichen, wurden diese durch logische Pakete unterlegt. Der schematische Systemaufbau wurde bereits im letzten Kapitel anhand von Abbildung 4-2 beschrieben. 5.2.1 Transaktionsverwaltung Wie Abbildung 5-2 deutlich zeigt, ist Transactionsmanager die zentrale, alle Systemteile verbindende Komponente. Dem Transaktionsmanager fallen zwei wichtige Kernaufgaben zu. Er stellt erstens eine Schnittstelle zur Verfügung, über die das Overlay-Protokoll auf seine 64 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 5.2 Das Wartungstransaktionssystem Strukturdaten zugreifen kann. Sowohl diese Schnittstelle als auch zweitens die Verwaltung der laufenden Transaktionen werden im Folgenden beschrieben. Abbildung 5-2: Gesamtentwurf Die Funktionalität des Transaktionsmanagers ist allgemein gehalten. Sämtliche spezifischen Funktionen, wie die Art des Abschlusses oder die Prüfung auf Korrektheit der ausgeführten Transaktion sind in das Scheduleprotokoll bzw. das Commit-Protokoll ausgelagert. Welche 65 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 5.2 Das Wartungstransaktionssystem Protokolle hier verwendet werden sollen, wird in einer Konfigurationsdatei festgelegt. Die Integration vorhandener und neuer Protokolle ist daher sehr einfach und individuell möglich. Der Transaktionsmanager verbindet diese Einzelkomponenten und macht sie untereinander verfügbar, falls dies erforderlich ist. Beispielsweise ist das verwendete Scheduleprotokoll dadurch in der Lage, auf die Logeinträge der laufenden Transaktion zuzugreifen oder selbst neue Einträge hinzuzufügen. Schnittstelle zum Overlay-Protokoll Der Transaktionsmanager bietet dem Overlay-Protokoll Schnittstellenfunktionen zur Manipulation der Strukturdaten sowie zum Start und zur Beendigung von Transaktionen an. Die bisher für diesen Zweck verwendeten Änderungsfunktionen, die durch die Klasse ProtocolState des DIANEmu bereitgestellt wurden, wurden deaktiviert, um die ausschließliche Verwendung der neuen Schnittstelle zu erzwingen, da sonst ein transaktionaler Schutz nicht gewährleistet werden könnte. Folgende Methoden zur Verwaltung von Transaktionen bietet die Schnittstelle des Transaktionsmanagers: 1. void start(String sessionID, boolean loginValue) : Startet eine neue Transaktion. Als Transaktions-ID wird die angegebene Session-ID verwendet. Sofern keine Parameter beim Transaktionsstart gesetzt werden müssen (vgl. 2.) kann auf den Aufruf dieser Methode verzichtet werden, da sie beim ersten Lesen oder Schreiben sowie beim Empfang oder beim Senden einer Nachricht einer unbekannten Transaktion automatisch ausgeführt wird. Der Parameter loginValue dient dazu, den Login-Status zu Beginn der Transaktion zu protokollieren. Dieser Status wird nicht vom Variablenmanager verwaltet. Dadurch ist es später beim Commit notwendig, unabhängig vom verwendeten Scheduler zu prüfen, ob dieser Zustand während der Transaktion nicht durch andere Operationen geändert wurde. 2. void start(String sessionID, Object startParameter, boolean loginValue) : Startet eine neue Transaktion (vgl. 1.). Der anzugebende Startparameter ist vom verwendeten Scheduler abhängig. Beispielsweise sind beim Vorabsperren alle für die Transaktion zu sperrenden Strukturdaten anzugeben. 3. void abort(String sessionID) : Bricht die Transaktion ab und setzt Änderungen an den Strukturdaten wieder zurück. Dieser Methodenaufruf muss am Ende einer Transaktion erfolgen und startet das Commit-Protokoll. 4. boolean tryCommit(String sessionID) : Versuch, die Transaktion erfolgreich zu beenden. Dieser Methodenaufruf muss am Ende einer Transaktion erfolgen und startet das Commit-Protokoll. Der Knoten zeigt damit an, dass er die Transaktion erfolgreich abschließen kann. Der tatsächliche Erfolg der Operation hängt aber vom Ergebnis des Commit-Protokolls ab. Scheitert das CommitProtokoll, wird die Transaktion abgebrochen, ihre geänderten Werte zurückgesetzt und ein negatives Ergebnis zurückgegeben. 66 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 5.2 Das Wartungstransaktionssystem 5. boolean tryCommit(String sessionID, CommitToleranceConfiguration config): Versuch, die Transaktion unter Angabe eines Toleranzniveaus (vgl. Kapitel 4) erfolgreich zu beenden. Dieser Methodenaufruf muss am Ende einer Transaktion erfolgen und startet das Commit-Protokoll. Der Erfolg der Operation hängt vom Ergebnis des Commit-Protokolls ab. Beim Beenden einer Transaktion ist zu beachten, dass neben dem erfolgreichen Abschluss und dem Transaktionabbruch potentiell ein drittes Ergebnis möglich ist. Wie bereits beschrieben wurde, ist es dem Commit-Potokoll beim Auftreten von Netzwerkpartitionierungen nicht immer möglich ein konsistentes Ergebnis zu erreichen. Dieser Fall wird dem Overlay-Protokoll durch eine Ausnahme angezeigt, sodass Gegenmaßnahmen ergriffen werden können. Der Transaktionsmanager bietet eine Behandlung dieses Fehlers abhängig vom jeweiligen Toleranzniveau an. Für eine detailliertere Beschreibung sei aber an dieser Stelle auf die Anpassungen des 2-Phasen-Commits verwiesen (vgl. Kapitel 4). Neben den Methoden zur Transaktionsverwaltung werden folgende Methoden zur Manipulation der Strukturdaten angeboten: 6. Object directRead(String name): Lesen eines Wertes ohne transaktionalen Schutz (für unkritische Operationen) 7. directWrite(String name, Object value): Schreiben eines Wertes ohne transaktionalen Schutz (für unkritische Operationen) 8. Object read(String name, String sessionID): Transaktional geschütztes Lesen eines Wertes (für kritische Operationen) 9. write(String name, Object value, String sessionID): Transaktional geschütztes Schreiben eines Wertes (für kritische Operationen) 10. addToAnycastAddress(String address, String anycast, String sessionID): Die Manipulation der Zuordnungen von Knotenadressen zu Anycastadressen (in diesem Fall das Hinzufügen einer solchen Zuordnung) stellt einen Spezialfall dar, da diese Informationen nicht vom Variablenmanager, sondern von der Netzwerkschicht direkt verwaltet werden. Um zu garantieren, dass Änderungen nur im Erfolgsfall einer Transaktion wirksam werden, sind deshalb spezielle Schreibfunktionen erforderlich. 11. removeFromAnycastAddress(String address, String anycast, String sessionID): Entfernen einer Knotenadress-zu-Anycastadress-Zuordnung (analog zu addToAnycastAddress) 12. getUnicastAddresses(String anycastAddress, String sessionID): Liefert die Knotenadressen, die einer Anycast-Adresse zugeordnet sind. Auch das Lesen dieser Zuordnungen von Knotenadressen muss, wie auch deren Manipulation, protokolliert werden, um beim Commit etwaige zwischenzeitliche Änderungen erkennen zu können (vgl. 10.). 13. getAnycastAddresses(String unicastAddress, String sessionID): Liefert die Anycast-Adressen, denen die angegebene Knotenadresse zugeordnet ist (vgl. 12.). 67 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 5.2 Das Wartungstransaktionssystem Verwaltung und Protokollierung von Transaktionen Durch expliziten Aufruf der Startoperation oder implizit durch eine Lese- oder Schreibfunktion mit bisher unbekannter Session-ID wird eine neue Transaktionsinstanz (Klasse Transaction) angelegt. Diese Instanz erlaubt die Ablage und Sammlung von für die Bearbeitung und den Abschluss der Transaktion relevanter Informationen. Dazu gehören beispielsweise die Transaktions-ID, die Koordinator-Adresse, die aus der Session-ID gewonnen wird, der aktuelle Transaktionszustand (Working, Aborted, Committed) und eventuell Start-Parameter, die abhängig vom gewählten Scheduleprotokoll sind. Darüber hinaus ist die Angabe beliebiger weiterer Parameter in Form von Bezeichner-Werte-Paaren möglich und es existiert eine lokaler Speicherbereich für Variablenwerte, der zum Beispiel vom optimistischen Scheduleprotokoll verwendet wird, um die gelesenen oder geschriebenen Werte transaktionslokal zu verwalten. Durch diese bereits vordefinierten allgemeinen lokalen Ablagebereiche können neue Protokolle leicht ohne Änderungen in das bisherige System integriert werden. Abbildung 5-3: Paket Core Eine weitere grundlegende Funktion ist das Mitprotokollieren von Adressen der gesendeten oder empfangenen Nachrichten. Bei empfangenen Nachrichten ist die Senderadresse und bei gesendeten Nachrichten die Empfängeradresse von Interesse. Dies ist von erheblicher Bedeutung für das spätere Commit-Protokoll, da jeder Knoten auf diese Weise den Knotenkreis festhält, mit dem er während der Transaktion in Kontakt steht. Dadurch kann der Koordinator letztendlich bestimmen, welche Knoten an der Transaktion beteiligt sind. Wie das für das Commit-Protokoll genutzt werden kann zeigt Kapitel 4. Die Nachrichtenprotokollierung wird automatisch durchgeführt. Die Nachrichten, deren Adressen gespeichert werden sollen, müssen lediglich von einer speziellen Unterklasse der Message-Klasse des DIANEmu der Klasse TransactionTrackedMessage (s.u.) erben. Nachrichten die nicht protokolliert werden sollen, wie zum Beispiel die Pings, erben nach wie vor von der Klasse Message. 5.2.2 Transaktionslog Die Klasse LogManager übernimmt die Protokollierung der durch die Transaktion ausgeführten Operationen. Jede Transaktion erhält ein eigenes Verzeichnis (TransactionLogEntryStorage) in dem die Log-Einträge (LogEntry) abgelegt werden. Es wird sowohl der Beginn und das Ende einer Transaktion protokolliert, als auch die gelesenen oder geschriebenen Werte. Jeder Logeintrag ist mit einem Zeitstempel versehen. 68 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 5.2 Das Wartungstransaktionssystem Abbildung 5-4: Paket Log Am Transaktionende können aus dem Log Informationen darüber gewonnen werden, ob die Ausführung der Transaktion erfolgreich war oder nicht. Diese Prüfung übernimmt, genauso wie das Schreiben der Logeinträge, das Schedule-Protokoll. 5.2.3 Scheduler Die Fabrik-Klasse ScheduleFactory erzeugt eine Instanz des zu verwendeten Scheduleprotokolls (vgl. Konfigurationsdatei) und stellt sie dem Transaktionsmanager zur Verfügung. Die Implementierung der Datenmanipulations- sowie der Transaktionsverwaltungfunktionen des Transaktionsmangers erfolgt zum großen Teil durch das Scheduleprotokoll, da das Vorgehen bei diesen Funktionen von der verfolgten Schedulestrategie abhängt. Abbildung 5-5: Paket Scheduler Folgende Methoden der abstrakten Oberklasse ScheduleProtocol müssen durch die ein konkretes Scheduleverfahren realisierende Unterklassen implementiert werden: 1. Object read(String name, Transaction transaction): Transaktional geschütztes Lesen (vgl. TransactionManager) 69 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 5.2 Das Wartungstransaktionssystem 2. write(String name, Object value, Transaction transaction): Transaktional geschütztes Schreiben (vgl. TransactionManager) 3. addToAnycastAddress(String address, String anycasts, Transaction trans): Hinzufügen einer Adress-zu-Anycastadress-Zuordnung (vgl. TransactionManager). 4. removeFromAnycastAddress(String address, String anycast, Transaction trans): Entfernen einer Adress-zu-Anycastadress-Zuordnung (vgl. TransactionManager). 5. start(Transaction transaction): Starten einer Transaktion ohne Startparameter (vgl. TransactionManager). 6. startParameterIsSet(Transaction transaction): Starten einer Transaktion mit Startparameter (vgl. TransaktionManager). Hier muss beispielsweise das Sperren der verwendeten Strukturdaten beim vorab sperrenden Scheduler erfolgen. 7. close(Transaction transaction, boolean result): Beenden einer Transaktion. Entweder wird die Transaktion erfolgreich beendet und die geänderten Werte festgeschrieben oder die Transaktion wird zurückgesetzt. 8. boolean determineTAResult(Transaction transaction): Prüft, ob auf Grund der verfolgten Schedulestrategie ein Commit oder Abort eingeleitet werden muss. Beispielsweise muss beim optimistischen Scheduleverfahren geprüft werden, ob während einer Transaktion Änderungen an den verwendeten Daten durch andere Transaktionen vorgenommen wurden. Im Rahmen dieser Arbeit wurden beispielhaft das Vorabsperren, das 2-Phasen-Sperren, ein sequentieller sowie ein optimistischer Scheduler realisiert. Zudem erlaubt ein Scheduleprotokoll, das den Transaktionsschutz umgeht, einen Vergleich eines transaktional geschützten mit einem ungeschützten System. 5.2.4 Sperren- und Verklemmungsmanagement Die Sperrenverwaltung (Variablenmanager), die vom DIANEmu bereitgestellt wird, wird um eine Komponente für die Verklemmungsvermeidung erweitert. Sie prüft jedes Mal bevor eine Sperre an eine Transaktion vergeben wird, ob dadurch Probleme mit anderen parallel laufenden Transaktionen entstehen. Hierzu wird ein Wartegraph in Form einer Adjazenz-Matrix verwaltet. Für die Prüfung wird der Wartegraph so erweitert, als ob die Sperre an die Transaktion vergeben wurde, und danach die Hülle des Graphen mit Hilfe des Warshall-Algorithmus gebildet. Ob ein Zyklus und somit eine Verklemmung vorliegt, kann dann einfach durch die Überprüfung der Diagonalwerte der Matrix ermittelt werden. Falls ein Diagonalelement belegt ist, wird die Anfrage nach der Sperre abgewiesen und der Fehler durch eine Ausnahme angezeigt. Die Transaktion wird daraufhin abgebrochen. 70 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 5.2 Das Wartungstransaktionssystem Abbildung 5-6: Sperren-Manager und Verklemmungsvermeidung Zusätzlich zur Vermeidung von Verklemmungen wurde eine Verklemmungserkennung realisiert. Das ist notwendig, um die gehaltenen Sperren von hängenden Operationen wieder freigeben zu können. Hierzu wird ein Timer verwendet. Die Verklemmungserkennung ist direkt im Transaktionsmanager realisiert. 5.2.5 Integration in DIANEmu Um die Entwicklung von Overlay-Protokollen zu vereinfachen, wurden für einige Klassen des DIANEmu konkretere Unterklassen erstellt, die die Karakteristik von Overlays wiedergeben und gleichzeitig das entwickelte Transaktionssystem in den Simulator integrieren. Die ebenfalls im Rahmen dieser Arbeit erstellte Implementierung des Lanes-Overlays zeigt, wie die im Folgenden beschriebenen Klassen zu verwenden sind. Abbildung 5-7: Paket Overlay DIANEmu basiert auf dem Model-View-Controller-Entwurfsmuster (MVC). Es sieht eine strikte Trennung zwischen Darstellung (View), Datenhaltung (Model) und Anwendungslogik (Controller) vor. 71 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 5.2 Das Wartungstransaktionssystem OverlayProtocol & OverlayProtocolState Die Klasse OverlayProtocol ist Superklasse aller Overlay-Protokolle. Sie integriert den Transaktionsmanager in das System und stellt ihn den Protokollzuständen (Klasse OverlayProtocolState) zur Verfügung. In den Zuständen findet die eigentliche Implementierung des Protokolls statt. Insbesondere besitzt die Klasse OverlayProtocolState die Funktionen zum Versenden und Empfangen von Nachrichten und leitet diese Nachrichten zur Protokollierung an den Transaktionsmanager weiter. Das Protokoll mit seinen Zuständen bildet zusammen den MVC-Controller. OverlayModel Die Klasse OverlayModel beschreibt ein allgemeines Modell eines Overlay-Protokolls und ist somit die Modell-Komponente des verwendeten MVC-Entwurfsmusters (Model-ViewController). Jedes Overlay besitzt einen Mechanismus, der einem Knoten erlaubt, der Struktur beizutreten (Login) oder wieder auszusteigen (Logoff). Die OverlayModel-Klasse bietet die entsprechenden Methoden an. Ursprünglich sollten im DIANEmu die Overlay-Strukturinformationen hier im Modell abgelegt werden. Durch den Einbau des Transaktionsschutzes werden aber nun alle kritischen Daten direkt im Variablenmanager gesichert. Damit die Sicht (View) des MVC-Entwurfsmusters (s.u.), die das Modell für den Benutzer grafisch aufarbeitet, dennoch Zugriff auf die OverlayStruktur bekommt stellt die Klasse OverlayModel die Methode getModelVariable(String name) zum Lesen der Strukturdaten zur Verfügung. OverlaySwingView Diese Klasse übernimmt die grafische Darstellung des zu Grunde liegenden Modells, ist also der View der MVC-Sruktur (Model-View-Controller). Sie bietet eine farblich unterschiedliche Darstellungsweise des Knotens, je nachdem, ob dieser eingeloggt ist oder nicht. In einer Unterklasse wird diese Funktionalität ergänzt. Beispielsweise stellt die Klasse LanesSwingView die Lanes-Ketten durch Pfeile dar. Abbildung 5-1 zeigt einen Screenshot des DIANEmu bei dem die LanesSwingView-Darstellung zu sehen ist. TransactionTrackedMessage Nachrichten, die durch das Transaktionssystem mitprotokolliert werden sollen, müssen Subklassen der Klasse TransactionTrackedMessage sein. Die Empfänger- bzw. Senderadresse der Nachricht werden automatisch protokolliert. Zudem besteht die Möglichkeit dem Transaktionssystem zusätzliche im Nachrichtenrumpf transportierte Adressen zugänglich zu machen. TransactionFailureActionRepository Beim Auftreten von Netzwerkpartitionierungen ist es möglich, dass das Commitprotokoll nicht ordnungsgemäß beendet werden kann. Ein Teilnehmer, der das Ergebnis des Commits nicht erhält muss zwangsmäßig das Overlay-Netz verlassen, da ein konsistentes Ergebnis sonst nicht garantiert werden kann. Sollen solche Fehler jedoch toleriert werden, können alternative Maßnahmen definiert werden. Dies geschieht in der Klasse TransactionFailureActionRepository bzw. in einer ihrer für ein bestimmtes Overlay konkretisierten Unterklassen. Jede Aktion bekommt eine Nummer zugewiesen, um mit Hilfe der Methode executeFailureAction(int actionNo) ausgeführt werden zu können. Die Standard-Aktion, der Zwangslogout, hat die Kennziffer 0. 72 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 5.3 Implementierung von Lanes & 2PC-Protokoll 5.3 Implementierung von Lanes & 2PC-Protokoll DIANEmu stellt eine umfangreiche Bibliothek zur Realisierung von Netzwerkprotokollen jeglicher Art zur Verfügung. Dabei immer wieder benötigte Funktionen, wie das Sammeln von ankommenden Nachrichten für eine bestimmte Zeitspanne, werden bereits durch das System angeboten und müssen nicht explizit implementiert werden. Dadurch ist eine wesentlich kompaktere Implementierung der Zustände möglich, als es im allgemeinen Entwurf von Lanes in Kapitel 2 modelliert oder auch beim 2-Phasen-Commit im letzten Kapitel beschrieben wurde. Abbildung 5-8: Paket Lanes Für den Login in Lanes sind beim Initiator beispielsweise nur noch 2 Zustandsklassen erforderlich: eine Vorbereitungsphase bis einschliesslich zum Versenden einer LoginAcceptNachricht und eine daran anschliessende Abschlussphase. Auch das Splitting ist innerhalb einer Zustandsklasse PerformSplittingState realisiert. Ähnliches gilt auch für die Realisierung des 2Phasen-Commit-Protokolls. Zudem bietet die Netzwerkschicht des DIANE-Simulators ein zuverlässiges Transportsystem. Das bedeutet, dass der Sender einer Nachricht eine Rückmeldung erhält, falls eine Nachricht nicht korrekt an den Empfänger ausgeliefert werden konnte. Darum müssen prinzipiell keine expliziten Bestätigungsnachrichten versendet werden, sofern diese keine zusätzlichen Informationen beinhalten. Bei der Lanes-Implementierung wurde aus diesem Grund zum Beispiel auf die Pong-Nachricht verzichtet. Abbildung 5-9: Paket TwoPC 73 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 5.3 Implementierung von Lanes & 2PC-Protokoll Die Realisierung des 2-Phasen-Commit-Protokolls erfolgt direkt mit den von DIANEmu zur Protokollimplementierung bereitgestellten Mitteln. Sie basiert also nicht wie Lanes auf den neuen Overlayprotokollklassen (OverlayProtocol, OverlayProtocolState, ). 5.3.1 Netzwerkpartitionierungen in Lanes Das Problem von Netzwerkpartitionierungen ist für Lanes noch nicht gelöst. Das Problem ist hierbei nicht die Trennung einer einst verbundenen Lanes-Struktur, sondern deren potentielle Wiedervereinigung. Beide Teilstrukturen könnten sich in der Zwischenzeit weiterentwickelt haben. Dadurch besteht die Gefahr, dass Adressbereiche doppelt vergeben wurden, was nur durch eine Adressreorganisation behoben werden kann. Auf Grund dessen ist momentan ein Partitionierungsschutz aktiviert und es sind derzeit höchstens Knotenausfälle zu erwarten. 5.3.2 Funktionelle Anpassungen des Lanes-Protokolls Einführende Tests des implementierten Lanes-Protokolls haben gezeigt, das die alleinige periodische Aktualisierung des Zeigers auf den Vor-Vorgänger eines Knotens durch die PingNachrichten nicht ausreichend ist. Durch strukturändernde Operationen innerhalb eines PingZyklus ist der Zeiger veraltet. Ein nun auftretender Lane-Bruch kann dann nicht mehr behoben werden. Als Folge daraus sind bei allen Operationen Änderungen des Zeigers auf den Vor-Vorgänger zu berücksichtigen. Insbesondere müssen bei den Operationen Login, Logoff und LaneBroken die Nachfolgeknoten über eine UpdatePredPred-Nachricht über diese Änderungen informiert werden. Bei der Split-Operation kann jeder Knoten seinen Vor-Vorgänger durch die Listen der SplitRequest- oder SplitComplete-Nachricht selbst bestimmen. 74 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 5.3 Implementierung von Lanes & 2PC-Protokoll 75 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 6 Evaluierung 6 Evaluierung Das entwickelte Transaktionsschutzsystem wurde anhand einer Lanes-Implementierung im Simulator DIANEmu getestet. Primär war natürlich eine Gegenüberstellung einer schutzlosen und einer transaktional geschützten Lösung von Interesse, um die Korrektheit des Schutzsystems zu zeigen. Darüber hinaus liefert die Evaluierung aber auch Antworten auf folgende Fragen: Wie groß ist der Mehraufwand, der durch das Schutzsystem entsteht? Ist eines der realisierten Schedule-Protokolle besonders für die Anwendung in Overlays geeignet? Dieses Kapitel beschreibt die Ergebnisse dieser Untersuchungen. Zuvor wird das Szenario erläutert, das den Simulationsläufen zu Grunde gelegt wurde. Die Untersuchung der Effektivität und der Effizienz der Lanes-Algorithmen wurde bereits in [13] durchgeführt. Daher wurde an dieser Stelle darauf verzichtet. 6.1 Szenario Für den Test des Systems wurde eine DIANEmu-Benchmark verwendet. Sie ermöglicht die Durchführung parametrisierter Simulationsläufe der entwickelten Protokolle. Im Folgenden werden die verwendeten Einstellungen beschrieben. Eine detaillierte Beschreibung des Benchmarking ist in [15] zu finden. Jeder Lauf simulierte eine Nutzung des Lanes-Overlays durch 25 Benutzer über eine Zeitdauer von 1000 s. Die Benutzer waren zu Beginn einer Simulation nicht eingeloggt. Der Zeitpunkt ihres ersten Logins in Lanes war gleichverteilt im Intervall ab 30 s bis zum Simulationsende. Danach hatten die Benutzer im Einzelnen folgendes Verhalten: Jeder Benutzer bot bis zu fünf Dienste, frühestens ab 60 s nach seinem Login, an. Ein neuer Dienst wurde gleichverteilt alle 120 s bis 240 s publiziert, sofern die maximale Anzahl noch nicht erreicht wurde. Jeder dieser Dienste war 120 s verfügbar, bevor das Dienstangebot wieder zurückgezogen wurde. Ein eingeloggter Benutzer suchte alle 60 s bis 120 s nach einem Dienst. Nach 40 s, in denen keine Aktion (Dienstsuche, Dienstangebot) durchgeführt wurde, verließ der Knoten das Overlay-Netz. Ein erneuter Login war erst nach 10 s möglich. Jedes Lanes-Mitglied sendete alle 15 s eine Ping-Nachricht an seinen Nachfolger. Die Größe einer Lane wurde auf minimal 3 und maximal 10 Knoten festgelegt. 76 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 6.2 Effektivität Als Commit-Protokoll kam, wie beschrieben, das 2-Phasen-Commit zum Einsatz. Für die vorgestellten Schedule-Protokolle wurden jeweils mehrere Simulationsläufe durchgeführt. Dauer Benutzerzahl Suchfrequenz Angebotsfrequenz Angebotshaltezeit Erster Login Erstes Angebot Angebotszahl Wartezeit nach Logoff Logoff (max. Zeit ohne Beschäftigung) 1000 (s) 25 U(60, 120) (s) U(120, 240) (s) 120 (s) U(30, 1000) (s) U(60, 1000) (s) 5 10 (s) 40 (s) Tabelle 1: Benchmark-Einstellungen Die genannten Benchmark-Einstellungen sind in Tabelle 1 nochmals zusammengefasst. Weitere Konfigurationsparameter des 2-Phasen-Commits und des Lanes-Protokolls, wie zum Beispiel maximale Wartezeiten und andere Timer-Werte, sind im Anhang F aufgeführt. 6.2 Effektivität Ziel dieser Arbeit war die Entwicklung eines Schutzsystems, das Inkonsistenzen der Strukturdaten von Overlays verhindert. Um das testen zu können, wurde nach jedem Simulationslauf eine Prüfroutine ausgeführt. Diese analysierte die Lanes-Struktur, die während des Laufs aufgebaut wurde, dahingehend, ob der Vorgänger (bzw. Nachfolger) eines Knotens, diesen auch als dessen Nachfolger (bzw. Vorgänger) ausgewiesen hat. Die gesamten Lanes wurden analog auf korrekte Nachbarschaften hin untersucht. Es wurden je 50 Simulationsläufe mit einem geschützten und einem nicht geschützten System mit zwei verschiedenen Netzlasten durchgeführt. Um ein ungeschütztes System zu simulieren wurde, wie bereits in Kapitel 4.3 beschrieben, ein spezieller Scheduler verwendet, der die Leseund Schreiboperationen ohne Sperren oder ähnlichem direkt an den Variablenmanager weiterleitet. Abbildung 6-1 zeigt die Ergebnisse der Simulationen. inkonsistenter 70 Testlaufanteil 60 (%) 50 66% 44% 40 Netzlast 1 30 Netzlast 2 20 10 2% 4% 0 ohne Schutz mit Schutz Abbildung 6-1: Testlaufanteil mit inkonsistentem Ergebnis 77 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 6.3 Effizienz Die unterschiedlichen Netzlasten wurden durch verschiedene Benchmark-Einstellungen erreicht. Netzlast 1 verwendete die Parameter wie sie im vorangegangenen Kapitel beschrieben wurden. Eine höhere Netzlast (Netzlast 2) wurde durch eine Verdopplung der Knotenanzahl und eine Herabsetzung der Logoff-Idle-Zeit auf 30 Sekunden erzielt. Durch einen schnelleren Logoff der Knoten waren in der gegebenen Simulationszeit mehr Logins und durch die höhere Dynamik mehr Lane-Teilungen und -Wiedervereinigungen möglich. Um 50% der ungeschützten Testläufe endete mit einem inkonsistenten Ergebnis. Bei höherer Netzlast war das Ergebnis höher. Die Wahrscheinlichkeit eines korrekten Laufs war umso geringer, je stärker das Netz genutzt wurde. Das war auch zu erwarten, da mit steigender Wahrscheinlichkeit für nebenläufige Operationen sich auch die Fehlerquellen mehrten. Mit eingeschaltetem Transaktionsschutz konnten die Fehler, von einer geringen Restfehlerrate abgesehen, verhindert werden. Die aufgetretenen Probleme in diesem Fall sind vermutlich auf Programmierfehler zurückzuführen. Der Mehrwert des transaktionalen Schutzsystems konnte auf diese Weise bestätigt werden. Die beobachteten Auswirkungen der Fehler in der Lanes-Struktur waren unter anderem Nachfolgerverweise (bzw. Vorgängerverweise) auf nicht eingeloggte Knoten, sowie Knoten mit mehreren Vorgängern. Die schlimmste Auswirkung, die festgestellt werden konnte, war die Bildung von Zyklen. Das hatte zur Folge, dass Ankündigungen oder Löschanforderungen von Diensten ewig kreisten. Die Anzahl der Dienstnachrichten im simulierten Zeitraum der betroffenen Testläufe stieg um mehr als das Zwanzigfache gegenüber Läufen, in denen dieses Problem nicht auftrat. 6.3 Effizienz Nachdem der vorangegangene Abschnitt die Notwendigkeit und den Nutzen des entwickelten transaktionalen Schutzsystems verdeutlicht hat, wird nun untersucht, welcher zusätzliche Aufwand durch dieses System entsteht. Als Maß für die Aufwandsmessung dient die Anzahl versendeter Nachrichten. Um ein aussagekräftigeres Ergebnis zu erhalten, wurden die Werte von 300 Simulationsläufen arithmetisch gemittelt und verschiedene Scheduler verwendet. Dennoch kann diese Analyse lediglich einen Eindruck über den Aufwand des Systems für die verwendete Lanes-Implementierung geben. Allgemeingültige Aufwandsaussagen sind kaum möglich, da viele Faktoren Einfluss darauf ausüben. Dazu gehören die Art der geschützen Operationen, die Wahrscheinlichkeit ihres Auftretens, die Anzahl der beteiligten Knoten sowie des Verhältnis zwischen der Zahl der Nachrichten der Operation und des sie schützenden Commit-Protokolls. Abbildung 6-2 zeigt die durchschnittliche Verteilung der Nachrichtentypen für das am Anfang des Kapitels beschriebene Szenario. Die Nachrichten gehören zwei Gruppen an, den LanesNachrichten sowie den Nachrichten des Commit-Protokolls (transaktionale Nachrichten). Zu den Nachrichten des Lanes-Overlays gehören Pings, Dienstnachrichten (Ankündigung, Löschung, Suche, Refreshment) und sonstige Wartungsoperationen. Letztere sind von besonderem Interesse, da nur sie durch das Schutzsystem geschützt werden. Dadurch kann schon erheblicher Aufwand eingespart werden, da diese Gruppe, zu der Logins, Logoffs, Splits, usw. zählen, nur rund 49% des Nachrichtenaufkommens von Lanes im untersuchten Szenario ausmachen. Dienstnachrichten und Pings führen keine tiefgreifenden Strukturänderungen durch und benötigen daher keinen Schutz (vgl. Kapitel 4.6). 78 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 6.3 Effizienz Nachrichten- 120 verteilung (%) 100 19% 80 49% 60 20% 40 20 31% 0 Dienst-Nachrichten Ping-Nachrichten Sonstige Nachrichten transaktionale Nachrichten Abbildung 6-2: durchschnittliche Nachrichtenverteilung Insgesamt, also unter Einbezug der Pings und Dienstnachrichten, wurde ein Mehraufwand von 19% durch das Transaktionssystem verursacht. Betrachtet man nur das Verhältnis der Transaktionsnachrichten zu den Nachrichten der Operationen, die dadurch tatsächlich geschützt wurden, ergab sich ein Zusatzaufwand von 40%. Das verdeutlicht, wie wichtig es ist, vorab genau zu überlegen, ob und welche Operationen geschützt werden müssen. Bei der Betrachtung der Transaktionen konnte festgestellt werden, dass davon im Mittel ca. 78% erfolgreich beendet werden. Die durchschnittliche Zahl der an der Transaktion beteiligten Knoten war 3. Um den Systemaufwand noch besser einschätzen zu können, wurden neben den Untersuchungen am beschriebenen Szenario auch weitere Analysen mit verschiedenen Netznutzungsraten durchgeführt. Unter der Netznutzung versteht man in diesem Zusammenhang nicht die Dienstfunktionen oder Pings, sondern die Anzahl der zu schützenden Wartungsoperationen. Als Indikator für das Auftreten von Wartungsoperationen diente die Anzahl der Logins und Logoffs. Je öfter dieser Operationen auftreten, desto höher ist die Netzdynamik und somit auch die Wahrscheinlichkeit für Splits oder Merges. Um die Zahl der Logins und Logoffs zu verändern wurden gegenüber dem beschriebenen Szenario nur die Wartezeit bis zu einem Logoff und die Wartezeit bis zum erneuten Login manipuliert. Die Ergebnisse dieser Testläufe sind in Abbildung 6-3 dargestellt. Das Szenario, wie es oben beschrieben wurde, wies zum Vergleich ca. 65 Logins sowie etwa 40 Logoffs auf. Der beobachtete Aufwand ist am geringsten, wenn keine Logoffs auftreten. Das kann leicht nachvollzogen werden, da in diesem Fall nur 25 Logins vorkommen (bei 25 Netzknoten) sowie genau zwei Split-Operationen (bei einer maximalen Lanes-Länge von 10). Sowohl das Gesamtaufkommen von Transaktionsnachrichten als auch deren Verhältnis zu den Operationsnachrichten sind demnach beschränkt. Je mehr Logoffs beobachtet wurden, desto mehr Logins waren letztendlich wieder möglich. Dies bringt auch Dynamik bei Split- und Merge-Operationen. Der Aufwand stieg dadurch leicht an. Dagegen konnte beim Anteil erfolgreich abgeschlossener Transaktionen (bzw. abgebrochener Transaktionen) kein Trend festgestellt werden. 79 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 6.4 Vergleich der Scheduleprotokolle 100 % 90 80 70 60 50 40 30 20 10 0 25/0 35/9 34/13 39/20 43/27 60/40 70/40 Netznutzung (Logins/Logoffs pro 1000s) erfolgreiche Transaktionen abgebrochene Transaktionen Verhältnis TA-Nachrichten zu Wartungsnachrichten Transaktions-Gesamtaufwand Abbildung 6-3: Aufwand vs. Netznutzung Zusammenfassend ist festzustellen, dass der Aufwand des transaktionalen Systems nicht unbedeutend ist. Durch eine genaue Abwägung, wann der Schutz wirklich sinnvoll und notwendig ist, kann er jedoch stark gesenkt werden. 6.4 Vergleich der Scheduleprotokolle Neben der generellen Funktion des Systems und seines Gesamtaufwands wurde untersucht, ob charakteristische Unterschiede im Systemverhalten durch den Einsatz der verschiedenen implementierten Schedule-Protokolle feststellbar sind. Die Ergebnisse dieses Vergleichs sind in diesem Abschnitt zusammengefasst. Abbildung 6-4 liefert einen grafischen Überblick. Die Daten lieferten je 50 Simulationsläufen mit den beschriebenen Szenarioparametern. Zu den untersuchten Protokollen gehörten, wie bereits ausführlich beschrieben, ein optimistischer Scheduler, das Zwei-Phasen-Sperrprotokoll, das Vorabsperren sowie ein sequentieller Scheduler. Als Vergleichskriterien dienten Parameter, die auch schon in den vorangegangenen Abschnitten genannt wurden, wie die Anzahl erfolgreich abgeschlossener Transaktionen, das Verhältnis zwischen der Anzahl der Transaktionsnachrichten und der Anzahl der transaktional geschützten Lanes-Nachrichten sowie der Anteil der Transaktionsnachrichten am Gesamtnachrichtenaufkommen. Zusätzlich wurden auch Transaktionen betrachtet, die auf Grund von Timing-Fehlern beim Commit abgebrochen werden mussten (fehlerhafte Transaktionen). Abbildung 6-4 zeigt, dass alle Scheduleprotokolle ähnliche Ergebnisse liefern. Keines der Protokolle erscheint auf den ersten Blick besonders geeignet oder ganz ungeeignet. Bei einer genaueren Betrachtung der Ergebnisse sind jedoch leichte Vorteile des Vorabsperrens erkennbar. Es erlaubt die parallele Ausführung von Operationen, sofern diese nicht auf den 80 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 6.5 Zusammenfassung gleichen Strukturdaten arbeiten, und verringert somit die Gefahr von Timeouts. Diese führen zum Beispiel beim sequentiellen Scheduler zu einer erhöhten Rate fehlerhafter Transaktionen. % 100 90 80 70 60 50 40 30 20 10 0 81 87 91 84 52 9 erfolgreiche TAs 2 4 19 16 8 fehlerhafte TAs Optimistisch 2PC 43 47 47 15 18 Anteil TANachrichten Vorabsperren Verhältnis TAzu LanesNachrichten Sequentiell Abbildung 6-4: Schedulervergleich Durch das Vorabsperren wird außerdem das Risiko für Verklemmungen und die dadurch notwendigen Transaktionsabbrüche gegenüber beispielsweise dem 2-Phasen-Sperren minimiert. Insgesamt resultiert daraus das beste Ergebnis der Quote erfolgreicher Transaktionen. In allen Bereichen zeigte das optimistische Verfahren die schlechtesten Werte und ist daher am wenigsten zu empfehlen. Das liegt daran, dass bei auftretenden Fehlern die Transaktion zurückgesetzt und neu gestartet wird. Bei sperrenbasierten Protokollen hingegen wird versucht parallele Operationen zu verzögern, um das Rücksetzen zu vermeiden. Dies ist aber auch nur im begrenzten Rahmen möglich, wie der sequentielle Scheduler zeigt. 6.5 Zusammenfassung Die Effektivität des entwickelten Transaktionsschutzes konnte durch die durchgeführten Tests bestätigt werden. Neben der Effektivität wurde für das Lanes-Overlay ein mäßiger Zusatzaufwand festgestellt, der auch dadurch erreicht wurde, dass nicht alle Operationen geschützt werden. Sonst fällt der Aufwand, der durch das verwendete Commit-Protokoll entsteht, deutlich höher aus. Der theoretische Beweis der Korrektheit des Systems steht noch aus. Dabei ist gerade der Aspekt interessant, dass nicht alle Operationen und Operationsteile geschützt werden. Die Korrektheit der verwendeten Scheduler und des 2-Phasen-Commit-Protokolls ist hingegen in der Literatur ausreichend beschrieben. Im Rahmen der Tests konnte nur begrenzt das Verhalten bei Knotenausfällen und ausbleibenden Nachrichten überprüft werden, da das Lanes-Protokoll, das für die Simulationsläufe verwendet wurde, für die Probleme, die bei der Partitionierung des Netzwerks entstehen, noch nicht vollständig spezifiziert wurde. Einige Fehler traten bei der Simulation auf Grund von TimingProblemen während der Operationen dennoch auf. Das Schutzsystem reagierte in diesen Fällen erfolgreich mit dem Abbruch der jeweiligen Transaktion. 81 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 7 Zusammenfassung & Ausblick 7 Zusammenfassung & Ausblick Dieses Kapitel liefert einen Überblick über die Ergebnisse dieser Arbeit und zeigt danach in einem Ausblick, welche zukünftigen Tätigkeiten daran angeschlossen werden könnten. 7.1 Zusammenfassung Ziel dieser Diplomarbeit war die Entwicklung eines Schutzsystems für Wartungsoperationen in Overlay-Netzen für die Dienstsuche und -bereitstellung in mobilen Ad-hoc-Netzen im Rahmen des DIANE-Projekts. Dieses System sollte die Atomizität und Isolation dieser Operationen gewährleisten und somit die Konsistenz der Strukturinformationen des Overlay-Netzes auf jedem einzelnen teilnehmenden Knoten erhalten. Untersuchungen verschiedener Overlay-Protokolle wie CAN, Chord, Pastry oder Tapestry im Vorfeld, ergaben mehrere bisher gängige Lösungsansätze des Problems: strenge sequentielle Bearbeitung der Operationen, zum Beispiel durch die Verwendung von Prioritäten, das Zulassen von Inkonsistenzen und deren periodische Korrektur durch Reorganisationsphasen, Verwendung fehlertoleranter Strukturen sowie eine protokollspezifische Fehlerbehandlung. Keine dieser Lösungen konnte jedoch voll überzeugen. Der in dieser Arbeit verfolgte Ansatz sollte deshalb diesen Möglichkeiten entgegenstehen und eine vom verwendeten Overlay-Protokoll möglichst unabhängige, generische Lösung bereitstellen, um eine Einsetzbarkeit in verschiedenen Overlay-Protokollen zu erreichen und die Entwicklung dieser Protokolle zu vereinfachen. Als Ausgangspunkt für die Überlegungen diente das aus dem Datenbankumfeld bekannte Prinzip von Transaktionen. Transaktionen dienen dort zur Durchsetzung der ACIDEigenschaften und stellen somit genau das Instrument zur Verfügung, das auch bei der Ausführung von Wartungsoperationen in Overlays für deren korrekten Ablauf benötigt wird. Ein Overlay-Netz wurde demnach als verteiltes Datenbanksystem aufgefasst, in dem jeder Knoten seine lokalen Strukturdaten selbst verwaltet. Wartungsoperationen stellen dann verteilte Transaktionen auf diesen Daten dar. Mehrere Teilaufgaben waren bei der Entwicklung dieses transaktionalen Schutzsystems zu bearbeiten. Lokale Scheduler garantieren die Serialisierbarkeit auf jedem der Knoten. Dabei wurden mehrere in der Praxis gängige Schedule-Protokolle, wie das Zwei-Phasen-Sperren oder ein optimistisches Verfahren, zusammen mit zusätzlichen Komponenten, die für deren Funktion notwendig sind, realisiert. Dazu gehörte vor allem ein umfangreiches Logging. Ein Commitprotokoll erzeugte darüber hinaus globale Serialisierbarkeit. Hier wurde nach Untersuchung mehrerer Alternativen das Zwei-Phasen-Commitprotokoll gewählt. Schließlich musste das Schutzsystem in die bisherige Implementierung des DIANE-Simulators integriert werden. In diesem Zusammenhang ist eine API entstanden, die die Entwicklung neuer 82 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 7.2 Ausblick Overlay-Protokolle vereinfacht und ihnen darüber hinaus den transaktionalen Schutz zur Verfügung stellt. Scheduler und Commit-Protokoll wurden so realisiert, dass verschiedene Implementierungen bei Bedarf einfach ausgetauscht werden können. In einem letzten Schritt wurde das Lanes-Overlay im DIANE-eigenen Simulator implementiert und mit dem entwickelten Transaktionssystem geschützt. Lanes diente in dieser Arbeit als ausführliches Beispiel eines Overlay-Netzes. An ihm wurden die beschriebenen Probleme analysiert und schließlich die Arbeitsweise und Korrektheit des entwickelten Systems im Anschluss daran erfolgreich getestet. Die Evaluation hat darüber hinaus aber auch gezeigt, dass beim Einsatz des Systems genau dessen Nutzen gegenüber dem hauptsächlich durch das Commit-Protokoll entstehenden Aufwand abzuwägen ist. Auf Grund der Generiziät des Systems werden alle Operationen transaktional gleich behandelt. Nicht alle Operationen dienen jedoch der Erhaltung der Struktur und müssen daher auch nicht zwingend geschützt werden. So konnte bei Lanes erheblich Aufwand eingespart werden, in dem die Dienstoperationen und die Ping-Nachrichten der Konnekivitätsprüfungen, die zusammen ca. 50% des Nachrichtenaufkommens von Lanes stellen, keinen Transaktionsschutz in Anspruch nahmen. 7.2 Ausblick Im Laufe der Realisierung des Transaktionssystems und der Implementierung des LanesProtokolls konnten einige Themenbereiche identifiziert werden, die Ansatz für weiterführende Arbeiten sein können. Mit dem Ausblick auf diese zukünftigen Aufgaben wird diese Arbeit abgeschlossen. Für das entwickelte Schutzsystem wurde bisher ausschließlich das 2-Phasen-Commit-Protokoll implementiert, da es bei der Analyse der gängigen Commit-Protokolle als am geeignetsten angesehen wurde. Das soll für die Zukunft jedoch nicht bedeuten, dass hier eventuell alternative Verfahren, beispielsweise auch eine proprietäre Lösung, nicht möglich sind. Das System ermöglicht die leichte Integration solcher Lösungen. Gleiches gilt auch für die verwendeten Schedule-Protokolle. Hier wurden bereits einige Verfahren umgesetzt und getestet. Eine Erweiterung dieser Protokollsammlung um zum Beispiel zeitbasierte Verfahren stellt einen weiteren Ansatzpunkt dar. Es existieren zahlreiche Overlay-Netze. Hier konnte daher nur einen Bruchteil dieser Protokolle hinsichtlich geeigneter Lösungen zur Konsistenzwahrung von Strukturinformationen untersucht werden. Diese Arbeit konzentrierte sich dabei auf Overlay-Strukturen, die sich für die Dienstsuche eignen. Diese Untersuchungen könnten auch auf Overlays für andere Aufgabenbereiche ausgedehnt werden, wie zum Beispiel die am Institut für Telematik der Universität Karlsruhe entwickelten Verfahren zur Gruppenkommunikation in Ad-hoc-Netzen [23]. Diese Arbeit verwendete für die Realisierung des Transaktionssystems das Lanes-Overlay als praktisches Beispiel eines typischen Overlay-Netzwerks. Neben Arbeiten, die sich mit der Erweiterung des Systems beschäftigen, wäre daher auch dessen Integration und Nutzung in einem weiteren Overlay-Protokoll eine wichtige Aufgabe, um die Funktionalität auch für andere Bereiche zu evaluieren. Obwohl das Lanes-Protokoll durch diese Arbeit bereits prototypisch umgesetzt wurde, ist dessen Entwicklung noch nicht abgeschlossen. Eine wichtige Aufgabe in diesem Umfeld wäre 83 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 7.2 Ausblick die Klärung des Verhaltens beim Auftreten von Netzwerkpartitionierungen. Dieses Problem wurde bisher von der Betrachtung ausgeschlossen. In dieser Arbeit wurde ansatzweise für den Login in Lanes ein Verfahren vorgestellt, wie die Fehlerbehebung ohne Transaktionsschutz realisiert werden könnte. Es hat sich gezeigt, dass dieser Ansatz sehr komplex ist. Dennoch wäre eine funktionsfähige Referenzimplementierung von Lanes, die dieses Verfahren nutzt, eine interessante Ergänzung zu dieser Arbeit. 84 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- 7.2 Ausblick 85 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Anhang Anhang A Abkürzungen ACID API CAN DBMS DFG DHT DIANE DNS GSM IEEE ISO JAMES LAN MANET Cambridge-MIT MVC OSI SHA-1 TCP UML VDBMS VID WLAN 2PC Atomicity Consistency Isolation Durability Application Programming Interface Content Addressable Network Datenbasis-Managementsystem Deutsche Forschungsgemeinschaft Distributed Hashtable Dienste in Ad-hoc-Netzen Domain Name Service Global System for mobile Communications Institute of Electrical and Electronics Engineers International Standard Organization Java-based Agent Modeling Environment for Simulation Local Area Network Mobile Ad Hoc Network Cambridge Massachusetts Institute of Technology (CMI) Model-View-Controller-Entwurfsmuster Open System Interconnection Secure Hash Algorithm Transmission Control Protocol Unified Modeling Language Verteiltes Datenbasis-Managementsystem Virtueller Identifier Wireless Local Area Network 2-Phasen-Commit 86 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Anhang B Idee eines spezifischen Lösungsansatzes für Lanes Abbildung B-1 zeigt die in Kapitel 3 beschriebenen Erweiterungen des Lanes-Protokolls am Beispiel des Login. Die neu hinzukommenden Teile sind gestrichelt und hellgrau dargestellt. Abbildung B-1: Lanes-Login mit Fehlermechanismus 87 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Anhang C Ergänzungen zur Lanes-Spezifikation Im Folgenden sind vervollständigende Angaben zur Spezifikation von Lanes aus Kapitel 2 zu finden. Dazu zählen die verwendeten Methoden und die Strukturdaten, die von den einzelnen Lanes-Mitgliedern verwaltet werden. C.1 Strukturinformationen LanesHandler -unicastAdress : String -leftLaneAddress : String -rightLaneAddress : String -leftNeighborLane : String -rightNeighborLane : String -pred : String -succ : String -laneOffers : List -loggedIn : boolean -predPred : String -predCounter : int Abbildung C-2: Attribute des Lanes-Handler C.2 Methoden LoginAccept accept() { LoginAccept accept = new LoginAccept(); accept.destination = bestOffer.getSender(); return accept; } boolean acceptRequest(LoginRequestMessage request){ //apropriate heuristic if(..){ return true; }else{ return false; } } void addService(Service s){ laneOffers.add(s); } RefreshRequestMessage addToRequest(RefreshRequestMessage rrm){ rrm.laneOffers.add(myservices); return rrm; } 88 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Anhang SplitRequestMessage addToRequest(SplitRequestMessage srm){ List nodeList1 = srm.list1; List nodeList2 = srm.list2; if(nodeList2.size() < nodeList1.size()){ nodeList2.add(unicastAddress); }else{ nodeList1.add(unicastAddress); } srm.list1 = nodeList1; srm.list2 = nodeList2; return srm; } void chooseBestOffer() { if (laneOffers.size() == 0) { bestOffer = null; }else { //appropriate heuristic ... } } LoginInformation informSuccessor(LoginAcceptMessage accept) { LoginInformation inform = new LoginInformation(); inform.destination = succ; inform.newPred = accept.getSender(); return inform; } LoginResponse loginResponse() { LoginResponse response = new LoginResponse(); response.success = loggedIn; return response; } LoginRequest loginRequest() { LoginRequestMessage lrm = new LoginRequestMessage(); lrm.destination = "255.255.255.255"; lrm.setTimeToLive(-1); // no time to live } LogoffResponse logoffResponse() { LogoffResponse response = new LogoffResponse(); response.success = !loggedIn; return response; } boolean nextExists(Message m){ //m instanceof ServiceOfferMessage or ServiceRevokeMessage String previous = m.getSender(); if(previous == pred && succExists()){ return true; }else if(previous == succ && predExists()){ return true; }else{ return false; } } 89 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Anhang boolean nextLaneExists(ServiceRequestMessage srm){ String previous = srm.sourceLane; if(previous == leftNeighborLane && rightNeighborLane != null){ return true; }else if(previous == rightNeighborLane && leftNeighborLane != null){ return true; }else{ return false; } } boolean predExists(){ if(pred != null){ return true; }else{ return false; } } ServiceRevoke removeOffers(String address){ ServiceRevoke revoke = new ServiceRevoke(); revoke.addServicesFromNode(address); laneOffers.removeAll(address); return revoke; } ServiceRevoke removeOffers(Service s, String address){ ServiceRevoke revoke = new ServiceRevoke(); revoke.addService(s, address); laneOffers.remove(s, address); return revoke; } void removePredecessor(){ pred = null; } void removeSuccessor(){ succ = null; } void resetValues(){ laneAddressLeft = null; laneAddressRight = null pred = null succ = null; leftNeighborLane = null; rightNeighborLane = null; loggedIn = false; laneOffers.clear(); } void send(Message message) { //Versenden einer Nachricht } 90 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Anhang boolean serviceLocallyAvailable(Service s){ if(s in laneOffers){ return true; }else{ return false; } } void setAsFirstMember() { leftLaneAddress = "222.222.222.1"; rightLaneAddress = "222.222.222.254"; leftNeighborLane = null; rightNeighborLane = null; pred = null; succ = null; loggedIn = true; } boolean succExists(){ if(succ != null){ return true; }else{ return false; } } void updateLeftNeighbor(Message message){ if(message instanceof RemoveLaneMessage){ leftLaneAddress = ((RemoveLaneMessage)message).getLeftAddress(); } } void updateRightNeighbor(Message message){ if(message instanceof RemoveLaneMessage){ rightLaneAddress = ((RemoveLaneMessage)message).getRightAddress(); } } void updateServices(RefreshCompleteMessage rcm){ laneOffers = rcm.offers; } void updateStructure(SplitCompleteMessage scm){ List nodeList1 = scm.list1; List nodeList2 = scm.list2; if(unicastAddress in nodeList1){ int index = nodeList1.getIndexOf(unicastAddress); laneAddressRight = laneAddressLeft + (laneAddressRight laneAddressLeft)/2; pred = nodeList1[index-1]; succ = nodeList1[index+1]; rightNeighborLane = laneAddressLeft + (laneAddressRight laneAddressLeft)/2+1; }else{ int index = nodeList2.getIndexOf(unicastAddress); laneAddressLeft = laneAddressLeft + (laneAddressRight laneAddressLeft)/2+1; 91 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Anhang } pred = nodeList2[index-1]; succ = nodeList2[index+1]; leftNeighborLane = laneAddressLeft + (laneAddressRight laneAddressLeft)/2; } void updateSuccessor(Message message){ if(message instanceof LoginAcceptMessage){ succ = ((LoginAcceptMessage)message).getSender(); }else if(message instanceof LogoffInformationMessage){ succ = ((LogoffInformationMessage)message).newSucc; }else if(message instanceof LaneBrokenConfirmationMessage){ succ = ((LaneBrokenMessage)message).getSender(); } } void updatePredecessor(Message message){ if(message instanceof LoginInformationMessage){ pred = ((LoginInformationMessage)message).newPred; }else if(message instanceof LogoffInformationMessage){ pred = ((LogoffInformationMessage)message).newPred; }else if(message instanceof LaneBrokenConfirmationMessage){ pred = ((LaneBrokenConfirmationMessage)message).getSender(); } } void updateValues(LoginConfirmationMessge lcm) { laneAddressLeft = lcm.laneAddressLeft; laneAddressRight = lcm.laneAddressRight; pred = lcm.getSender(); succ = lcm.succ; leftNeighborLane = lcm.NeighborLaneLeft; rightNeighborLane = lcm.NeighborLaneRight; Enumeration<Service> theOfferedServices = lcm.laneOfferedServices.elements(); for (Service curServ : theOfferedServices) { laneOffers.add(curServ); } } 92 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Anhang D Ergänzungen zu Pastry, Chord und Tapestry Dieser Anhang stellt eine Ergänzung zu den Beschreibungen der Overlay-Netze in Kapitel 3 dar. D.1 Pastry Abbildung D-3 zeigt ein Beispiel für die Zustandsinformationen eines Pastry-Knotens. In Kapitel 3 wurde bereits die Funktionsweise des Routing mit Hilfe der Routingtabellen und des Leaf-Sets beschrieben. Der Leaf-Set eines Knotens beinhaltet Knoten, deren IDs zur eigenen ID am ähnlichsten sind. Der Knotenzustand wird durch den so genannten Neighborhood-Set komplettiert, der bisher nicht erläutert wurde. Der Neighborhood-Set dient nicht dem Routing, sondern der Verwaltung von Lokalitätseigenschaften. Er beinhaltet die Adressen von Knoten, die bezüglich einer zu Grunde liegenden Metrik, zum Beispiel Latenz oder Fehlerwahrscheinlichkeit, dem betrachteten Knoten am nächsten liegen. Neighborhood-Set Routing-Tabelle 13021022 02212102 10200230 22301203 02212102 22301203 31203203 11301233 31203203 11301233 12230203 13021022 31301233 33213321 10031203 10132102 10323302 Knoten ID 10233102 Leaf-Set kleiner größer 10233033 10233120 10233021 10233122 10233001 10233230 10233000 10233232 10200230 10211302 10222302 10230322 10231000 10232121 ... Abbildung D-3: Pastry-Knotenzustand (nach [16]) D.2 Chord Abbildung D-4 verdeutlicht die Struktur von Chord und die für das Routing verwendeten Fingertabellen. Diese speichern die direkten Nachfolger eines Chord-Knotens im Ring zusammen mit dem Intervall der Objekt-IDs, für die der jeweilige Knoten zuständig ist. 93 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Anhang Start Int. Nachf. 1 [1,2) 1 2 [2,4) 3 4 [4,0) 6 Start Int. Nachf. 2 [2,3) 3 3 [3,5) 3 5 [5,1) 6 0 7 1 6 2 3 5 Start Int. Nachf. 7 [7,0) 0 0 [0,2) 0 2 [2,6) 3 4 Start Int. Nachf. 4 [4,5) 6 5 [5,7) 6 7 [7,3) 0 Abbildung D-4: Chord-Knotenzustand (nach [21]) D.3 Tapestry Dieser Abschnitt beschreibt das verteilte Verzeichnissystem von Tapestry, das zur Veröffentlichung und zur Suche nach Objekten verwendet wird. Bei den vorgestellten Overlay-Netzen werden die gespeicherten Objekte auf Grund der Ähnlichkeit der Objekt-IDs und der Knoten-IDs auf den gemeinsamen verteilten Speicher verstreut. Tapestry geht hier einen anderen Weg und überlässt die Entscheidung über den Speicherort der Objekte den Anwendern. Der Knoten mit der zu einer Objekt-ID ähnlichsten Knoten-ID wird als Wurzel bezeichnet und verwaltet den Verzeichniseintrag für das jeweilige Objekt. 4377 437A 43FE 3228 Buch XY (4378) 4361 4664 4A6D 4B4F E391 AA93 Publizierung Objektpointer Anfrage 57EC Buch XY (4378) Abbildung D-5: Objektpublizierung und speicherung (nach [26]) Ein Server S (Knoten auf dem ein Objekt O gespeichert ist) publiziert in gleich bleibenden Abständen dieses Objekt durch Senden einer Publish-Nachricht an die Wurzel. Jeder Knoten, den diese Nachricht passiert, speichert einen Pointer <O, S>. 94 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Anhang Ist ein Client-Knoten an einem Objekt interessiert, sendet er eine Anfrage mit der gewünschten Objekt-ID. Diese wird in Richtung des Wurzel-Knotens dieses Objekts geroutet. Besitzt ein Router jedoch einen direkten Pointer auf den zuständigen Server, wird die Anfrage dorthin umgeleitet. Neben der Ersparnis von Routing-Hops kann dadurch auch gewährleistet werden, dass der zum Client-Knoten nächste Server angesprochen wird, falls mehrere Server das Objekt zur Verfügung stellen. 95 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Anhang E Klassen- und Paketübersicht Dieser Abschnitt gibt einen Überblick über alle im Rahmen dieser Arbeit erstellten JavaKlassen und Pakete und beschreibt kurz deren Funktion. E.1 Transaktionssystem diane.pflueger.maintainance.core Kernkomponenten des Transaktionssystems TransactionManager Benutzerschnittstelle und Transaktionsverwaltung Transaction Repräsentation einer Transaktion und transaktionslokale Speicherablage MaintainanceConfiguration Schnittstelle für den Zugriff auf die Konfigurationsdatei des Transaktionssystems CommitToleranceConfiguration Konfiguration des Toleranzniveaus beim Commit diane.pflueger.maintainance.log Transaktionslog LogManager Logverwaltung TransactionLogEntryStorage Verwaltung aller Logeinträge einer Tansaktion LogEntry Einzelner Logeintrag diane.pflueger.maintainance.commit Commitprotokoll CommitProtocol Oberklasse eines Commitprotokolls CommitException Ausnahme bei Fehlern beim Commit durch Netzwerkpartitionierung diane.pflueger.maintainance.scheduler Scheduler ScheduleProtocol Oberklasse eines Schedulers ScheduleFactory 96 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Anhang Fabrik zur Erzeugung einer spezifizierten Scheduler-Instanz NOProtectionScheduleProtocol Scheduler, der den transaktionalen Schutz umgeht (nur zur Evaluation!) OptimisticScheduleProtocol Optimistischer Scheduler TwoPhaseScheduleProtocol Scheduler mit strengem 2-Phasen-Sperren PreLockingScheduleProtocol Vorab sperrender Scheduler SequentialScheduleProtocol Sequenzialisierendes Schedule-Protokoll diane.pflueger.maintainance.overlay Allgemeine Vorlagen für die Realisierung von Overlay-Protokollen OverlayProtocol Oberklasse eines Overlay-Protokolls OverlayProtocolState Oberklasse für einen Zustand eines Overlay-Protokolls (Stellt Transaktionsfunktionalität zur Verfügung) OverlayModel Allgemeines Modell eines Overlay-Protokolls OverlaySwingView Allgemeine Darstellung eines Overlay-Protokolls TransactionTrackedMessage Vom Transaktionssystem protokollierbarer Nachrichtentyp TransactionFailureActionRepository Sammlung möglicher Fehlerbehebungsaktionen bei Commitfehlern OverlayConfiguration Oberklasse für die Schnittstelle für Konfigurationsdatei des Overlay-Protokolls den Zugriff auf diane.pflueger.maintainance.deadlock Verklemmungsvermeidungssystem für sperrenbasierte Schedule-Protokolle DeadlockPrevention Verklemmungsvermeidung AdjacencyMatrix Adjazenzmatrix des Wartegraphen DeadlockException Ausnahme zur Anzeige einer verhinderten Verklemmung 97 die Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Anhang E.2 Lanes-Protokoll diane.pflueger.lanes Lanes-Protokoll LanesProtocol Protokollklasse mit den Lanesbenutzerfunktionen (Login, ) LanesConfiguration Schnittstelle für den Zugriff auf die Konfigurationsdatei des LanesProtokolls LanesTransactionFailureActions Sammlung konkreter Fehlerbehebungsaktionen bei Commitfehlern diane.pflueger.lanes.usercalls Benutzerfunktionsaufrufe und -ergebnisse des Lanes-Protokolls LoginCall Anzeige eines Login-Wunschs durch den Benutzer LoginResponse Ergebnisanzeige eines Logins LogoffCall Anzeige eines Logoff-Wunschs durch den Benutzer LogoffResponse Ergebnisanzeige eines Logoffs ServiceOfferCall Anzeige eines Dienstangebots durch den Benutzer ServiceOfferResponse Ergebnisanzeige eines Dienstangebots ServiceRevokeCall Anzeige des Zurücknehmens eines Dienstangebots durch den Benutzer ServiceRevokeResponse Ergebnisanzeige einer Dienstangebotsrücknahme ServiceSearchCall Anzeige einer Dienstsuche durch den Benutzer ServiceSearchResponse Ergebnis einer Dienstsuche 98 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Anhang diane.pflueger.lanes.structures Modell und View des Lanes-Protokolls LanesModel Modell des Lanes-Protokolls LanesSwingView Darstellungsanweisungen einer Lane diane.pflueger.lanes.messages Nachrichten des Lanes-Protokolls login.LoginRequestMessage Loginwunsch login.LoginOfferMessage Loginangebot login.LoginAcceptMessage Akzeptieren eines Loginangebots login.LoginInformationMessage Informieren von Reaktor 2 login.LoginInformationConfirmationMessage Informationsbestätigung durch Reaktor 2 login.LoginConfirmationMessage Loginbestätigung an den Initiator logoff.LogoffInformationMessage Informieren von Vorgänger und Nachfolger beim Logoff logoff.RemoveLaneMessage Informieren einer Nachbarlane beim Logoff des letzten Laneknotens ping.LanePingMessage Ping-Nachricht ping.ConnectivityCheckMessage Verbindungsprüfung zu Vorgänger vor dem Start von LaneBroken ping.NotLoggedMessage Nachricht, um anzuzeigen, dass der angepingte Knoten ausgeloggt ist lanebroken.LaneBrokenMessage Starten der Lane-Reparatur lanebroken.LaneBrokenConfirmationMessage Bestätigung der Lane-Reparatur splitting.SplitRequestMessage Starten der Lane-Teilung 99 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Anhang splitting.SplitCompleteMessage Bestätigung der Lane-Teilung merging.MergeRequestMessage Starten der Lane-Wiedervereinigung service.ServiceOfferMessage Dienstangebot service.ServiceRevokeMessage Rücknahme eines Dienstangebots service.ServiceSearchMessage Dienstsuche service.ServiceSearchResultMessage Dienstsuche-Ergebnis service.ServiceRefreshRequestMessage Starten der Dienstaktualisierung service.ServiceRefreshCompleteMessage Beenden der Dienstaktualisierung other.InitalizationEvent Event zur Anzeige eines erfolgreichen Logins zur Knoteninitialisierung other.UpdatePredPredMessage Aufforderung zur Aktualisierung des Vor-Vorgängers interlaneconnectivity.MissingLaneMessage Broadcast-Nachricht zur Suche nach neuem Lane-Nachbar interlaneconnectivity.MissingLaneAnswerMessage Antwort auf MissingLaneMessage interlaneconnectivity.UpdateNeighborLaneMessage Nachricht zur Aktualisierung der Nachbar-Lane diane.pflueger.lanes.states Zustände des Lanes-Protokolls login.StartLoginState_Initiator Beginn des Loginvorgangs (Initiator) login.PerformLoginState_Initiator Logindurchführung (Initiator) login.LoginOfferProcessingState_Reaktor1 Versenden eines Loginangebots nach Erhalt von Anfragen (Reaktor 1) login.InformSuccessorState_Reaktor1 Informieren des Nachfolgers nach Erhalt einer Accept-Nachricht (Reaktor 1) 100 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Anhang login.WaitForInfoConfState_Reaktor1 Warten auf Bestätigung durch Nachfolger und Senden der Bestätigung an neuen Knoten (Reaktor 1) login.PerformLoginState_Reaktor2 Logindurchführung (Reaktor 2) logoff.PerformLogoffState_Initiator Logoffdurchführung (Initiator) logoff.PerformLogoffState_Reaktor Logoffdurchführung (Reaktor) ping.SendPingState Pingdurchführung (Vorgänger): Senden eines Pings ping.WaitForPingState Pingdurchführung (Nachfolger): Warten auf Ping lanebroken.PerformLaneBrokenState_Predecessor LaneBroken-Durchführung (Vorgänger) lanebroken.PerformLaneBrokenState_Successor LaneBroken-Durchführung (Nachfolger) splitting.PerformSplittingState Split-Durchführung merging.PerformMergingState Durchführung einer Wiedervereinigung mit den Nachbar-Lanes service.announce.PerformServiceAnnounceState Durchführung eines Dienstangebots service.refresh.PerformServiceRefreshState Durchführung der Dienstaktualisierung service.revoke.PerformServiceRevokeState Durchführung einer Dienstangebotslöschung service.search.StartServiceSearchState_Initiator Starten der Dienstsuche (Initiator) service.search. PerformServiceSearchState_Initiator Warten auf Dienstsucheergebnisse (Initiator) service.search. PerformServiceSearchState_Reaktor Prüfung, ob gesuchte Dienste bekannt (Reaktor) interlaneconnectivity. PerformInterLaneConnectivityCheckState Durchführung der Fehlerbehebung für Inter-Lane-Verbindungen 101 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Anhang E.3 Zwei-Phasen-Commit-Protokoll diane.pflueger.maintainance.commit.twopc Zwei-Phasen-Commit-Protokoll TwoPhaseCommitProtocol Zwei-Phasen-Commit-Protokoll TwoPCConfiguration Schnittstelle für den Zugriff auf die Konfigurationsdatei des 2PCProtokolls diane.pflueger.maintainance.commit.twopc.usercalls Benutzerfunktionsaufrufe und -Ergebnisse des 2PC-Protokolls CoordinatorCommitCall Start des Commit-Protokolls als Koordinator ParticipantCommitCall Start des Commit-Protokolls als Teilnehmer CommitResponse Ergebnisanzeige des Commit-Protokolls diane.pflueger.maintainance.commit.twopc.messages Nachrichten des 2PC-Protokolls VoteMessage Abstimmungsnachricht über Transaktionsende VoteResultMessage Bekanntgabe des Ergebnisses der Transaktion MissingVoteResultMessage Suche nach Transaktionsergebnis, falls Verbindungsabbrüche eingetreten sind MissingVoteResultAnswerMessage Antwort auf MissingVoteResultMessage mit Transaktionsergebnis diane.pflueger.maintainance.commit.twopc.states Zustände des 2PC-Protokolls PerformCommitState_Coordinator Commit-Durchführung als Koordinator PerformCommitState_Participant Commit-Durchführung als Teilnehmer 102 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Anhang ProcessMissingVoteState Bearbeitung nicht angekommener Transaktionsergebnismitteilungen diane.pflueger.maintainance.commit.twopc.other Sonstige Klassen des 2PC-Protokolls VoteMessageRepository Datenstruktur zur Verwaltung eingehender Votes beim Koordinator bis zu deren Verarbeitung VoteInformation Teil der Datenstruktur zur Verwaltung von Votes beim Koordinator E.4 Sonstiges diane.pflueger.general Allgemeine Klassen ServiceDescription Dienstbeschreibung ServiceDescriptionStorage Speicherstruktur für Dienstbeschreibungen Tools Allgemeine wiederverwendbare Funktionen 103 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Anhang F Parameter-Einstellungen Die folgenden Einstellungen des 2-Phasen-Commits und des Lanes-Protokolls wurden bei der Evaluierung zu Grunde gelegt. Die Benchmark-Parameter wurden bereits in Tabelle 1 in Kapitel 6 beschrieben. F.1 2-Phasen-Commit-Protokoll Wartezeit (Abstimmung) Wartezeit (Ergebnis) Wartezeit (MissingResultAnswer-Nachricht) Rücksetzen einer TA (Verklemmung) 2 (s) 10 (s) 2 (s) 25 (s) F.2 Lanes-Protokoll Lane-Größe Ping-Intervall ServiceRefresh-Intervall Wartezeit (Dienstsuche) Wartezeit (LoginAngebote) Wartezeit (Login-Conf.) Wartezeit (LoginInform.-Conf.) Wartezeit (LaneBrokenConf.) Max. Login-Anzahl (Merging) Min. Intervall zw. 2 Loginversuchen eines Knotens (Merging) Min. Intervall zw. Login 2er Knoten (Merging) Wartezeit (LaneMissingResult) 3 - 10 15 (s) 150 (s) 10 (s) 1,5 (s) 3 (s) 1 (s) 3 (s) 5 1 (s) 2 (s) 1,5 (s) 104 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Anhang 105 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Literatur Literatur [1] J. Eberspächer, et al.; GSM Global System for Mobile Communication; 3. Auflage; Teubner Verlag; 2001 [2] J. Schiller; Mobilkommunikation; Addison-Wesley; 2000 [3] H. Höpfner, C. Türker, B. König-Ries; Mobile Datenbanken und Informationssysteme; dpunkt.verlag; ISBN 3-89864-264-X; 2005 [4] A. S. Tanenbaum; Computernetzwerke; Pearson Studium; München; 2003 [5] A. S. Tanenbaum; Distributed Systems; Prentice Hall; 2002 [6] E. Fromentin, F. Tronel; A Probabilistic Analysis of the Consensus Problem; Centre National de la Recherche Scientifique, Institut de recherche en informatique et systèmes aléatoires; Universität Rennes, Frankreich; Technical Report 1226; 1999 [7] H.Kudlich; Verteilte Datenbanken; Siemens Nixdorf Informationssysteme AG; Berlin, München; 1992; ISBN 3-8009-1589-8 [8] G. Weikum, G. Vossen; Transactional Information Systems; Morgan Kaufmann Publishers; 2002 [9] JAMES (Java-based Agent Modeling Environment for Simulation); www.informatik.uni-rostock.de/FB/Praktik/Mosi/de/forschung/projekte /james.html [10] DIANE (Dienste in Ad-Hoc-Netzen); http://hnsp.inf-bb.uni-jena.de/DIANE [11] M. Klein; DIANEmu A Java Based Generic Simulation Enviroment for Distributed Protocols; 2003; Technical Report 2003/7; Universität Karlsruhe (TH), Fakultät für Informatik [12] M. Klein, B. König-Ries, P. Obreiter; Lanes A Lightweight Overlay for Service Discovery in Mobile Ad Hoc Networks; Mai 2003; In Proc. 3. Workshop on Applications and Services in Wireless Networks (ASWN2003), Bern [13] G. Papadopoulos; S-Lanes - Ein schlankes Overlay zur motivierten Dienstvermittlung in mobilen Ad-hoc-Netzen; Diplomarbeit; Institut für Programmstrukturen und Datenorganisation, Fakultät für Informatik, Universität Karlsruhe (TH); Dez. 2003 106 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Literatur 107 [14] M. Klein, B. König-Ries, P. Obreiter; Service Rings - A Semantic Overlay for Service Discovery in Ad hoc Networks; Network for Business, Innovation and Sustainability Conference (NBIS), Prag, Tschechische Republik; September 2003 [15] M. Klein, M. Hoffman, D. Matheis, M. Müssig; Comparison of Overlay Mechanims for Service Trading in Ad hoc Networks; Oktober 2004; Technical Report 2004/2; Universität Karlsruhe (TH), Fakultät für Informatik [16] A.Rowstron, P. Druschel; Pastry: Scalable, distributed object location and routing for large-scale peer-to-peer systems; In Proc. IFIP/ACM International Conference on Distributed System Platforms, Heidelberg; Nov. 2001 [17] FreePastry, Rice University, Houston (USA), http://freepastry.rice.edu [18] The Bamboo Distributed Hash Table; http://bamboo-dht.org/index.html [19] S.Rhea, D. Geels, T.Roscoe, J. Kubiatowicz; Handling Churn in a DHT; In Proc. USENIX Annual Technical Conference, Boston, MA; Juni 2004 [20] R. Domagalski; Chord: A scalable Peer-to-Peer Lookup Service for Internet Applications; Seminar Internet Routing ; TU München; Juni 2003 [21] I. Stoica, R. Morris, D. Karger, M. F. Kaashoek, H. Balakrishnan; Chord: A scalable Peer-to-Peer Lookup Service for Internet Applications; Technical Report TR-819; MIT Laboratory for Computer Science; März 2001 [22] S. Ratnasamy, P. Francis, M. Handley, R. Karp, S. Shenker; A scalable content addressable network; In Proc. ACM SIGCOMM Conference (ACM Special Interest Group on Data Communications), San Diego, CA; Aug. 2001 [23] P. Baumung; Effiziente Endsystem-basierte Multicast-Dienste in Mobilen Adhoc-Netzwerken; E-Science und Grid, Ad-hoc-Netze, Medienintegration; 18. Arbeitstagung des Deutschen Forschungsnetzes (DFN); Düsseldorf; Juni 2004 [24] B. Zhao, A. Joseph, J. Kubiatowicz; Tapestry: A Infrastructure for Faulttolerant Wide-area Location and Routing; University of California, Berkeley; Technical Report CSD-01-1141; April 2001 [25] E. Buchmann, K. Böhm; Effizientes Routing in verteilten skalierbaren Datenstrukturen; Magdeburg; 10. GI-Fachtagung Datenbanksysteme für Business, Technologie und Web (BTW) 2003, Leibzig [26] B. Zhao, L. Huang, J. Stribling, S. Rhea, A. Joseph, J. Kubiatowicz; Tapestry: A Resilient Global-Scale Overlay for Service Deployment; IEEE Journal on selected areas in communications Vol. 22 No. 1; Januar 2004 [27] S. Rhea, C. Wells, P. Eaton, D. Geels, B. Zhao, H. Weatherspoon, J. Kubiatowicz; Maintenance-Free Global Data Storage; In Proc. IEEE Internet Computing; University of California, Berkeley; Oktober 2001 Transaktionaler Schutz für Wartungsoperationen in Overlaynetzen -- Literatur [28] R. Winter, T. Zahn, J. Schiller; DynaMO: A Topology-Aware P2P Overlay Network for Dynamic, Mobile Ad-Hoc Environments; Telecommunication Systems, Vol. 27, S. 321-345; 2004 [29] OMG; UML superstructure spezification version 2.0; Oktober 2004; www.omg.org/cgi-bin/doc?ptc/2004-10-02 108