Verteilte Systeme - PP-Computing... alois.schuette@h-da.de Alois Schütte. Oktober / 7
Inhaltsverzeichnis Die Kommunikation in verteilten Systemen, bei denen eine Menge von gleichberechtigten Partnern gemeinsam einen Dienst anbieten und nutzen, soll hier beleuchtet werden. Einleitung Fallbeispiel AChord.im / 7
Einleitung Einleitung Der Begriff Peer-to-Peer (PP) wurde u.a. populär im Zusammenhang mit der Musik Tauschbörse Napster. Mit dieser Anwendung traten erstmals im Internet Client-Rechner in einen großen Verbund ein. Der Regelfall im Intranet und Internet war es bis dahin, dass es sich um sternförmige Netzstrukturen handelt: mehrere Clients greifen auf Dienste eines Servers zu. Die Clients bieten dabei ihrerseits keine Dienste für andere Clients an. Bei PP bilden die Clients an den Extremitäten des Netzes untereinander eine Verknüpfung Gleichberechtigter (englisch: Peer). / 7
Einleitung Evolution der Verbindungsstruktur Die Architektur von verteilten Anwendungen wandelt sich, ausgehend von reinen Client-Server Strukturen, über Web- zu PP Strukturen. / 7
Einleitung Vorteile der PP Kommunikation Vorteile der PP Kommunikation Die am meisten verwendete Aktionen im Internet sind: Suchen, Berechnen, Sharing. Gerade dazu wird durch PP ein Modell zur Verfügung gestellt mit dem u.a. folgende Vorteile erzielt werden: Ressourcen können von Peers bereitgestellt werden, für diejenigen, die sie gerade brauchen (Filesspace, CPU-Power,...). Die Suche kann verteilt und asynchron erfolgen, so dass Ergebnisse insgesamt schneller gefunden werden können. Instant Messaging Systeme auf PP Basis können Benutzer (Peers) unabhängig vom Service Provider ausfindig machen und die Kommunikation zwischen Peers ermöglichen. Käufer und Verkäufer können in PP Auktionen direkt Transaktionen ausführen. Was sind die Nachteile? Kennen Sie Beispiele für PP Anwendungen? / 7
Einleitung Architekturkonzepte Architekturkonzepte Grundsätzlich unterscheidet man PP Architekturen mit (Hybridarchitektur) und ohne (Pure PP Architektur) zentrale Kontrolle. / 7
Einleitung Architekturkonzepte Hybridarchitektur Das Hybrid PP-Modell bedient sich auf der einen Seite der Client-Server-, auf der anderen der PP-Beziehung. Es ist semi-zentral und beinhaltet mindestens einen zentralen Kontrollpunkt. Der Zweck reicht von der Kontrolle des gesamten Netzwerks bis zu einem einfachen Bezugspunkt für die verbundenen Peers. Oft existiert ein alleinstehender Peer, der für alle anderen Peers einen Index bzw. Katalog für die verfügbaren Daten darstellt. 7 / 7
Einleitung Architekturkonzepte Hybridarchitektur Vorteil Der Indexserver bringt den Vorteil mit sich, dass kein spezieller Suchdienst erforderlich ist. Nachteil Ausfall des Kontrollpunktes legt das gesamte PP Netz lahm. Beispiel: Napster 8 / 7
Einleitung Architekturkonzepte Super PP Das Super PP-Modell ist eine Weiterentwicklung des Hybrid PP, wobei die zentrale Verwaltungsinstanz keine einzelner Server ist, sondern selbst ein (teil-) PP Netz. Gut angebundene Knotenpunkte im Netzwerk werden als Super-Nodes eingesetzt, die als Übergangs-Indexserver dienen. Hierbei erfolgt eine Peer-to-Peer-Interaktion zwischen ausgezeichneten Teilnehmern (Super-Peers) sowie zwischen normalen Peers. Super-Nodes und normale Peers interagieren in einen Client-Server-Beziehung. Beispiel: KaZaa 9 / 7
Einleitung Architekturkonzepte Super PP Das Pure PP-Modell ist völlig dezentral ausgelegt. Es beinhaltet keinen zentralen Kontrollpunkt. Die Peers werden als völlig gleichwertig und autonom betrachtet. Daten oder Rechenleistung sollen sich über alle Peers verteilen, die direkt oder indirekt über andere Peers miteinander kommunizieren können. Die Organisation der Peers kann entweder eine feste Struktur aufweisen oder gänzlich unstrukturiert sein. Beispiel: Gnutella, Achord.im / 7
(distributed hash tables, DHT) bilden die Basis vieler PP-Netze. Wir werden hier das Chord-Verfahren diskutieren. / 7
Idee Idee Eine Hastabelle auf einem Server könnte verwendet werden, um einen Lookup-Service für -Werte Paare zu realisieren. Vorteil Client einfach zu implementieren Nachteil key = value = 9 H = key% Server : (, 7) (9, ) (, ) : (, ) : (8, ) (, 9) Single point of attacks Der zentrale Server bildet den Flaschenhals, wenn eine große Anzahl von -Werte Paare zu speichern sind. Eine verteilte Hash-Tabelle weist diese Nachteile nicht auf. / 7
Idee Chord: Verteilete Hash-Tabellen (DHT) DHT bilden eine Klasse von verteilten Systemen zur Realisierung von Lookup Diensten. -Werte Paare werden auf Knoten eines PP Netzes gespeichert. Jeder Knoten kann einen zu einem Schalüssel gehörenden Wert effizient finden. Die Verwaltung des Mapping von n zu verantwortlichem Konten kann mit minimalem Umfang von Unterbrechungen durchgeführt werden. Dies erlaubt eine sehr hohe Skalierung des PP Netzes mit kontinuierlichem Hinzufügen und Entfernen von Knoten. Client key = value = 9 (8, ) (9, ) (, 7) (, 9) (, ) (, ) / 7
Chord Chord Ein grundlegendes Problem der Peer-to-Peer Technik ist es, den richtigen Knoten zu finden, der die gesuchte Information enthält. Hierzu sind Verteilte Hash-Tabellen eine Lösung. Wir betrachten den Chord-Ansatz (vgl. [chord]). Chord liefert dazu eine Operation lookup(key): Finde zu einem den Knoten (IP-Adresse), der die Informationen zum enthält Server Server Server Server / 7
Chord System-Modell Ein Chord-Netz hat folgende Eigenschaften: balanciert: Chord agiert als verteilte Hash-Funktion und verteilt gleichmäßig über alle Knoten. dezentral: Chord ist verteilt, es gibt keine zentrale Kontrolle und keine ausgezeichneten Knoten mit Sonderrechten. skalierbar: Die Kosten für lookup wächst logarithmisch mit der Knotenanzahl. Daher ist es auch für große Netze geeignet. verfügbar: Chord adjustiert die interne Verwaltungs-Tabellen automatisch, wenn Knoten entfernt werden oder neue hinzukommen. flexibles Namensschema: Der Namensraum für ist flach, d.h. die Anwendungen sind flexible in der Zuordnung ihrer Namen für Objekte zu Chord-n. / 7
Chord Chord-Protokoll - Konsistentes Hashing Die konsistente Hash-Funktion ordnet jedem Knoten und jedem einen m-bit Bezeichner unter Verwendung von SHA- zu Knoten n: sha(ip von n) k: sha(k) Die werden den Knoten wie folgt zugewiesen: Die Bezeichner werden sortiert in einem Kreis modulo m angeordnet. k wird dem Knoten n = successor(k) zugewiesen mit n = k oder n ist erster Knoten im Kreis ausgehend von k im Uhrzeigersinn Bezeichner-Kreis mit - drei Knoten,, - drei,, 7 suc() = suc() = suc() = Knoten / 7
Chord Chord-Protokoll - Konsistentes Hashing Konsistentes Hashing ist so designed, dass es ohne große Verwaltung möglich ist, dass Knoten beitreten bzw. das Netz verlassen können. Verfahren Knoten n: beitreten n übernimmt die seines Nachfolgers Bezeichner-Kreis mit - drei Knoten,, - drei,, 7 suc() = Knoten 7 tritt bei 7 suc() = suc() = suc() = suc() = suc() = Knoten 7 / 7
Chord Chord-Protokoll - Konsistentes Hashing Verfahren Knoten n: verlassen der Nachfolger von n übernimmt die von n Bezeichner-Kreis mit - drei Knoten,, - drei,, 7 suc() = Knoten 7 tritt bei 7 suc() = suc() = suc() = suc() = suc() = Knoten Dieses Verfahren sollen Sie im letzten Praktikum implementieren. PP Echo Server Rechner: $ VerteilteSystem/bin/PP/run.sh tcp 8 / 7
Chord Implementierung konsistentes Hashing Zum Implementieren von konsistentem Hashing braucht jeder Knoten als Verwaltungsinformation nur seinen Nachfolger zu kennen: Eine Querry nach einem Bezeichner folgt den succ-pointern der Knoten bis der erste Knoten gefunden ist, der zum Bezeichner passt. Problem: Dieses Verfahren ist aber ineffizient: man muss u.u. alle N Knoten besuchen! Lösung: Jeder Knoten wird mit zusätzlicher Routing-Information ausgestattet. 9 / 7
Chord Implementierung konsistentes Hashing - finger table Jeder Knoten n erhält eine Routingtabelle (finger table): der i-te Eintrag von n enthält den ersten Knoten s, der i Schritte von n entfernt ist d.h. s = successor(n + i ) mit i m. (Notation: n.finger[i].node) Gespeichert werden nun folgende Informationen an jedem Knoten n: Notation finger[k].start.interval.node successor predecessor Definition (n + k )% m, k m [finger[k].start, finger[k + ].start] first node n.finger[k].start next node on the circle; previous node on the circle.finger[].intervall = [ finger[].start, ] finger Intervalle des Knoten 7.finger[].start =.finger[].intervall = [.finger[].start,.finger[].start ].finger[].start =.finger[].start =.finger[].intervall = [.finger[].start,.finger[].start ] / 7
Chord Implementierung konsistentes Hashing - finger table Dieses Schema hat folgende grundlegende Charakteristiken: Jeder Knoten speichert nur wenig Informationen über andere Knoten. Jeder Knoten weiß mehr über seine nahen Nachfolger als von den entfernten Nachfolgern. Die finger-tabelle eines Knotens kann nicht für jeden den Nachfolger bestimmen, z.b. Knoten kennt nicht den Nachfolger von. finger Tabellen und Lokation im Netz mit Knoten,, und,, 7 start Interv. succ finger Tabelle [,] [,] [,] start Interv. succ finger Tabelle [,] [,] [,] start Interv. succ 7 finger Tabelle [,] [,7] [7,] / 7
Chord Implementierung konsistentes Hashing - Nachfolger finden Wegen Punkt verwendet man folgenden Algorithmus, um den Nachfolger eines beliebigen Bezeichners zu finden, man verwendet RPC: // ask node n to find id 's successor n. find_successor ( id) { n' = find_predecessor ( id ); return n '. successor ; } 7 // ask node n to find id 's predecessor 8 n. find_predecessor ( id ){ 9 n' = n; while ( id not in (n ', n'. successor )) n'=n'. closest_preciding_finger ( id ); return n ' } finger Tabellen und Lokation im Netz mit Knoten,, und,, 7 start Interv. succ finger Tabelle [,] [,] [,] start Interv. succ finger Tabelle [,] [,] [,] // return closest finger preceding id n. closest_preceding_finger ( id) { 7 for ( i = m downto ) 8 if ( finger [i]. node is in (n, id) 9 return finger [i]. node ; return n; } start Interv. succ 7 finger Tabelle [,] [,7] [7,] / 7
Chord Implementierung konsistentes Hashing - Nachfolger finden Beispiel: Knoten will successor von Bezeichner wissen Knoten : gehört zu Intervall [7,], also.finger[].succ =. Konten : Da O Vorgänger von ist, fragt Knoten Knoten, den Nachfolger von zu bestimmen. Knoten : Knoten sieht in seiner finger-tabelle,.finger[].succ =. Knoten ; Also gibt Knoten die als Ergebnis an Knoten zurück. finger Tabellen und Lokation im Netz mit Knoten,, und,, 7 start Interv. succ finger Tabelle [,] [,] [,] start Interv. succ finger Tabelle [,] [,] [,] start Interv. succ 7 finger Tabelle [,] [,7] [7,] / 7
Chord Implementierung konsistentes Hashing - Aufwand Satz: Die Anzahl von Knoten, die in einem N-Knoten Netzwerk kontaktiert werden müssen, um den Successor eines Knoten zu bestimmen ist O(log N). Beweis: vgl. [chord]) oder experimentell im Praktikum mit OpenCourd (http: // open-chord. sourceforge. net ). finger Tabellen und Lokation im Netz mit Knoten,, und,, 7 start Interv. succ finger Tabelle [,] [,] [,] start Interv. succ finger Tabelle [,] [,] [,] start Interv. succ 7 finger Tabelle [,] [,7] [7,] / 7
Chord Dynamik des Netzes IN ARBEIT / 7
Fallbeispiel AChord.im Fallbeispiel AChord.im Hier wird als Beispiel auf ein PP System eingegangen, das im Rahmen vom Musterprojekten entstanden ist. Vortrag AChord / 7
Fallbeispiel AChord.im Literatur- & Quellenverzeichnis [chord] Ion Stoica, Robert Morris, David Karger, M. Frans Kaashoek, Hari Balakrishnan: Chord: A Scalable Peer-to-peer Lookup Service for Internet Applications http://pdos.csail.mit.edu/papers/chord:sigcomm/chord_sigcomm.pdf 7 / 7