Daedalus – Ein P2P-Shared-Memory- System für
Transcription
Daedalus – Ein P2P-Shared-Memory- System für
Diplomarbeit Daedalus – Ein P2P-Shared-MemorySystem für Ubiquitous-Computing Christian Keller [email protected] Februar 2006 Humboldt-Universität zu Berlin Mathematisch-Naturwissenscha�liche Fakultät II Institut für Informatik Lehrstuhl für Rechnerorganisation und Kommunikation Gutachter: Prof. Dr. Miroslaw Malek n.a. Betreuer: Dipl.-Inf. Peter Ibach ([email protected]) Abstract Das in dieser Arbeit vorgestellte verteilte Peer-to-Peer-Speichersystem für Ubiquitous-Computing – Daedalus – ermöglicht das Verändern von gespeicherten Datenobjekten. Dabei wird die Konsistenz der Daten gesichert, in dem ein stochastisches Locking-Verfahren verwendet wird, welches den speziellen Bedingungen von Peer-to-Peer-Netzen und Ubiquitous-Computing Rechnung trägt. Daedalus verteilt die Last auf die teilnehmenden Knoten nicht gleichmäßig sondern sozial. Das heißt, je leistungsfähiger ein Knoten ist, desto mehr Aufgaben übernimmt er. Besonders leistungsschwache Knoten können so vollkommen passiv von Daedalus profitieren. Trotz stochastischem Locking nimmt die Last eines leistungsstarken Knotens nur linear zu. Anders als in vielen vergleichbaren Systemen, jedoch nicht mit der Gesamtzahl aller partizipierenden Knoten sondern nur mit der Zahl der Knoten, die sich für ein bestimmtes Datenobjekt interessieren. Dadurch wird die Last eines Knotens nur in seltenen Fällen sehr groß werden. Der Daten- und Zeitoverhead der für die Verwaltung nötig ist, macht ein Dataclustering für die Proof-of-Concept-Implementation in MagicMap sinnvoll. Sta� jede Information als eigenständigen Wert in Daedalus zu speichern, bietet es sich an ähnliche Informationen zu einem Datenobjekt zusammenzufassen wobei die Schreibzugriffe auf ein Datenobjekt minimiert werden. Inhaltsverzeichnis 1 Einführung .....................................................................................................................1 2 Distributed-Shared-Memory-Systeme .......................................................................3 2.1 Freenet ...............................................................................................................5 2.2 OceanStore ........................................................................................................6 2.3 Ivy ......................................................................................................................9 2.4 JuxMem ...........................................................................................................12 2.5 Zusammenfassung ........................................................................................14 3 Peer-to-Peer-Frameworks...........................................................................................15 3.1 Chord...............................................................................................................16 3.2 JXTA.................................................................................................................18 3.3 Tapestry ...........................................................................................................22 3.4 Zusammenfassung ........................................................................................24 4 Daedalus.......................................................................................................................24 4.1 Anforderungen...............................................................................................24 4.2 Konzeption von Daedalus ............................................................................27 4.3 Gruppeneintri� ..............................................................................................29 4.4 Lesen der Ressource ......................................................................................30 4.5 Stochastisches Locking..................................................................................30 4.6 Schreiben der Ressource ...............................................................................32 4.7 Verlassen der Gruppe....................................................................................33 5 Evaluierung..................................................................................................................34 5.1 Skalierbarkeit..................................................................................................34 5.2 Performanz .....................................................................................................35 5.3 Fehlermodell...................................................................................................41 5.4 Verfügbarkeit..................................................................................................43 5.5 Responsivität ..................................................................................................44 5.6 Datenoverhead ...............................................................................................45 I 5.7 Zusammenfassung ........................................................................................46 6 Die Implementation ....................................................................................................47 6.1 MagicMap als Umgebung ............................................................................47 6.2 Schni�stelle zu MagicMap ...........................................................................49 6.3 Clustering der Daten .....................................................................................51 6.4 Daedalus als MagicMap-Modul ..................................................................52 6.5 Alternative Lösungen....................................................................................61 7 Zusammenfassung und Ausblick ............................................................................63 8. Literaturverzeichnis...................................................................................................66 II Abbildungsverzeichnis Abbildung 2.1: Die Verteilung der Daten in OceanStore .........................................9 Abbildung 2.2: Das JuxMem-Netzwerk....................................................................12 Abbildung 2.3: Einordnung von Peer-to-Peer-Shared-Memory-Systemen .........14 Abbildung 3.1: Chord-Netzwerk ...............................................................................18 Abbildung 3.2: JXTA-Kommunikation .....................................................................21 Abbildung 3.3: Anfragen in Tapestry........................................................................23 Abbildung 4.1: Der Lockingmechanismus ...............................................................31 Abbildung 5.1: Zeiten bis der Knoten mit dem JXTA-Netzwerk verbunden ist 37 Abbildung 5.2: Zeit vom Gruppeneintri� bis zur Erlangung der Ressource......38 Abbildung 5.3: Zeiten zum Ermi�eln von ungecachten Ressourcen ...................40 Abbildung 5.4: Zeiten beim Verändern der Ressource...........................................40 Abbildung 5.5: Median und Durchschnitswert der ermi�elten Zeiten ...............41 Abbildung 6.1: Die MagicMap-Architektur.............................................................48 Abbildung 6.2: Verteiltes Messen und Berechnen in MagicMap ..........................49 Abbildung 6.3: Die Interaktion in MagicMap..........................................................51 Abbildung 6.4: Datenobjekte für MagicMap ...........................................................52 Abbildung 6.5: Beispielha�e Gruppenhierarchie....................................................53 Abbildung 6.6: Das Hello-Paket.................................................................................54 Abbildung 6.7: Das Welcome-Paket ..........................................................................55 Abbildung 6.8: Das Request-Paket ............................................................................56 Abbildung 6.9: Das Resource-Paket ..........................................................................57 Abbildung 6.10: Das Bye-Paket..................................................................................57 III Abbildung 6.11: Das Mutex-Request-Paket .............................................................58 Abbildung 6.12: Das Mutex-Response-Paket...........................................................59 Abbildung: 6.13: Das Validation-Request-Paket......................................................59 Abbildung 6.14: Das Validation-Paket ......................................................................60 Abbildung 6.15: Das Error-Paket ...............................................................................60 Abbildung 6.16: Das Manager-Request-Paket .........................................................61 IV Tabellenverzeichnis Tabelle 1.1: Eigenscha�en der Peer-to-Peer-Shared-Memory-Systeme..................... 3 Tabelle 2.1: Mögliche Ivy Logeinträge ......................................................................... 11 Tabelle 4.1: Parameter von Daedalus ........................................................................... 28 Tabelle 5.1: Lasten für Manager durch Nachrichten.................................................. 34 Tabelle 5.2: Daedalus-Performanz ................................................................................ 39 Tabelle 5.3: Folgen von Fehlern..................................................................................... 42 Tabelle 5.4: Responsivität einer Gruppe ...................................................................... 45 Tabelle 5.5: Paketgrößen von Daedalusnachrichten................................................... 46 V 1 Einführung Mobile Nutzer können gegenwärtig nur eingeschränkt auf Netzdienste zugreifen. So ist zwar das Lesen von Nachrichten mit heutigen Geräten unproblematisch, das aktive Partizipieren an Systemen wie Wikis, Foren oder öffentlichen Kalendern einer Arbeitsgruppe erfordert jedoch meist mehr Ressourcen und kann sehr hohe Kosten verursachen. Zudem sind sie auf die Unterstützung stationärer Geräte angewiesen, etwa Servern, die die Kalenderdaten speichern und ausliefern. Es ist nicht möglich, dass ein Nutzer unterwegs einen Kalender anlegt, auf den andere mobile Nutzer zugreifen können, wenn er nicht zuvor einen Server installiert hat. Dies hat zur Folge, dass mobile Szenarien die Flexibilität einschränken. Ein weiteres Beispiel für mobile Geräte, die auf Daten möglichst flexibel zugreifen wollen, ist MagicMap [34], ein Positionierungsdienst, der mi�els Triangulation und Trilateration zu Sendern die Entfernung und den Winkel und somit die Position zu ihnen berechnen kann [18]. MagicMap speichert diese Messwerte auf einem Server. Ist dieser Server nicht erreichbar, so kann das gesamte System nicht funktionieren. Eine Abhilfe verspricht die Peer-to-Peer-Technik, die es Geräten erlaubt, ohne Server Dienste zu nutzen und anzubieten. Gelingt es auf dieser Basis, ein verteiltes Speichersystem zu etablieren, das den Gegebenheiten mobiler Geräte entspricht, ermöglicht dies mobilen Nutzern eine Ad-hoc-Zusammenarbeit. So ist es denkbar, dass Kalenderapplikationen ihre Daten in diesem Speichersystem ablegen und so für andere Nutzer sichtbar machen. Darüber hinaus sind Wikis oder Foren denkbar, in denen die Beiträge verteilt gespeichert werden. Verteilte Speichersysteme sind bereits seit etlichen Jahrzehnten Gegenstand der Forschung. Bisher lag dabei jedoch das Augenmerk auf Klient-Server-Anwendungen, bei denen die Zahl der Server gering war, die Server zuverlässig und nahezu immer erreichbar waren. Solche Gegebenheiten sind jedoch nicht immer verfügbar, zum einen weil sie hohe Kosten verursachen und zum anderen einen hohen Administrationsaufwand bedeuten. In den letzten zehn Jahren gewannen Peer-to-Peer-Netze an Beliebtheit und gerieten zunehmend in den Fokus der Forschung. Peer-to-Peer-Netze unterscheiden sich von herkömmlichen Netzen, in dem jeder Netzwerkknoten prinzipiell jede Rolle einnehmen kann. Dies hat zur Folge, dass auch wenig zuverlässige Knoten als Server für andere Knoten agieren. Diese geringe Zuverlässigkeit entsteht durch die kurzfristige Teilnahme am Netz, schlechte Verbindungen innerhalb des Netzes und durch eine o�mals mangelhafte Administration der Knoten. Durch das hohe Maß an Redundanz, die durch eine Vielzahl von Knoten möglich ist, kann ein Mangel an Zuverlässigkeit der Einzelkomponenten jedoch aufgehoben werden. Peer-to-Peer-Netze bieten gegenüber klassischen Klient-Server-Netzen eine 1 Vielzahl von Vorteilen. Sie erlauben es, Ad-hoc-Netzwerke zu erzeugen, ohne dass hohe Kosten für die Infrastruktur entstehen. Dadurch können sie auch in Szenarien eingesetzt werden, in denen aus anderen Gründen keine Infrastruktur vorhanden ist, etwa in Krisen- oder Katastrophengebieten. Dadurch, dass sie auch dann zuverlässig sein können, wenn die Knoten schlecht administriert werden, können diese Netze auch von Menschen genutzt werden, die nicht über das nötige Know-How verfügen. Zudem ermöglicht ein weitgehend wartungsfreies System den Au�au von autonom agierenden Netzwerken, die ohne weiteren Einfluss von außen eine bestimmte Aufgabe lösen. Gegenwärtig werden Peer-to-Peer-Netze größtenteils zum Austausch von unveränderlichen Daten genutzt. Dabei wird eine Datei einmal veröffentlicht und vielfach gelesen. Derzeit existieren einige Systeme, die auch das Verändern von Daten ermöglichen und somit ein viel größeres Maß an Anwendungen ermöglichen. Jedoch hat keins der in Kapitel 2 vorgestellten Verfahren größere Resonanz außerhalb der Forschung gefunden. Dies liegt nicht zuletzt an den Einschränkungen, die diese Systeme treffen müssen, um effizient arbeiten zu können. So sind diese Systeme für Ubiquitous-Computing-Szenarien kaum geeignet, da sie von relativ leistungsstarken Knoten und vergleichsweise langandauernden Verbindungen ausgehen. In Ubiquitous-Computing-Szenarien wie etwa NOMADS [36] stellen mobile und eingebe�ete Systeme eine große Herausforderung dar. NOMADS stelt ein Netzwerk von mobilen Knoten dar, die sich selbstständig an ihre Gegend anpassen. Sie verfügen nur über wenige Ressourcen, wie Speicher, Rechenleistung, Netzanbindung und Akkuleistung, sodass viele aufwendige Verfahren nicht performant angewendet werden können. Darüber hinaus sind diese Knoten nur für kurze Zeit aktiv am Netz beteiligt, um ihre Lebensdauer zu erhöhen. Ein Peer-to-Peer-Shared-Memory-System für Ubiquitous-Computing muss daher ein Kompromiss sein. Anforderungen, wie Zuverlässigkeit, Ressourcen sparen und Performanz schließen sich in weiten Teilen aus. Um ein hohes Maß an Zuverlässigkeit zu erreichen, ist viel Redundanz nötig, was nur auf Kosten der Ressourcen und der Performanz möglich ist. Dementsprechend bedeutet Ressourcen sparen ein Verzicht auf Redundanz und damit Zuverlässigkeit. Performanz schließlich benötigt viele Ressourcen, wie CPU-Leistung oder Bandbreite, die in mobilen Systemen nur begrenzt vorhanden ist. In dieser Arbeit wird Daedalus vorgestellt, ein Peer-to-Peer-Shared-MemorySystem, welches speziell den Anforderungen des Ubiquitous-Computings Rechnung trägt. Der dazu notwendige Kompromiss besteht darin, dass Geräte mit vielen Ressourcen die Verwaltungsaufgaben übernehmen, während ressourcenarme Geräte On-Demand agieren können. Während die Knoten entlastet werden, steigt die Last des Netzwerks, jedoch ist dieses in den meisten Szenarien erheblich besser ausgesta�et, da auf die bestehende stationäre Infrastruktur zurückgegriffen wer- 2 den kann. Tabelle 1.1 verdeutlicht die Unterschiede zu den bereits bestehenden Peer-to-Peer-Shared-Memory-Systemen. Freenet Ivy OceanStore JuxMem Daedalus x x x x x x x x x x x x x x Kein externes Wissen nötig Hohe Dynamik mobiler Geräte Übliche Peerto-Peer Netzgrößen Leistungsklassen Locking Schreibzugriffe In den folgenden beiden Kapitel wird zunächst einen Einblick in bereits bestehende Verfahren für Peer-to-Peer-Shared-Memory-Systeme und Peer-to-Peer-Frameworks gegeben. In den Kapiteln 4 und 5 wird die Funktionsweise von Daedalus erläutert und bewertet. Anschließend wird im Kapitel 6 als Proof-of-Concept gezeigt, wie sich Daedalus in MagicMap integrieren kann. x x x Tabelle 1.1: Eigenscha�en der Peer-to-Peer-Shared-Memory-Systeme. Nur wenige Systeme bieten ein Locking zum Schutz vor Inkonsistenzen oder kommen ohne globales Wissen aus. Für sehr dynamische Netze wurde keines der bisherigen Systeme konzeptioniert. 2 Distributed-Shared-Memory-Systeme Während Distributed-Shared-Memory-Architekturen schon seit einigen Jahrzehnten Gegenstand der Forschung sind, sind Systeme, die auf Peer-to-Peer-Techniken au�auen, erst in den letzten Jahren in den Fokus der Wissenscha� gerückt. Obwohl die grundlegenden Prinzipien von Peer-to-Peer bereits vor 20 Jahren in Systemen wie DNS oder UseNet zum Tragen kamen, wurden sie erst mit Napster [40] Ende der 90er Jahre des letzen Jahrhunderts allgemein bekannt. Peer-to-Peer-Systeme [37] zeichnen sich dadurch aus, dass jeder Teilnehmer in einem solchen Netz gleichberechtigt ist. Jeder Knoten ist gleichzeitig sowohl Klient als auch Server. Dieser Umstand bringt eine Reihe von Vor- und Nachteilen mit sich. Vorteile sind eine bessere Verteilung der Last, eine bessere Zuverlässigkeit 3 für das Gesamtsystem durch den Wegfall von Single-Point-of-Failures und möglicherweise eine Kostensenkung, da keine dezidierten Server mehr nötig sind und somit auch Administrationsaufgaben entfallen. Jedoch sind die einzelnen Knoten sehr unzuverlässig, sie können jederzeit das Netzwerk verlassen oder durch Fehler Daten verändern. Die besonderen Eigenscha�en von Peer-to-Peer-Shared-Memory sind also die große Zahl von Replikanten sowie die geringe Zuverlässigkeit und hohe Dynamik der einzelnen Replikanten. Dies steht im Widerspruch zu den Annahmen, die konventionelle Distributed-Shared-Memory-Systeme über ihre Umgebung treffen. Deswegen ist es nötig, für Peer-to-Peer-Shared-Memory-Systeme neue Verfahren zu entwickeln, die mit dieser Umgebung besser umgehen können. Der Großteil der Peer-to-Peer-Systeme, die zum Austausch von Daten entwickelt wurden, geht dabei davon aus, dass ein Datenobjekt einmal geschrieben aber vielfach gelesen wird. Es ist in diesen Systemen nicht vorgesehen, dass die Daten verändert werden können. Eine Änderung würde ein neues Datenobjekt erzeugen, das keinen Bezug zu der vorhergehenden Version hä�e. Dies erklärt sich anhand des Szenarios, für das viele dieser Systeme geschaffen wurden: es besteht keine Notwendigkeit für die Nutzer einer Peer-to-Peer-Tauschbörse wie Kazaa, die einmal vorhandenen Daten zu verändern, da diese weder die Musik noch die Filme geschaffen haben. Für die Systeme, die eine Veränderung der Daten zulassen, gibt es im Wesentlichen drei Ansätze. Bei Freenet [15] kann nur der ursprüngliche Autor einer Ressource diese verändern. Dies wird durch die Verwendung von asynchroner Verschlüsselung erreicht. Systeme wie OceanStore [41], Ivy [21] und P-Grid [42] vertrauen darauf, dass nur eine verhältnismäßig geringe Zahl von Veränderungen vorgenommen wird, so dass es nicht zu Konflikten kommt. Schließlich verwenden einige Systeme wie JuxMem [23] Mutual-Exclusion-Verfahren, um diese Konflikte zu vermeiden. Die Mechanismen, die Schreibkonflikte verhindern sollen, stellen ein großes Problem für die Skalierbarkeit eines Algorithmus dar. Sollen Konflikte „byzantinisch" gelöst werden, indem durch ein hohes Maß an Redundanz bis zu einem Dri�el fehlerha�e Knoten toleriert werden können, so sind N2 Nachrichten nötig [10], wobei N die Zahl der Knoten in dem Peer-to-Peer-Netz ist. Da in gegenwärtigen Peer-to-Peer-Netzen Millionen Teilnehmer gleichzeitig agieren, ist ein quadratischer Ansatz hier nicht vertretbar. Aber auch Ansätze mit einem linearen Bedarf an Nachrichten stoßen in der Praxis leicht an ihre Grenzen, da die Bandbreite in üblichen Peer-to-Peer-Netzen beschränkt ist. Es haben sich zwei verschiedene Ansätze etabliert, mit diesem Problem umzugehen. Die einfachste, zum Beispiel von JuxMem verwendete, Lösung ist es, sich auf entsprechend kleine Peer-to-PeerNetze zu beschränken. Der andere Ansatz schränkt die Menge der Knoten ein, die sich über die Verhinderung von Schreibkonflikten abstimmen. Letzteres wird beispielsweise bei OceanStore praktiziert, wo ein Inner-Ring, also eine kleine Gruppe der Knoten, für die Annahme von neuen Versionen zuständig ist. 4 2.1 Freenet Freenet [13][15] ist ein Peer-to-Peer-System, das von dem Iren Ian Clarke im Jahre 1999 entwickelt wurde. Ihm ging es dabei besonders um die Verhinderung von Zensur und den Schutz der Anonymität der Nutzer. Um diese Ziele zu erreichen, muss sichergestellt werden, dass Informationen so lange wie möglich im Netz bestehen bleiben, damit Minderheiten nicht benachteiligt werden. Weiterhin muss es unmöglich sein, ein bestehendes Datenobjekt zu verändern, um Daten zu überschreiben, und es muss unmöglich sein, Informationen über die Teilnehmer im Netz zu sammeln. Um diese Ziele zu erreichen, wurde ein besonderer Suchalgorithmus entwickelt. Ein zentraler Server, der wie bei Napster sämtliche Dateien verwaltet, kam wegen einer möglichen Anfälligkeit für Zensurmaßnahmen nicht in Frage. Die Dateien werden in der Nähe von Anfragern gespeichert und von Knoten, die weit von ihnen entfernt sind, gelöscht. Dadurch wird es unmöglich, die Herkun� einer Datei festzustellen. In Freenet werden Dateien anhand von Schlüsseln identifiziert, die durch HashFunktionen erstellt werden. So gibt es zum einen den Keyword-Signed-Key (KSK), der von einem kurzen, die Datei beschreibenden Text abgeleitet wird. Wie bei allen anderen Schlüsseln auch, die von Freenet verwendet werden, handelt es sich hierbei um einen asynchronen Schlüssel. Der öffentliche Schlüssel wird zur Identifizierung der Datei genutzt, indem er gehasht wird, der private Schlüssel wird zur Signierung der Datei verwendet, sodass eine minimale Integritätsüberprüfung sta�finden kann. Minimal, weil jeder Knoten, der den beschreibenden Text kennt, auch den privaten Schlüssel rekonstruieren kann. Da sich alle Dateien einen globalen Namensraum teilen müssen und es so unweigerlich zu Konflikten kommen kann, wenn zwei Dateien die gleiche Beschreibung verwenden, gibt es einen zusätzlichen Signed-Subspace-Key (SSK). Dieser ermöglicht private Namensräume für die Dateien jedes einzelnen Knotens und wird zufällig generiert. Der öffentliche Schlüssel wird ebenso wie der KSK gehasht, danach mit dem KSK verknüp� und schließlich noch ein weiters Mal gehasht. Der private Schlüssel wird ebenso wie der des KSK dafür genutzt, um die Datei zu signieren. Dadurch, dass dieser Schlüssel zufällig generiert wurde, ist ein deutlich höheres Maß an Datensicherheit erreichbar. Da für das Erzeugen von Dateien die privaten Schlüssel benötigt werden, ist eine Veränderung nur durch den ursprünglichen Autor der Datei möglich, andere Knoten können nur lesend auf diese Datei zugreifen. Daraus ergibt es sich, dass sich das Problem der Konsistenz von Dateien in Freenet nicht stellt. Damit aber verschiedene Versionen einer Datei existieren und voneinander unterschieden werden können, existiert noch ein dri�er Schlüssel, der Content-Hash-Key (CHK). Dieser wird durch das Hashen des Dateiinhaltes erzeugt, und gibt jeder Datei 5 einen pseudo-eindeutigen Schlüssel. Zudem werden die Dateien noch mit einem zufällig generierten Schlüssel verschlüsselt. Damit nun andere Knoten die Datei anfordern können, veröffentlicht der Knoten den beschreibenden Text zusammen mit dem öffentlichen SSK. Zusätzlich wird noch der CHK und der Entschlüsselungsschlüssel veröffentlicht. Um eine veränderbare Datei zu speichern, wird diese mit ihrem CHK gespeichert und danach eine indirekte Datei, im Namensraum des Knotens, die nur den CHK der ursprünglichen Datei enthält. Andere Knoten können nun auf die Datei in zwei Schri�en zugreifen: zuerst werten sie die indirekte Datei aus, um an den CHK, der eigentlichen Datei, zu kommen, mithilfe dessen sie dann die gewünschte Datei anfordern können. Um nun diese Datei zu verändern, wird die neue Version zunächst unter ihrem CHK gespeichert. Danach wird eine neue indirekte Datei erstellt, die auf die neue Version verweist. Erhält ein Knoten diese neue Datei, so kann er anhand der Signatur feststellen, dass die Datei valide und neuer ist, und kann so die alte Version durch die neue ersetzen. Die Knoten, die den CHK der alten Version kennen, können auf diese aber weiterhin zugreifen. Wenn ein Benutzer eine Datei einsehen möchte, so stellt er eine Anfrage an seinen eigenen Knoten nach dem entsprechenden Schlüssel und einer Angabe zur Suchtiefe. Erhält ein Knoten eine Anfrage, so überprü� er zunächst, ob er diese Datei in seinem Speicher hat, und gibt diese, wenn das der Fall ist, zurück. Ist dies nicht der Fall, so sucht der Knoten einen anderen Knoten aus seiner Routingtabelle heraus, der über einen Schlüssel verfügt, der dem angeforderten am nächsten kommt. Wenn diese Anfrage irgendwann erfolgreich war, wird die entsprechende Datei an den anfragenden Knoten zurückgegeben. Dieser Knoten speichert die Datei dann in seinem Cache und fügt den Eintrag für diesen Dateischlüssel in seine Routingtabelle ein. Die Anzahl der Knoten, die eine Suchanfrage passieren muss, wächst ungefähr logarithmisch mit der Anzahl der Knoten im Netz. 2.2 OceanStore OceanStore [29][30][41] wurde an der Universität Berkeley als globaler Datenspeicher entwickelt, der mit Milliarden von Nutzern zurechtkommen soll. Dabei wurde ein besonderes Augenmerk auf die langfristige Archivierung von Daten gelegt. Bei den meisten anderen Systemen spielt dies nur eine untergeordnete Rolle, da dieses Ziel nur schwer erreichbar ist. Besonderes die hohe Dynamik von Peer-to-Peer-Netzen macht eine langfristige Speicherung von Daten schwer. OceanStore verwendet ein byzantinisches Fehlertoleranzprotokoll, um für die nötige Konsistenz zwischen den Replikanten von Daten zu sorgen. Allerdings bietet OceanStore den Applikationen Möglichkeiten, die Konsistenzmechanismen zugunsten der Performanz zu schwächen, wenn keine hohen Anforderungen an die Konsistenz gestellt werden. OceanStore bietet ein versionsbasiertes Archiv an, 6 das laut Eigenaussage die Haltbarkeit von heutigen Archivsystemen um mehrere Größenordnungen übertri�. Jedes Datenobjekt wird als Read-Only-Objekt mit einem Erasure-Code gespeichert und über hunderte Knoten verteilt. Durch den Erasure-Code ist schon ein Teil des eigentlichen Datenobjekts ausreichend, um das gesamte wieder herzustellen. Zusätzlich wird durch diesen Erasure-Code der nötige Speicherplatz, der für die Redundanz nötig ist, erheblich reduziert. Gegenwärtig existieren nur Teilsysteme, das Gesamtsystem befindet sich noch in der Entwicklung. OceanStore basiert auf dem Peer-to-Peer-System Tapestry [49], da dieses Netz beim Suchen und Speichern von Ressourcen topologische Strukturen des Netzwerkes berücksichtigen kann. So werden primär die Server befragt, die sich in der Nähe befinden, also beispielsweise im lokalen Netzwerk, was die Geschwindigkeit erheblich erhöhen kann. Prinzipiell werden Daten in OceanStore dauerha� gespeichert; da auch die älteren Versionen von Daten erhalten bleiben, ist es möglich, beliebig in der Zeit zurück zugehen. Dies ermöglicht einer Applikation zum Beispiel explizit nach der Version eines Datenobjektes fragen, die vier Stunden alt ist. Ein expliziter Lockingmechanismus, der ein Datenobjekt vor parallelen Schreibzugriffen schützen würde, wurde nicht entwickelt, allerdings kann durch die Atomität eines Updates ein solcher Mechanismus von der Applikation implementiert werden, indem ein Datenobjekt mit der Nummer des Knotens, der die Ressource verändern kann, erzeugt wird. Existiert kein solches Objekt, so erzeugt der Knoten eines, um die Ressource verändern zu können; existiert das Objekt jedoch bereits, so wartet der Knoten bis dieses gelöscht wird. Die Architektur OceanStore besteht aus zwei Schichten. Die obere beinhaltet leistungsfähige und gut angebundene Rechner, die Änderungen verbreiten und die Daten archivieren. Die untere Schicht enthält im Gegensatz dazu weniger leistungsfähige Rechner, die im Wesentlichen nur ihren Speicherplatz beitragen. Der Vorteil einer solchen Architektur besteht darin, dass auch von dem Speicher der Systeme profitiert werden kann, die den Anforderungen, die durch die Verwaltung der Ressourcen entstehen, nicht gewachsen sind. Jedes Datenobjekt ist einem primären Replika aus der oberen Schicht zugeordnet, der alle Veränderungen an dem Objekt vollzieht und entsprechende Identifikationsnummern für die Datei und die Version erzeugt. Diese primäre Replika besteht aus einer kleinen Anzahl von Servern, die ein byzantinisches Fehlertolleranzprotokoll verwenden, um sich abzustimmen. Dadurch wird gewährleistet, dass sich der primäre Replika als Ganzes auch dann korrekt verhält, wenn einige der Server ausfallen. Knoten, die als primärer Replika in Frage kommen, werden in Listen aufgeführt, die jedoch außerhalb des Systems vorliegen müssen. Dadurch, dass jedem Datenobjekt andere primäre Replikas zugeordnet werden können, wird ein hohes Maß an Skalierbarkeit erreicht. Zugriffe auf verschiedene Datenobjekte können so parallel ausgeführt werden und behindern sich nicht gegenseitig, wie es der Fall wäre, wenn ein Replika für alle Daten zuständig wäre. 7 Je größer das Netz folglich wird, desto mehr Datenobjekte können unabhängig voneinander verwaltet werden. Neben den primären Replikas existieren sekundäre Replikas und Archivierungsserver, die sowohl aus der oberen, als auch aus der unteren Schicht kommen können. Die Archivierungsserver speichern Fragmente von Datenobjekten. Diese Fragmente werden von den primären Replikas mi�els eines Erasure-Codes erzeugt und an die OceanStore-Server verteilt. Da es aber relativ viel Zeit in Anspruch nimmt, bis ein Knoten genügend Fragmente zusammen hat, um das Datenobjekt zu rekonstruieren, speichern die sekundären Replikas die aktuelle Version. Alle sekundären Replikas sind in einer Baumstruktur mit dem primären Replikas eines Datenobjektes verbunden. Abbildung 2.1 zeigt, wie die neuen Versionen entlang dieses Baumes, von den primären Replika aus, verteilt werden. Soll ein Datenobjekt verändert werden, so teilt der Klient, der die Änderung vornehmen möchte, dies der primären Replika mit. Die Server in dem primären Replika entscheiden nun, ob diese Änderung umgesetzt wird. Dazu überprüfen sie, ob der Klient über die nötigen Rechte verfügt und ob zuvor konkurrierende Änderungen umgesetzt werden müssen. Um Fehler bei diesen Servern weitgehend auszuschließen, stimmen sie sich über ein byzantinisches Protokoll ab. Zwar garantiert dieses Protokoll Sicherheit, wenn in einer Gruppe von Servern mit der Größe 3f+1 maximal f Server ausfallen oder fehlerha� arbeiten, jedoch ist dies nur mit einer quadratischen, von der Zahl der Server abhängigen, Zahl von Nachrichten möglich. Deswegen ist es nötig, die Zahl der Server in der primären Replika klein zu halten. Hat sich der primäre Replika auf die Änderung verständigt, so wird dieses an die sekundären Replikas und an die Archivierungsserver weitergeleitet. Damit sichergestellt werden kann, dass diese neue Version tatsächlich von dem primären Replika stammt, wird sie mit einer Signatur versehen. Darüber hinaus erstellt der primäre Replika einen „Heartbeat", der die neue Version als die aktuelle ausweist. Damit eine Applikation die neuste Version eines Datenobjektes auch anfordern kann, fordert sich diese von den primären Replikas ein Heartbeat-Objekt an, das die Identifikation der neusten Version enthält, mit der das Datenobjekt von den sekundären Replikas geladen werden kann. Anhand des öffentlichen Schlüssels, der primären Replika, kann die Applikation die Korrektheit des Datenobjektes überprüfen. Ein Prototyp von OceanStore mit dem Namen Pond [43], wurde im Jahr 2003 getestet und mit NFS verglichen. Dabei ergab sich, dass Pond in WANs etwa um den Faktor 4,6 schneller beim Lesen und um den Faktor 7,3 langsamer beim Schreiben war. Die Zeit zum Schreiben war jedoch nicht primär durch Netzwerkkommunikation beschränkt, sondern durch die Generierung von Erasure-Codes und die Signierung von Daten, die einen sehr großen Anteil an dieser Zeit ha�en. OceanStore arbeitet folglich bei größeren Datenobjekten effizienter als bei kleineren. 8 HotOS Attendee Primary Replicas Archival Servers (for durability) Other Researchers Secondary Replicas (soft state) Abbildung 2.1 (aus [29]): Die Verteilung der Daten in OceanStore. Neue Daten werden von „primären Replikas“ an sekundäre und Archivierungsserver verteilt, von denen Klienten die Daten erlangen können. 2.3 Ivy Das Ziel von Ivy [21][39] ist es, ein NFS-artiges Dateisystem auf Peer-to-Peer-Basis bereit zu stellen. Das Peer-to-Peer-Netz ersetzt dabei den zentralen Dateiserver, in dem sämtliche Daten und Metadaten in einem DHash-System gespeichert werden. Da DHash die Daten verteilen und vervielfältigen kann, bietet dies Ivy die Möglichkeit, eine hohe Zuverlässigkeit zu erreichen. Die größten Herausforderungen stellen dabei die unzuverlässigen Teilnehmer in einem Peer-to-Peer-Netz und der Umgang mit parallelen Schreibzugriffen dar. Zudem ist es möglich, dass nicht alle Teilnehmer allen andern vertrauen wollen oder können. Deswegen enthält Ivy Mechanismen, die das Ignorieren von Dateioperationen einzelner Knoten ermöglichen. Schließlich muss ein verteiltes Dateisystem auch im Falle von Netztrennungen arbeiten können, bei denen in getrennten Netzen die gleiche Datei verändert wurde, und Mechanismen bieten, diese parallelen Veränderungen zu erkennen, nachdem das Netz wieder zusammengefügt wurde. Eine Reparatur dieser Zugriffe kann Ivy jedoch selbst nicht anbieten, sta�dessen stellt es Funktionen bereit, die der Applikation eine Korrektur ermöglichen soll. Um diese Probleme zu lösen und den Anforderungen gerecht zu werden, verwendet Ivy Logdateien für jeden Knoten, der Schreibzugriff auf das Dateisystem hat. In diesem Log speichert jeder Knoten nur die Änderungen, die er selber vorgenommen hat. Jeder Knoten kann die Logdateien der anderen lesen, da diese im DHash-System gespeichert werden, und daraus eine Sicht auf das Dateisystem konstruieren. Um den Kommunikationsaufwand zu reduzieren, speichert jeder Knoten dieses Bild lokal und muss nur noch nach neueren Einträgen in den Logdateien suchen. Durch die Verwendung von Logdateien für jeden Knoten ist kein Lockingmechanismus nötig, um Metadaten zu schützen. Dadurch, dass die Logdateien im DHash gespeichert wurden, sind sie auch dann verfügbar, wenn der Knoten das Netz verlassen hat. 9 Um Angriffen von anderen Knoten vorzubeugen, signiert jeder Knoten seine Logdatei, sodass ihre Authenzität von den anderen Knoten überprü� werden kann. Knoten können ignoriert werden, wenn ihre Logdateien nicht oder nur bis zu einem bestimmten Zeitpunkt ausgewertet werden, nach dem man davon ausgeht, dass dieser Knoten kompromi�iert wurde. Wurde das Netzwerk geteilt, so kann es durch die DHash-Replikation dazu kommen, dass in beiden Netzen von Knoten parallel geschrieben wird. Durch den Versionsvektor der Logdateien, können solchen konfliktierenden Veränderungen erkannt werden, nachdem das Netzwerk wieder vollständig verbunden wurde. Ivy geht davon aus, dass DHash eine Schreib-Lese-Konsistenz bietet, also nach dem Schreiben von einem bestimmten Wert zu einem Schlüssel, der gleiche Wert auch gelesen werden kann. Dies entspricht nicht der aktuellen Implementation von DHash, jedoch sind Verfahren entwickelt wurden, die dies in den meisten Fällen garantieren können. Eine Logdatei besteht aus einer verbundenen Liste von Logeinträgen. Jeder Logeintrag wird als ein Block im DHash gespeichert, zusammen mit dem Schlüssel zum zeitlich vorhergehenden Logeintrag. Jeder Knoten verfügt über einen Block mit einem festen Schlüssel, in dem er den Schlüssel des neuesten Logeintrages speichert, den Logkopf. Eine solche Logdatei ist also von anderen Knoten von neuesten zum ältesten Eintrag zu lesen. Das hat in den meisten Fällen den Vorteil, dass die älteren Einträge bereits gecacht sind, und nicht wieder aus dem Netz gelesen werden müssen. Jeder dieser Logeinträge enthält Informationen über eine einzelne Dateimodifikation. Die möglichen Operationen entsprechen im Wesentlichen denen von NFS und können der Tabelle 2.1 entnommen werden. Zudem enthalten sie nur die Informationen, die unbedingt nötig sind und nicht auf anderem Wege rekonstruiert werden können. So wird zum Beispiel nach einem Schreibzugriff nicht die neue Dateigröße oder der Zeitstempel gespeichert, da der Zustand der Datei erst nach der Veränderung sicher feststehen kann. Zudem werden Logeinträge nie verworfen. Selbst nachdem eine Datei gelöscht wurde bleiben alle Einträge erhalten, um später, wenn festgestellt wurde, dass der Löscheintrag von einem fehlerha�en Knoten kam, einen korrekten Zustand wiederherzustellen. Darüber hinaus ermöglicht dieses Verfahren auch, einen beliebigen Zustand des Dateisystems aus der Vergangenheit zu verwenden. Damit Logdateien von verschiedenen Knoten miteinander verbunden werden können, ist es nötig, Einträge von mehreren Logdateien, zu ordnen. Dazu speichert jeder Knoten zu jedem seiner Logeinträge den aktuellen Versionsvektor, auf den sich diese Veränderung bezieht. Ein Versionsvektor besteht aus zwei Elementen, zum einen den Schlüssel des Logkopfes und zum anderen den Schlüssel des neuesten Logeintrages. Damit ist es möglich zwei Logeinträge aus unterschiedlichen Logdateien zeitlich zu ordnen oder aber ihre Gleichzeitigkeit festzustellen. Sind zwei Einträge gleichzeitig, gilt es noch zwischen konkurrierenden und unabhängigen Einträgen zu unterscheiden. Unabhängige Einträge können zum Beispiel da- 10 durch entstehen, dass zwei Knoten gleichzeitig jeweils eine andere Datei, im gleichen Verzeichnis, anlegen. Dabei kann es nicht zu Inkonsistenzen kommen, da die Aktionen keinen Einfluss auf die jeweils andere haben. Konkurrierende Einträge können entstehen, wenn zwei Knoten in einer Datei die gleiche Stelle verändern wollen. In diesem Fall kann nur eine dieser Aktionen von den anderen Knoten als gültig erachtet werden, und sie ignorieren die andere. Ivy bietet zusätzlich eine Möglichkeit, Verzeichniseinträge exklusiv zu verändern, also zu verhindern, dass zwei Knoten die gleiche Datei anlegen. Dies ist nötig, damit Applikationen, die mi�els des Dateisystems einen Lock-Mechanismus implementieren, wie gewohnt funktionieren können. Bei diesem Lockingmechanismus wird eine Datei erstellt. Gelingt dies, so kann die Applikation den geschützten Bereich betreten, gelingt dies nicht, weil die Datei bereits existiert, so muss sie warten, bis die Applikation, die die Datei angelegt hat, sie löscht. Dazu wird vor dem Erzeugen des Verzeichniseintrages eine „Prepare" in das Log angehängt. Wenn kein anderer Knoten einen „Prepare"-Eintrag für das gleiche Verzeichnis enthält, so kann der Knoten nun die Datei anlegen. Findet der Knoten jedoch einen anderen „Prepare"-Eintrag, so fügt der Knoten einen „Cancel"-Eintrag in das Log ein und wartet eine gewisse Zeit, ehe er erneut ein „Prepare"-Eintrag erzeugt. Typ Inode Write Link Felder Type (Datei, Verzeichnis, Link), i-Nummer, Modus, Besitzer i-Nummer, Position, Daten SetA�rs i-Nummer, i-Nummer des Verzeichnisses, Name i-Nummer des Verzeichnisses, Name i-Nummer des Verzeichnisses, Name, neuer Name, i-Nummer des neuen Verzeichnisses i-Nummer des Verzeichnisses, Dateiname i-Nummer des Verzeichnisses, Dateiname i-Nummer, veränderte A�ribute End keine Unlink Rename Prepare Cancel Bedeutung Erzeugt eine neue Inode Schreibt die Daten in eine Datei Erzeugt einen neuen Verzeichniseintrag Löscht eine Datei Nennt eine Datei um Für exklusive Operationen Für exklusive Operationen Ändert die Dateia�ribute Letzter Eintrag im Log Tabelle 2.1 (aus [39]): Mögliche Ivy Logeinträge 11 2.4 JuxMem JuxMem [23][2][3] ist kein Shared-Memory-System für die Größenordnungen von Peer-to-Peer-Netzen. Dieses Verfahren beschränkt sich auf eine deutlich kleinere Zahl von teilnehmenden Knoten, in einem darüber hinaus relativ stabilen Netzwerk. Die Entwickler von JuxMem sehen es als eine Zwischenstufe zwischen klassischen Distributed-Shared-Memory-Systemen und Peer-to-Peer-Systemen und entwickeln es als einen Grid-Service. Grid-Systeme unterscheiden sich von Peerto-Peer-Systemen nicht nur in ihrer Größe und Dynamik, Grid-Systeme verfügen über eine hierarchische Topologie, während Peer-to-Peer-Netze meist eine flache Topologie aufweisen. Auch sind Grid-Systeme einfacher zu kontrollieren, was das Vertrauen in die einzelnen Knoten erhöht. Jedoch stellt JuxMem kein klassisches Distributed-Shared-Memory-System dar, da es Peer-to-Peer-Techniken nutzt und in deutlich größeren und deutlich dynamischeren Netzen arbeiten kann. Diese Grundannahmen ermöglichen jedoch Konzepte, die so nicht in Peer-toPeer-Systemen ohne weiteres umsetzbar sind. So ist JuxMem das einzige bekannte Verfahren, das einen Lockingmechanismus vorsieht. In Peer-to-Peer-Systemen mit hunder�ausenden oder Millionen von Knoten ist ein solcher Lock-Mechanismus problematisch, da der nötige Kommunikations-Overhead sehr schnell zu groß werden kann. Group "JuxMem" Provider Group "data" Cluster Manager Group Cluster B Group Cluster A Group Cluster C Client Overlay Netzwerk Physikalisches Netzwerk Cluster C Cluster A Cluster B Abbildung 2.2 (aus [2]): Das JuxMem-Netzwerk. Gruppen werden anhand der Clusterstruktur aufgebaut. Das Netzwerk, wie in Abbildung 2.2 dargestellt, besteht aus verschiedenen Peer-Groups, die jeweils einem Cluster entsprechen. Jede dieser Gruppen enthält Knoten, die lokalen Speicher zur Verfügung stellen und als Provider bezeichnet werden. In jeder dieser Gruppen ist ein Knoten für die Verwaltung der von den Providern gestellten Speicher zuständig. Dieser Knoten wird als Clustermanager bezeichnet. Schließlich gibt es noch Knoten, die als Klient bezeichnet werden und den JuxMem-Dienst nutzen. Jedes Datenobjekt ist mit einer Peer-Group, einer Da- 12 tengruppe, verbunden, die aus allen Providern besteht, die jenes Objekt speichern. Die Knoten einer Datengruppe sind jedoch nicht notwendigerweise von dem gleichen Cluster, sondern können Provider in verschiedenen Clustern sein. Der Applikation werden sieben Funktionen für die Nutzung des Distributed-Shared-Memory-Systems zur Verfügung gestellt. Die Funktion alloc erzeugt einen Speicherbereich mit einer bestimmten Größe und einem gewünschten Redundanzlevel. Die Funktion map liefert den Kommunikationskanal, der für die Veränderung eines Speicherbereiches benutzt wird. Die Funktionen put und get speichern und laden den Speicherbereich. Um einen Speicherbereich exklusiv nutzen zu können, ru� die Applikation die Funktion lock auf, und anschließend die Funktion unlock, die den Speicherbereich wieder frei gibt. Schließlich ist es möglich, mit der Funktion reconfigure den Knoten zur Laufzeit eine andere Rolle zuzuweisen und die an Speicher zu Verfügung gestellte Menge zu verändern. Jeder Provider veröffentlicht die Menge an Speicher, die er anbietet durch eine Nachricht an seine Clustergruppe. Die Aufgabe des Clustermanagers ist es nun, diese Nachrichten von allen Providern seiner Gruppe zu sammeln sowie die Gesamtmenge, die dieser Cluster anbietet, in der JuxMem-Gruppe, in der jeder Knoten Mitglied ist, mitzuteilen. Mi�els eines Distributed-Hash-Tables wird jeder Speichergröße ein Clustermanager zugeordnet, der alle Benachrichtigungen von anderen Clustermanagern, die diese Größe anbieten, speichert. So muss ein Klient diese Mi�eilungen nicht empfangen und auswerten, sondern kann aufgrund seiner benötigten Speichermenge einen Clustermanager ermi�eln, an den er seine Anfrage stellt. Dieser Clustermanager wiederum sucht dann den richtigen Cluster aus, und leitet die Anfrage weiter. Um nicht für jede mögliche Speichergröße einen Clustermanager zuzuweisen, werden nur Speichergrößen von 2N Bytes verwendet. Damit dieses System in dynamischen Netzen funktionieren kann, wird die Speichermenge immer wieder veröffentlicht, wenn sie sich ändert oder die Lebenszeit der Veröffentlichung abgelaufen ist. Zudem existiert in jeder Datengruppe ein Datenmanager, der die anderen Provider in der Gruppe überwacht, und wenn ihre Zahl unter einen Schwellenwert fällt, welchen der Klient spezifiziert hat, bi�et der Datenmanager einen anderen Provider in diese Datengruppe. Fällt ein Clustermanager aus, so werden alle Ressourcen des Clusters unerreichbar, deswegen gibt es einen zweiten Clustermanager, der in diesen Fall die Aufgaben des Clustermanagers übernimmt. Der erste und der zweite Clustermanager synchronisieren sich periodisch durch den Austausch von Nachrichten. Ein ähnliches Verfahren wird bei Datenmanagern eingesetzt. 13 2.5 Zusammenfassung Alle hier vorgestellten Systeme verfügen über einen Mechanismus, Daten zu verändern, die in einem Peer-to-Peer-Netz gespeichert wurden. Sie unterscheiden sich dabei von einfachen Systemen, die keine nachträglichen Veränderungen von Daten erlauben, zum Teil erheblich. Jedoch treffen alle vier Verfahren Annahmen über das Netzwerk oder schränken die Möglichkeiten des Veränderns ein. Keines dieser Systeme ist in der Lage, mit parallelen Schreibzugriffen in einer Größenordnung, wie es bei Peer-to-Peer-Systemen zu erwarten wäre, umzugehen. Als größtes Hindernis erweist sich dabei der hohe Overhead, der für einen Locking-Mechanismus nötig ist, ohne den aber keine Inkonsistenzen durch parallele Schreibvorgänge verhindert werden können. JuxMem stellt einen Kompromiss dar, der jedoch nicht in jeden Fall Verwendung finden kann. Abbildung 2.3 zeigt diese Einordnung schematisch. Für die besonderen Anforderungen von Ubiquitous-Computing [6] wurde keines der Verfahren explizit konstruiert. Einzig JuxMem bietet Möglichkeiten, den Grad der aktiven Partizipation zu steuern, indem sich ein Knoten auf die Rolle eines Providers oder Klienten beschränkt. Jedoch geht JuxMem von einem relativ stabilen Netzwerk aus, was bei mobilen und drahtlosen Teilnehmern nicht erfüllbar ist. Durch aufwendige Signaturberechnungen eignen sich Freenet, OceanStore und Ivy kaum für leistungsschwache Geräte, da sich diese Berechnungen, zumindest bei OceanStore bereits bei Desktop-Computern als problematisch erweisen. Es zeigt sich auch, dass die Kommunikation zwar gut skaliert, dies jedoch auf verhältnismäßig hohem Niveau geschieht, so wurden alle Messungen mit breitbandigen Desktopcomputern vorgenommen. Dies ist jedoch zum Teil den NFS-Benchmarks zuzuschreiben, die den Overhead des Dateisystemmanagements mit sich bringen. ���������������������������������� ��������� ����� ������������ ����� ������������� ������ �������� ����������� ��� ���������� ������� Abbildung 2.3: Einordnung von Peer-to-Peer-Shared-Memory-Systemen. Ivy, OceanStore und Freenet verwenden ein optimistisches Konsistenzsicherungsverfahren. 14 3 Peer-to-Peer-Frameworks Anders als bei konventionellen Klient-Server-Architekturen, bei denen ein Rechner die Serverrolle und andere die Klientrolle übernehmen, gibt es in Peer-to-PeerSystemen keine festen Rollenzuteilungen. Ein Knoten in einem Peer-to-Peer-Netz übernimmt beide Rollen und stellt sowohl eigene Anfragen und beantwortet fremde Anfragen. Der Begriff Peer beziehungsweise Peer-Group stammt aus der Soziologie und beschreibt eine Gruppe von Gleichgestellten, meist auch eine Gruppe, deren Mitglieder viele wichtige Eigenscha�en teilen. So stellen beispielsweise die Studenten der Informatik eine eigene Peer-Group dar. Der Begriff Peer ist also insoweit passend, als dass alle Peers in einem solchen Netzwerk die gleichen Aufgaben übernehmen können. Allerdings sind diese Peer-Groups in der Praxis nicht homogen sondern stark heterogen. Diese Heterogenität stellt aber nicht die einzige Herausforderung für Peer-toPeer-Netze dar. Eine Studie [44] ermi�elte, dass die Verweildauer von Knoten relativ kurz ist, so lag der Median der Sitzungsdauer bei 60 Minuten. Auch wenn die Zeiten nicht bei allen Peer-to-Peer-Netzen gleich sind, so zeigen die Zahlen doch, dass diese Netze sich sehr stark verändern. Während klassische Server fast immer erreichbar sind, sind dies Knoten in Peer-to-Peer-Netzen nur selten. Nur durch die hohe Redundanz, die in Peer-to-Peer-Netzen möglich ist, kann das Netz als Ganzes überhaupt zuverlässig funktionieren. Bekannt wurden Peer-to-Peer-Systeme, auch für die breite Öffentlichkeit, durch Napster. Obwohl es kein reines Peer-to-Peer-System darstellte, weil es von zentralen Servern abhängig war, und auch nicht das erste Peer-to-Peer-System war, erreichte es diese Bekanntheit, weil es ausschließlich dem Tausch von MP3-Dateien diente, und somit viele juristische Probleme verursachte. Diese juristischen Probleme, nicht technische, führten zu einer Reihe von neuen Peer-to-Peer-Systemen. Eines dieser Systeme, Gnutella, das von den Napsternutzern nach der Stilllegung von Napster benutzt wurde, war zwar ein reines Peer-to-Peer-System ohne zentrale Server, jedoch scheiterte es an dem einfachen Routingalgorithmus, der nicht genügend skalieren konnte. Kazaa [27], ein anderes Filesharingprogramm auf Peer-to-Peer-Basis, stellte als erstes die vollständige Gleichheit der Peers in Frage, und ordnete einigen, besonders leistungsstarken Knoten andere, anspruchsvollere Rollen zu. Neben diesen File-Sharing-Programmen gibt es noch andere Anwendungsfelder, die mit Peer-to-Peer-Techniken bedient werden. Am ältesten ist wohl das UseNet, in dem alle News-Server ein gemeinsames Peer-to-Peer-Netzwerk bilden, um Nachrichten auszutauschen. Aber auch Chat-Systeme wie IRC oder ICQ [20] basieren auf Peer-to-Peer-Techniken. Gelegentlich wird auch Seti@Home [45] als ein Peer-to-Peer-System zur Teilung von Rechenleistung angesehen, da jedoch alle Knoten nur mit einer zentralen Instanz agieren, scheint diese Einordnung nicht 15 gerechtfertigt. Peer-to-Peer-Systeme müssen aber nicht nur auf den Austausch von Dateien und das Kommunizieren beschränkt bleiben. Vielmehr bieten sie viele Möglichkeiten, die Zusammenarbeit zu vereinfachen, da keine dezidierten Server mehr nötig sind. So stehen beispielsweise viele OpenSource-Projekte vor dem Problem ihre Werke so zu verteilen, dass keine Kosten entstehen, die nicht durch Einnahmen gedeckt werden können. So ist das Wikipedia-Projekt [51] auf Spenden angewiesen, um die Webserver zu betreuen. Könnten die Server durch ein Peer-to-Peer-Netzwerk ersetzt werden, so wären ähnliche Projekte viel einfacher umsetzbar. In diese Richtung geht Freenet. Freenet stellt sich für den Nutzer als World-Wide-Web ohne Server dar. Jedoch sind die Ansprüche des Freenet-Projektes andere, nämlich die Verhinderung von Kontrolle und Zensur, sodass eine effiziente Umsetzung eines Wikis auf Freenet au�auend unrealistisch erscheint. Im Folgenden werden einige Peer-to-Peer-Frameworks vorgestellt und auf die Tauglichkeit für ein Peer-to-PeerShared-Memory-System untersucht. 3.1 Chord Das Besondere an Chord [12][48] gegenüber anderen Peer-to-Peer-Verfahren ist, dass sowohl die Korrektheit als auch die Performanz bewiesen wurde. Zudem ist es sehr einfach aufgebaut und kann flexibel verschiedenen Anwendungsgebieten angepasst werden. Chord weist anders, als einige populäre Verfahren wie Freenet, eine Ressource explizit Servern zu, die diese vorhalten sollen. Das Chord-Protokoll unterstützt nur eine Funktion: es bildet einen Schlüssel auf einen Netzwerkknoten ab. Damit kann zum Beispiel der Knoten ermi�elt werden, der die Daten zu einem Schlüssel speichert. Chord verwendet „Consistent hashing", um Schlüssel den Knoten zuzuordnen. Consistent hashing hat den Vorteil, dass es die Last zwischen verschiedenen Knoten recht gut verteilt, da jeder Knoten für etwa die gleiche Zahl an Schlüsseln zuständig ist. Zudem benötigt dieses Verfahren relativ wenige Veränderungen bei der Zuordnung der Schlüssel, wenn neue Knoten hinzukommen oder das System verlassen. Anders als bei anderen Consistent-hashing-Verfahren, bei denen jeder Knoten die meisten anderen kennen muss, reicht es, wenn ein Knoten in Chord einige wenige andere kennt. Dadurch wird es allerdings nötig, dass ein Knoten mit andern kommuniziert, um eine Suche nach einem bestimmten Knoten durchzuführen. In einem stabilen Netz mit n Teilnehmern würde Chord für effizientes Routen O(log n) Knoten kennen müssen und könnte mit O(log n) Nachrichten jeden anderen Knoten auffinden. Verlassen nun Knoten das Netz oder kommen neue hinzu, nimmt die Performanz des Systems langsam ab. Solange mindestens eine Routinginformation pro Knoten korrekt ist, kann Chord korrektes Routen garantieren, auch wenn dies sehr viel Zeit in Anspruch nehmen kann. 16 Applikationen, die auf Chord au�auen, bietet Chord Lastenverteilung, Dezentralisation, Skalierbarkeit, Verfügbarkeit und flexible Namensgebung. Da Chord als Distributed-Hash-Funktion arbeitet, werden die Schlüssel gleichmäßig auf alle Knoten verteilt, und somit auch die Last, die jeder Knoten in dem Netz erfährt. Die dezentralisierte Struktur von Chord hat zur Folge, dass alle Knoten gleich sind, kein Knoten ist wichtiger als ein anderer. Chord skaliert logarithmisch mit der Anzahl der Knoten in einem Netz, dadurch eignet sich das System auch sehr gut für größere Netze. Chord passt die internen Routingtabellen permanent an, wenn sich das Netzwerk verändert, so dass der Knoten, der für einen bestimmten Schlüssel zuständig ist, immer gefunden werden kann, so es zu keinem großen Fehler in der unterliegenden Netzwerkschicht kommt. Flexible Namensgebung bedeutet, dass Chord selbest keine Restriktionen für den Au�au der Schlüssel definiert. In dem flachen Namensraum kann jeder beliebige Schlüssel verwendet werden. Chord interagiert mit der Applikation über zwei Wege. Zum einen ru� die Applikation die Funktion lookup(key) auf, zum anderen informiert Chord die Applikation, wenn sich die Schlüssel ändern, für die die Applikation zuständig ist. Die Applikation, die Chord nutzt, ist dagegen für die Authentifizierung, das Cachen, die Replikation und das Benennen von den Daten zuständig. Jeder Knoten erhält eine Identifikationsnummer (ID), die aus seiner IP-Adresse mi�els einem SHA-1 Hash-Verfahren gewonnen wird. Zudem wird eine Identifikationsnummer für jeden Schlüssel erstellt, indem der Hash-Algorithmus auf ihn angewandt wird. Die Länge dieser Nummern ist 2m, wobei m so gewählt wird, dass die Wahrscheinlichkeit, dass zwei Knoten oder Schlüssel die gleiche Nummer erhalten, vernachlässigbar ist. Die IDs werden in einem Kreis angeordnet, das heißt jeder Knoten ist mit dem Knoten der nächst größeren ID und mit der vorhergehenden ID verbunden. Der Knoten, der für einen Schlüssel mit der ID k zuständig ist, wird ermi�elt indem der Knoten bestimmt wird, der die gleiche ID hat oder ihr als nächster folgt. Dieser Knoten wird als Nachfolger von k bezeichnet. Die Abbildung 3.1 zeigt einen Chord-Ring mit m = 6. Es sind zehn Knoten vorhanden, die fünf Schlüssel speichern sollen. Der Nachfolger der ID 10 ist also der Knoten mit der Nummer 14. 24 und 30 würden im Knoten mit der ID 32 gespeichert werden, 38 auf der 38 und 54 auf 56. Verlässt nun ein Knoten das Netz, so übernimmt sein Nachfolger seine Schlüssel. In dem Beispiel übernimmt also der Knoten 21 den Schlüssel 10, wenn der Knoten 14 ausscheidet. Würde ein neuer Knoten hinzukommen, so würde er einige Schlüssel übernehmen, die zuvor sein Nachfolger inneha�e. Wenn also ein Knoten 28 hinzukommen würde, so würde dieser den Schlüssel 24 vom Knoten 32 übernehmen. 17 N1 N56 N8 K54 N51 K10 N14 N48 N21 N42 N38 K38 K24 N32 K30 Abbildung 3.1 (aus [48]): Chord-Netzwerk. Chord verbindet alle Knoten mit einer Ringstruktur. Daten werden von dem Knoten gespeichert, dessen ID größer oder gleich der ID des Datenpakets ist. Um einen Schlüssel nachzuschlagen, reicht es nun, wenn jeder Knoten seinen Nachfolger kennt. An diesen kann er seine Anfrage stellen, der wiederum seinen Nachfolger fragen kann, wenn er für diesen Schlüssel nicht zuständig ist. Da dieses Verfahren aber nur linear skalieren würde, speichert jeder Knoten noch zusätzliche Routinginformationen. Jede dieser Routingtabellen enthält bis zu m Einträge, wobei der i. Eintag in der Tabelle einen Nachfolger bezeichnet, der mindestens um 2i-1 größer sein muss. Anhand dieser Tabelle kann nun ein Knoten die in Frage kommenden Knoten eingrenzen. Periodisch wird das Netz stabilisiert, das heißt, jeder Knoten überprü�, ob seine Nachfolger noch dieselben sind, oder ob neue Knoten dazwischen gekommen sind, bzw. seine Nachfolger das Netz verlassen haben. Dazu fragt jeder Knoten seinen Nachfolger nach dessen Vorgänger, und überprü�, ob dieser nicht sein neuer Nachfolger sein muss, was der Fall ist, wenn ein neuer Knoten eingetreten ist. Gleichzeitig wird so der Nachfolger über seinen Vorgänger informiert. Darüber hinaus überprü� er noch, ob die Einträge aus seiner Routingtabelle korrekt sind und ob sein Vorgänger noch erreichbar ist. 3.2 JXTA JXTA [8][24][26] wurde von der Firma Sun Microsystems entwickelt und als Open Source veröffentlicht. Der Name JXTA wurde aus dem englischen Wort „juxtapose" abgeleitet, was soviel wie „nebeneinander stellen" bedeutet. JXTA ist ein Peerto-Peer-Protokoll, das heißt, dass es anders als Peer-to-Peer-Applikationen wie Freenet oder Gnutella kein eigenständiges Programm darstellt, vielmehr soll es Entwicklern erleichtern ihre eigenen Programme auf Peer-to-Peer-Basis einfacher zu entwickeln. Für JXTA existiert eine Java-Referenzimplementation sowie Implementationen in C und Perl. 18 Eine Vielzahl von Programmen wurde bereits auf der Basis von JXTA entwickelt. Das Spektrum reicht dabei von einfachen Chatapplikationen bis hin zu komplexen Distributed-Shraed-Memory-Systemen für Grid-Computing. Dies ist möglich, da anders als bei anderen Systemen, bei denen nur eine Ressource im Netzwerk lokalisiert und gespeichert wird, JXTA über eine ganze Reihe von flexibel einsetzbaren Möglichkeiten verfügt. So können Knoten Gruppen bilden, die gemeinsam einen Dienst anbieten, sie können aber auch mit einen oder mehreren anderen Knoten Nachrichten austauschen. Jeder Knoten eines JXTA-Netzwerkes, genannt Peer-Endpoint, ist durch eine IP-Adresse zusammen mit einer Port-Nummer mit anderen Teilnehmern verbunden. Durch die Einbeziehung der Port-Nummern ist es somit möglich, anders als bei Chord zum Beispiel, mehrere dieser Peer-Endpoints auf einem Gerät zu betreiben. Dies ist neben Testzwecken auch für Multiuser-Systeme interessant, da nur so mehrere Nutzer gleichzeitig von einem Rechner auf dieses Netzwerk zugreifen können. Diese Art der Adressierung legt aber auch den Grundstein für die Network-Address-Translation-Verträglichkeit (NAT-Verträglichkeit) von JXTA. Während viele Peer-to-Peer-Systeme davon ausgehen, dass eine IP genau einem Teilnehmer zugeordnet ist, und somit Geräte, zwischen denen ein NAT-Router steht, nicht miteinander kommunizieren können, ist dies bei JXTA möglich. Diese Eigenscha� verdankt JXTA jedoch nicht nur der Port-Adressierung, sondern auch der Tatsache, dass jeder Knoten mindestens eine permanente TCP-Verbindung zu anderen Knoten hält. Wäre dies nicht der Fall, so könnten Knoten, die hinter einem NAT-Router stehen, nicht von außen angesprochen werden, diese Knoten können einzig selber Verbindungen in die Außenwelt au�auen. Je nach Leistungsvermögen des Gerätes kann ein Knoten vier verschiedene Rollen annehmen. Als „Minimal Peer" bietet er nur die grundlegenden Funktionen zum Senden und Empfangen von Nachrichten an. Diese Rolle bietet sich für besonders ressourcenarme Geräte an, wie etwa PDAs. Der „Simple Peer" hingegen speichert darüber hinaus noch Informationen über andere Peers, Gruppen und Dienste ab, um Suchanfragen von anderen Knoten beantworten zu können. „Relay Peers" speichern neben diesen Informationen auch Routinginformationen zu anderen Knoten und leiten Nachrichten entsprechend weiter. Insbesondere Knoten, die mit einem NAT-Router an das Internet angebunden sind, also über keine eigene öffentliche IP-Adresse verfügen, sind auf die Existenz solcher Knoten angewiesen, um Nachrichten empfangen und senden zu können. Schließlich ist es die Aufgabe von „Rendezvous Peers", Suchanfragen anderer Knoten an andere Peers weiterzuleiten. In der Regel versucht jeder Peer, der neu in das Netzwerk kommt, sich mit einem Rendezvous-Peer zu verbinden, damit überhaupt erst Kontakt zu anderen Peers aufgenommen werden kann. Durch diese verschiedenen Rollen für Knoten erweist sich JXTA als besonders geeignet für ein Peer-to-Peer-Netz für Ubiquitous-Computing. Je nach den verfügbaren Ressourcen eines Gerätes kann die Rolle frei gewählt werden. Einfache 19 Geräte, mit wenigen Ressourcen, werden so nur mit einem kleinen Kommunikations-Ovearhead konfrontiert. Peers können sich selbst zu Gruppen zusammenschließen, den „PeerGroups". Jeder Peer, der Teil des JXTA-Netzwerkes ist, ist automatisch Mitglied in der „Net Peer Group". Jede andere Gruppe ist eine Untergruppe dieser Gruppe oder von einer anderen Untergruppe. Jeder Peer kann Mitglied von beliebig vielen Gruppen sein. Diese Gruppen dienen zum einen der Zugriffsbeschränkung, so kann eine Gruppe festlegen unter welchen Bedingungen ein Peer Mitglied werden kann, zum anderen dienen sie der Gruppierung nach Interessen von Peers. Dadurch, dass alle Peers in einer Gruppe eine bestimmte Eigenscha� teilen, können so Suchanfragen auf eine bestimmte Menge von Peers beschränkt werden, nämliche auf all jene, die in der Gruppe Mitglied sind, in der die Suchanfrage durchgeführt wird. Gruppen bieten in der Regel Dienste an, die von den Gruppenmitgliedern genutzt werden können. Einige dieser Dienste werden automatisch zur Verfügung gestellt, wie etwa ein Suchdienst, andere können jedoch von den Knoten definiert werden. Prinzipiell können auch einzelne Peers Dienste anbieten, jedoch sind diese Dienste nur zu den Zeiten vorhanden, zu denen der Peer im JXTA-Netzwerk erreichbar ist. In Peer-Groups sorgt JXTA hingegen dafür, dass der Dienst, solange die Gruppe besteht, also mindestens ein Peer in ihr Mitglied ist, existiert und verfügbar ist, weil der Dienst auf jedem Mitglied der Gruppe läu�. Die Grundlage von JXTA stellen jedoch Nachrichten dar. Nachrichten können entweder zwischen zwei Peers oder zwischen einem Peer und mehreren Peers ausgetauscht werden. Jede Nachricht ist ein XML-Dokument, in dem die Daten in Wertepaaren übermi�elt werden. Nachrichten werden zwischen so genannten „Pipes" übertragen. Jeder Peer kann über Input- und Output-Pipes verfügen, siehe Abbildung 3.2. Über das „Pipe Binding Protokoll" werden Input-Pipes mit Output-Pipes verbunden, sodass die Nachrichten, die ein Peer in seine Output-Pipe schreibt, von den Knoten, deren Input-Pipe damit verbunden wurde, empfangen werden können. Man unterscheidet dabei zwischen „Point-to-Point-Pipes" und „Propagate-Pipes", je nachdem ob die Verbindung zwischen zwei oder mehreren Knoten bestehen kann. Diese Verbindungen sind meist unsicher, das heißt, es wird keine erfolgreiche Übertragung garantiert und es kann auch keine empfangene Nachricht qui�iert werden. Jedoch gibt es eine Unterform der Point-to-Point-Pipe die eine sichere Übertragung zwischen zwei Endpunkten garantiert, die „Secure Point-to-Point-Pipe". Jede der genanten Ressourcen, Peer, Peer-Group und Pipe, verfügt über eine eindeutige Nummer, anhand deren sie identifiziert werden können. Damit diese Nummern im System bekannt werden, so dass beispielsweise ein Peer weiß, wie die Pipe-Nummern des Kommunikationspartners lautet, gibt es Advertisements. Diese Advertisements sind Nachrichten, die eine Ressource beschreiben, zum Beispiel einer Peer ID einen Namen zuordnen. 20 JXTA definiert sechs Protokolle für die Interaktion der Peers. Sie wurden so entworfen, dass ein möglichst geringer Overhead entsteht und nur wenige Annahmen über die Netzwerkstruktur getroffen werden mussten. Einzig die beiden Protokolle „Endpoint-Routing-Protocol" und das „Peer-Resolver-Protocol" müssen von jedem Peer implementiert werden, die anderen sind optional. Unicast Pipe Broadcast Pipe Peer B Peer A Peer C Peer B Peer A Peer C Peer D Output Pipe Input Pipe Abbildung 3.2: JXTA bietet Unicast- und Broadcast-Pipes zur Kommunikation zwischen verschiedenen Knoten Die Aufgabe des „Endpoint-Routing-Protocol“ ist es, einen Kommunikationsweg zwischen zwei Peers zu finden, wenn eine direkte Kommunikation nicht möglich ist. Das Routingprotokoll ist flexibel genug, um sich bei Netzwerktopologieänderungen schnell anzupassen. Jeder Relay-Peer verfügt über eine Routingtabelle zu allen ihm bekannten Zielen. Kennt ein Knoten keinen Weg zu dem Ziel, so fragt er alle ihm bekannten Relay-Router nach dem passenden Pfad. Das „Peer-Resolver-Protocol" ermöglicht es einem Peer festzustellen, ob eine Nachricht für ihn bestimmt war. Da es möglich ist, dass eine Nachricht, die an einen einzelnen Peer adressiert wurde, trotzdem an alle Peers eine Gruppe geroutet wird, muss jeder Peer selber bestimmen können, welche Nachrichten für ihn interessant sind. So wird in der J2SE-Implementation von JXTA eine Nachricht an alle lokalen Peers und an alle bekannten Rendezvous-Peers gesendet, die lokalen Peers müssen bestimmen können, ob die Nachricht an sie gerichtet ist, die RendezvousPeers müssen darüber hinaus noch ermi�eln, ob und an welche Knoten sie diese Nachricht weiterleiten sollen. Um Ressourcen zu finden oder zu veröffentlichen, wird das „Peer-Discovery-Protocol" verwendet. Dazu baut es auf dem „Peer-Resolver-Protocol" auf, um Suchanfragen an andere Peers zu senden. Die Antworten, in Form eines Advertisements, die ein Peer auf eine solche Anfrage hin erhält, können redundant sein oder auch ganz ausbleiben. Auch kann es vorkommen, dass ein Knoten Antworten auf Anfragen erhält, die er nie gestellt hat, weil ein Peer eine Ressource durch ein Advertisement veröffentlicht, ohne dass vorher ein Knoten explizit nach ihr gesucht hat. Das „Pipe-Binding-Protocol" stellt eine virtuelle Verbindung zwischen zwei oder mehreren Kommunikationsendpunkten her. Dies geschieht indem einer Input-Pipe eine oder mehrere Output-Pipes zugeordnet werden. Das „Rendezvous-Protocol" dient der Verteilung von Nachrichten in dem JXTA-Netz. Jeder Rendezvous-Peer implementiert dieses Protokoll und versendet alle Nachrichten, die er empfängt 21 an alle ihm bekannten Peers weiter. Schließlich dient das „Peer-Information-Protocol" der Statusabfrage eines Peers. Es steht den Peers jedoch frei, ob sie solche Anfragen beantworten wollen oder nicht. Zu den Statusinformationen gehören die Menge an gesendeten und empfangenen Bytes und seit wann der Peer aktiv ist. 3.3 Tapestry Tapestry [49][53] ist ähnlich wie Chord eine Peer-to-Peer-Routing-Infrastruktur, die sich eines virtuellen Overlay-Netzes bedient, jedoch berücksichtigt Tapestry zusätzlich noch die Netzwerktopologie, um eine nahe liegende Kopie der Ressource zu erlangen. Aufgrund dieser Eigenscha� wurde Tapestry als Grundlage für das OceanStore-System gewählt, da so unnötiger Verkehr vermieden werden kann. So ist es in anderen Peer-to-Peer-Netzen möglich, dass Knoten, die im Peer-to-PeerNetz nur wenige Hops auseinander liegen, physikalisch über sehr viele Hops miteinander kommunizieren müssen, und andererseits Knoten, die physikalisch direkt kommunizieren könnten, könnten im Peer-to-Peer-Netz nur über viele Zwischenschri�e erreicht werden. Jeder Knoten in einem Tapestry-Netz erhält eine ID, die zufällig aus einem großen Raum gewählt wird. Jeder physikalische Host kann mehrere Tapestry-Knoten anbieten. Jeder applikationsspezifische Endpunkt erhält ebenfalls eine ID. Da die Effizienz mit der Größe des Tapestry-Netzes zunimmt, sollten mehrere Applikationen das Netz gemeinsam nutzen. Um diese Koexistenz zu ermöglichen, erhält jede Applikation eine ID, anhand derer eine Nachricht zu einer Applikation zugeordnet werden kann, ähnlich den Ports in TCP/IP-Netzen. Die API von Tapestry bietet vier Funktionen, zum Routen und Veröffentlichen von Objekten, an. Die Funktionen PublishObject und UnpublishObject bieten nur einen best-effort an, und können der Applikation nicht mi�eilen, ob die eigentliche Aktion erfolgreich war. Zudem betreffen sie nur die lokalen Objekte, Objekte auf anderen Knoten können mit diesen Funktionen nicht beeinflusst werden. RouteToObject und RouteToNode versenden Nachrichten an ein Objekt oder an einen Knoten. Um eine Nachricht an einen anderen Knoten routen zu können, speichert jeder Knoten die IP-Adresse und die Knoten-ID von seinen Nachbarknoten, also den Knoten mit denen eine direkte Kommunikation möglich ist. Die Nachricht wird dann an den Knoten übergeben, dessen ID am längsten mit der ID des Zielknotens übereinstimmt. Wenn eine Nachricht an den Knoten mit der Nummer A2AD zu routen ist, der lokale Knoten aber nur die Nachbarknoten A0AD und A234 kennt, so übergibt er die Nachricht an den Knoten A234, da hier die ersten beiden Stellen mit dem Ziel übereinstimmen. Dieses System garantiert, dass eine Nachricht in einem Netz mit N Knoten und IDs mit der Basis β höchstens logβN logische Schri�e benötigt, so lange die Nachbarbeziehungen konsistent bleiben. Wird für eine ID kein Nachbar gefunden, dessen ID teilweise übereinstimmt, so wählt Tapestry 22 einen Nachbarn mit einer nahen Stelle in der ID aus. Eine Nachricht an A2AD würde also an den Knoten B123 weitergeleitet werden, wenn der einzige andere Knoten die ID C123 hat, da B näher an A liegt als C. Da in einem Peer-to-Peer-Netz häufig Verbindungen ausfallen, wird eine Nachricht nicht nur über einen Nachbarknoten geroutet, sondern redundant über Backupverbindungen. Die Zahl der Nachbarn, die ein Knoten kennen muss, beträgt somit c⋅β⋅logβN, wobei c das Maß der Redundanz ist. Ein Peer, der ein Objekt speichert, das nicht von ihm selbst stammt, teilt dies periodisch dem Knoten mit, der dieses Objekt veröffentlicht hat. Jeder Knoten, der diese Nachricht weiterleitet, speichert die Information, dass dieser Peer für dieses Objekt zuständig ist. Ein Peer, der nun an diesem Objekt interessiert ist, schickt eine Nachricht an den Peer, der es veröffentlicht hat. Die Knoten, die diese Nachricht weiterleiten, überprüfen jedoch ob sie einen anderen Knoten kennen, der dieses Objekt ebenfalls speichert. Existiert ein Eintrag, wird die Nachricht an diesen Knoten weitergeleitet, nur wenn kein anderer Knoten bekannt ist, wird die Nachricht an den ursprünglichen Knoten weitergeleitet. Das Routingsystem sorgt dafür, dass Nachrichtenpfade von Knoten, die nah beieinander liegen, sich sehr schnell schneiden, so dass ein über dieses Verfahren gefundener Replikationsknoten näher am anfragenden Knoten ist, als jeder andere Replikationsknoten mit dem gleichen Objekt. 4377 437A 43FE 4361 4228 4664 4A6D AA93 4A4F Abbildung 3.3 (aus [53]): Anfragen werden in Tapestry an den nächstgelegenden Replika umgeleitet Das Beispiel in Abbildung 3.3 verdeutlicht dies: der Knoten 4377 erzeugt eine Ressource, die Knoten 4228 und AA93 speichern diese. Diese beiden Knoten senden periodisch eine Nachricht an den Knoten 4377, dieser Pfad ist durch die gestrichelte Linie gekennzeichnet, alle Knoten auf dem Weg speichern die Information. Fragt der Knoten 4B4F nach der Ressource, leitet der Knoten 4361 die Anfrage über den Knoten 4A6D an den Knoten AA93 weiter, der die Ressource speichert. Gleiches geschieht, wenn der Knoten 4664 die Ressource erfragt, der Knoten 43FE leitet die Anfrage dann an den Knoten 4228 weiter. Die Suchanfrage wird in der Abbildung mit der durchgezogenen Linie dargestellt. 23 3.4 Zusammenfassung Zu diesem Zeitpunkt erfüllt einzig JXTA alle nötigen Voraussetzungen von Daedalus. Da sich mobile Geräte häufig hinter NAT-Routern befinden, wie sie etwa WLAN-Accespoints häufig darstellen, die ihnen erst eine Verbindung zum Internet gesta�en, ist es zwingend nötig, dass dieses System mit Geräten umgehen kann, die keine eindeutige IP-Adresse haben und mit denen auch kein direkter Kontakt aufgenommen werden kann. Des Weiteren sind Systeme, die speziell für den Austausch von Dateien entwickelt wurden, zu begrenzt, um die Daten effizient zu verändern. Häufig liefe dies darauf hinaus, dass eine neue Version als vollkommen neues Datenobjekt betrachtet wird, was das Erlangen der neuesten Version erheblich erschwert. Chord betrachtet alle teilnehmenden Geräte als gleichwertig und eignet sich deshalb nur bedingt für Ubiquitous-Computing, da nicht auszuschließen ist, dass ressourcenarme Geräte Daten speichern obwohl noch genügend leistungsstarke Geräte zur Verfügung stehen. Mit Tapestry kann dieses Szenario zwar verhindert werden und die Lokalität würde die Netzwerklast reduzieren, Tapestry bietet jedoch keine Möglichkeit, effizient eine Veränderung zu kommunizieren. Folglich fiel die Wahl auf JXTA als Basis für Daedalus. 4 Daedalus 4.1 Anforderungen Die Gründe, die für ein System sprechen, welches das verteilte Speichern von Daten ermöglicht, sind vielfältig. Ist eine Ressource an einen bestimmen Server gebunden, so stellt jeder Fehler, in diesem Server, eine Bedrohung für die Ressource dar. Verliert der Server die Verbindung zum Klienten, so ist die Ressource zumindest temporär aus Sicht des Klienten nicht mehr vorhanden. Fällt der Server ganz aus, so kann es sein, dass die Ressource dauerha� fehlt, oder sie, nachdem ein neuer Server installiert und mit einem Backup die Daten des alten Servers eingespielt wurden, nur noch in einer veralteten Version vorliegt. Darüber hinaus steigt die Last des Servers linear mir der Zahl der Klienten, die nach dieser Ressource fragen. So müssen hohe Kosten in Kauf genommen werden, um das System so auszustatten, dass es die erwarteten Anfragen beantworten kann. Steigt nun aber die Zahl der 24 Anfragen über das erwartete Maß hinaus, so entstehen entweder weitere Kosten oder das System wird durch die hohe Last unbenutzbar. Dies kann man beobachten, wenn stark frequentierte Online Magazine wie Slashdot [47] oder Heise Online [17] über eine Webseite berichten. Nur kurze Zeit nach der Veröffentlichung eines solchen Beitrages steigt die Last des Webservers gewaltig. Häufig führt das dazu, dass dieses Webangebot nicht mehr genutzt werden kann. Für den Betreiber stellt dies auch ein finanzielles Risiko dar, da sich die Kosten für das Webhosting auch nach der übertragenden Datenmenge richten. Dieses Szenario ist allerdings nicht mit jedem verteilten Speichersystem lösbar. Wird diese Webseite mithilfe eines Loadbalancers auf mehrere Server verteilt, kann zwar ein Ausfall unter Umständen verhindert werden, die Kosten für die Datenübertragung bleiben jedoch davon unberührt. Hier könnte erst ein System auf Peer-to-Peer-Basis Abhilfe versprechen. Da bei diesen Systemen jeder Klient gleichzeitig auch Server für andere ist, steigt die Zahl der verfügbaren Server mit der Zahl der Klienten. Aber nicht nur die Ressource wird dadurch verteilt, auch die Datenmengen, die die Server bearbeiten müssen, skalieren besser. Ansta� das viele Tausende ihre Anfragen an einen Knoten stellen und somit sehr hohe Verbindungskosten für diesen einen erzeugen, werden nun die Anfragen so verteilt, dass jeder Server nur wenige Anfragen erhält und somit nur eine verhältnismäßig kleine Datenmenge übertragen muss. Neben diesen Vorteilen gibt es aber auch ernst zu nehmende Nachteile für verteilte Speichesysteme auf Peer-to-Peer-Basis. Da die Ressource auf viele Geräten verteilt ist, ist eine Änderung nicht ohne weiteres möglich, sollen die Daten konsistent im Netz bleiben. Da diese Konsistenz nur mit einem zusätzlichen Overhead gewährleistbar ist, schränkt dies das Maß der Skalierbarkeit ein. Das hat zur Folge, dass die bisherigen Peer-to-Peer-Distributed-Shared-Memory-Systeme entweder Annahmen treffen müssen, die die Zahl der Schreibzugriffe beschränken oder aber die Skalierbarkeit einschränken. In dieser Arbeit soll noch ein weiterer Faktor einfließen, der zu weiteren Kompromissen zwingt. Anders als die Teilnehmer in gewöhnlichen Peer-to-Peer-Systemen, die breitbanding mit dem Internet verbunden sind, über genügend lokale Ressourcen verfügen und relativ lange in Peer-to-Peer-Netzen agieren, handelt es sich bei den Geräten aus dem Bereich des Ubiquitous-Computing um eingebe�ete oder mobile Geräte, die über wenige eigene lokale Ressourcen verfügen können. Insbesondere ist ihre Leistungsfähigkeit durch die begrenzten Stromvorräte eingeschränkt. Entscheidend aber ist, dass diese Geräte häufig nur für eine sehr kurze Zeit an der Kommunikation teilnehmen können. So will ein Außendienstmitarbeiter beispielsweise unterwegs einen neuen Termin in seinen öffentlichen Kalender eintragen. Dazu schaltet er nur seinen PDA ein, startet den Kalender und macht die nötigen Eintragungen, um den PDA danach gleich auszuschalten. Die Zeit, die dieser PDA aktiv als Knoten in dem Peer-to-Peer-Netz teilnehmen konnte, beläu� sich auf einige wenige Minuten. Da diese kurze Zeit zum großen Teil für 25 das Laden und Speichern der Ressource benötigt wird, bleibt kaum noch Zeit, etwaige Anfragen von anderen Knoten zu beantworten. Diese kurze Verweildauer ist also dem eigentlichen Peer-to-Peer-Prinzip abträglich, da es sich dabei nicht mehr um gleichgestellte Knoten handelt, sondern um solche, die länger teilnehmen und über viele Ressourcen verfügen und solche, die nur kurz teilnehmen und wenige Ressourcen zur Verfügung haben. Gibt es in einem Peer-to-Peer-System nur Knoten mit kurzer Verweildauer, ist ein Distributed-Shared-Memory-System zum Scheitern verurteilt. Nimmt kein Knoten zu einem bestimmten Zeitpunkt an dem System teil, so geht die Ressource verloren. Einzig wenn die Zahl der potentiellen Teilnehmer sehr groß ist, kann eine dauerha�e Existenz einer Ressource gewährleistet werden. Allerdings ergeben sich aus der geringen Verweildauer bei einer gleichzeitig hohen Zahl an Teilnehmern noch andere Probleme. Die Zahl derer, die zu einem bestimmten Zeitpunkt nach einer Ressource fragen, wird sehr groß, was aufgrund der geringen Leistungsfähigkeit sehr schnell zu einer Überforderung der Knoten führen wird, da sie mit ständigen Anfragen konfrontiert werden. Dieses Problem lässt sich anschaulich an einem Beispiel verdeutlichen. Ein System, bei dem ständig ungefähr zehntausend Knoten online sind und jeder Knoten im Schni� für fünf Minuten erreichbar ist, bekommt pro Sekunde über 300 neue Teilnehmer. Jeder Knoten wird also alle 30 Sekunden einmal die Ressource ausliefern müssen. Ist die Ressource nun über 35 kByte groß, so ist es selbst unter optimalen Bedingungen für ein, mi�els GSM angebundenes, mobiles Gerät nicht mehr möglich, selbst zu kommunizieren. Es ist also offensichtlich, dass die Fähigkeiten eines Knotens im Peer-to-Peer-Netz berücksichtig werden müssen, soll dieses auch für mobile Geräte nutzbar sein. Die Nachrichten, die ein leistungsschwacher Knoten erhält und versendet, müssen also minimiert sein, wünschenswert wäre eine On-Demand-Kommunikation. Dies lässt sich jedoch nur auf Kosten der Konsistenz der Daten erreichen. Einen Ausweg daraus bietet die Zuweisung verschiedener Aufgaben an die einzelnen Knoten und zwar so, dass leistungsschwache Geräte, wenn genügend andere Geräte in dem Netz vorhanden sind, sich nur um ihre eigenen Kommunikationswünsche kümmern müssen. Dies hat jedoch zur Folge, dass einige Knoten veraltete Versionen eine Ressource haben werden. Da diese Knoten jedoch ihrerseits diese Ressource nicht an andere Knoten ausliefern werden, ist diese Einschränkung in den meisten Fällen akzeptabel. Es ist darüber hinaus damit zu rechnen, dass die Datenobjekte in UbiquitousComputing-Umgebungen im Vergleich zu anderen Netzen eher klein sind. Dies kann sehr schnell zu einem hohen Maß an Overhead führen. Um diesem entgegenzuwirken, müssen die nötigen Verwaltungsinformationen begrenzt und einzelne Daten sinnvoll miteinander verbunden werden. Dieses Dataclustering kann jedoch nur auf der Applikationsebene erfolgen. Zusammenfassend ergeben sich folgende spezifische Anforderungen an ein 26 Peer-to-Peer-Shared-Memory-System für Ubiquitous-Computing: • hohe Dynamik der Netzstruktur, häufige Teilungen und temporäre Störungen • hohe Heterogenität der Knoten • Knoten verfügen zum Teil nur über wenige Ressourcen, wie Bandbreite, Speicher oder Rechenleistung • Datenobjekte sind klein • aufgrund der geringen Kosten werden sehr viele Knoten teilnehmen 4.2 Konzeption von Daedalus Jede Ressource, die in dem Shared-Memory-System gespeichert werden soll, erhält einen eindeutigen Namen. Anhand dieses Namens kann die Ressource später gelesen und verändert werden. Alle Ressourcen teilen sich einen Namensraum, so dass der Name einer Ressource so gewählt werden muss, dass dieser mit einer hohen Wahrscheinlichkeit für keine andere Ressource verwendet werden wird. Die Ressourcen können anhand eines Teils ihres Namens gesucht werden, sodass eine Applikation eine pseudohierarchische Struktur anhand des Namens entwerfen kann. Anhand dieses Namens wird eine Gruppennummer generiert, die für die Gruppe steht, die diese Ressource speichern und verwalten wird. Jeder Peer, der die Ressource lesen, verändern oder bereitstellen will, muss in diese Gruppe eintreten. Diese Zuordnung von Ressourcen zu einer Gruppe ist insbesondere in großen Netzen mit vielen Ressourcen sinnvoll. Die Zahl der Peers, die sich für eine bestimmte Ressource interessieren, wird in vielen Fällen unabhängig von der Netzgröße sein, sodass etwaige Skalierungsprobleme dadurch umgangen werden können. Da die Verwaltungs- und Bereitstellungsaufgaben ein hohes Maß an Kommunikation erfordern, wenn die Anzahl der Gruppenmitglieder groß ist, sollte diese Aufgabe von Peers übernommen werden, die über genügend Leistung verfügen. Da die Menge der Kommunikation nicht zuletzt von der Anzahl der Peers abhängt, die die Verwaltungsaufgaben übernehmen, sollte deren Anzahl möglichst klein sein, jedoch groß genug, damit viele Anfragen zur gleichen Zeit nicht zu einer Überlastung dieser Peers führen. Es erscheint sinnvoll, einen bestimmten Prozentsatz der Gruppenmitglieder mit diesen Aufgaben zu betrauen. Diese Gruppenmitglieder werden im folgenden Manager genannt. Da nur die Manager entscheiden, welcher Peer die Ressource gegenwärtig verändern kann, und weil nur sie über die aktuellste Version verfügen, muss jedes 27 Gruppenmitglied, auch wenn es kein Manager ist, eine Reihe von diesen Managern kennen. Darüber hinaus ist es wichtig für die Manager zu wissen, wenn ein neuer Peer die Gruppe betri� oder ein alter die Gruppe verlässt, um überhaupt ermi�eln zu können, wie viele Manager nötig sind. Deswegen sollte jedes neue Gruppenmitglied am Anfang Manager werden. Sind genügend andere Manager da, so kann der neue nach einer gewissen Zeit den Managerstatus ablegen. Diese Wartezeit soll ermöglichen, dass vorher noch Peers diesen Status verlassen, die über weniger Leistung und Netzanbindung verfügen als das Neumitglied. Größe N ΔT ΔN Beschreibung Anzahl der Knoten in der Gruppe Durchschni�liche Verweildauer eines Knotens Durchschni�liche Paketgröße Wertebereich PM Anteil der Manager 5% ... 20% RL Parallele Lesevorgänge 1 ... 5 F PA Fraktionsgröße Mindestzahl, der positiven Antworten auf eine Validierungsanfrage Maximalzeit, die eine Ressource gelockt bleibt 3 ... 10 ~ �F Zeit, die auf eine Welcome-Nachricht gewartet wird Gruppengröße, bei der fremde Knoten in die Gruppe gebeten werden Gruppengröße, bei der passive Knoten aktiviert werden 20s ... 60s TM TW SB SP 15s ... 30s 1 ... 3 3 ... 6 Tabelle 4.1: Parameter von Daedalus Um die Zahl der nötigen Broadcasts zu verringern, antworten auf eine Anfrage, die per Broadcast kam, nicht alle Empfänger, sondern nur eine konstante Zahl, die unabhängig von der Gruppengröße sein muss. Eine lineare Abhängigkeit von der Gruppengröße, wie sie etwa bei der Verwendung von probabilistischen Methoden entsteht, ist aufgrund der möglicherweise großen Gruppengröße nicht möglich. Wenn ein Manager aber in etwa die Anzahl der Manager kennt, kann er diese anhand ihrer Nummer in Fraktionen mit einer bestimmten Größe F unterteilen. Ist ein Manager in der gleichen Fraktion wie der Peer, der die Anfrage stellt, so antwortet er. Dadurch ist die Anzahl der Antworten konstant, die ein Peer auf einen Broadcast erhält, jedoch kann sie stark schwanken, wenn zum Zeitpunkt seiner Anfrage Peers die Gruppe betreten oder verlassen, und sich so bei einigen Managern die Zähler vor der Antwort, bei anderen die Zähler erst nach der Antwort verändern. Um dieses Risiko zu verringern, wird bei der Berechnung der Fraktion eines Peers nicht die aktuelle Anzahl der Manager verwendet, sondern von dieser werden ei- 28 nige der hinteren Stellen gestrichen. So führen einige neue Peers zu keiner Veränderung bei der Fraktionsberechnung, wenn sie nicht den Zähler soweit verändern, dass das Abschneiden der Stellen nicht mehr hil�. Um dem entgegenzuwirken, sollen nicht nur die Manager mit exakt der gleichen Fraktion antworten, sondern auch diejenigen, die in einer um eins größeren oder kleineren Fraktion sind. 4.3 Gruppeneintri� Am Anfang, wenn ein Peer eine Gruppe neu betri�, von der er keine Informationen hat, erhält er den Status eines Managers, das heißt, er ist für die Verwaltung und Vorhaltung der Ressource zuständig. Damit ein Peer dieses kann, muss er zunächst die Verwaltungsinformationen der Gruppe und an die eigentlich Ressource erlangen. Dazu sendet er eine Nachricht an alle anderen Manager. Diese können aufgrund der Nachricht ihre Zähler und die Liste der bekannten Manager aktualisieren. Ist dies geschehen, so antwortet eine bestimmte, feste Anzahl von ihnen dem neuen Mitglied mit einer Nachricht, die die Verwaltungsinformationen enthält. Wurde diese empfangen, verfügt der Peer über sämtliche notwendigen Informationen zur Verwaltung der Gruppe, insbesondere kennt er die Größe der Gruppe, einige andere Manager und weiß, welcher Peer gegenwärtig die Ressource gelockt hat. Es fehlt noch die Ressource selber. Dazu schickt der Peer eine Nachricht an eine begrenzte Zahl RL von anderen Managern, und bi�et sie um ihre Ressource. Die Anzahl der Manager, die befragt werden, kann je nach Netzwerkanbindung variieren, da die Kommunikation jedoch ungesichert erfolgt und andere Manager jederzeit nicht mehr erreichbar sein können, ist eine Verteilung der Anfrage auf mehrere Manager sinnvoll. Nachdem der Peer die Ressource empfangen hat, ist er ein vollwertiger Manager. Da dieser Peer jedoch auch ein Gerät mit nur einer geringen Leistung sein kann, überprü� er nun zunächst, ob genügend Manager für diese Gruppengröße vorhanden sind. Ist dies der Fall, so kann er, nachdem er eine gewisse Zeit gewartet hat, den Managerstatus verlassen und zu einem gewöhnlichen Gruppenmitglied werden. Die Zeit, die gewartet werden muss, hängt in erster Linie von der Geräteklasse des Peers ab. Je mehr Leistung und Netzanbindung er hat, desto länger muss gewartet werden. Darüber hinaus spielt die Anzahl der Gruppen, in der dieses Gerät bereits Manager ist, eine Rolle und schließlich noch die Nummer des Peers, um eine gleichmäßige Anpassung der Managerzahl zu erreichen, nachdem die optimale Zahl der Manager erreicht wurde. Hat ein Peer jedoch, nachdem er die Ressource erhalten hat, kein weiteres Interesse an ihr, so kann er auch gleich, ohne zu warten, die Gruppe verlassen. Erhält der Peer jedoch auf seine erste Nachricht hin keine Antwort, so ist davon auszugehen, dass die Gruppe leer oder nur sehr klein ist und es zu einem Übertragungsfehler kam. Damit letzteres ausgeschlossen werden kann, sollte das Neumit- 29 glied diese Nachricht noch einige Male versenden, bevor diese Gruppe nach einiger Zeit TW als leer, und damit die Ressource als nicht existent, betrachtet wird. 4.4 Lesen der Ressource Hier gilt es, eine Unterscheidung zwischen Managern und regulären Knoten zu machen. Ein Manager verfügt durch seine Aufgaben immer über die aktuelle Version der Ressource, er kann sie also, wenn die Applikation um sie anfragt, ihr sofort übermi�eln. Bei Peers, die keine Manager sind, kann nicht davon ausgegangen werden, dass die Ressource noch aktuell ist. Da diese Peers nur On-Demand kommunizieren, also nur, wenn dieser Peer eine Anfrage versendet, verfügt er über keine Möglichkeit mitzubekommen, ob sich die Ressource verändert hat. Der Peer muss also einen oder mehrere Manager nach der aktuellen Version fragen. Dies geschieht, indem er aus seiner Liste der bekannten Manager einige auswählt und ihnen eine Nachricht schickt. Wenn er die Antworten erhalten hat, kann er diese der Applikation übergeben. Erhält der Peer aber keine Antwort auf seine Anfrage, so ist davon auszugehen, dass die, von ihm befragten Knoten keine Manager mehr oder gar nicht mehr erreichbar sind. Kennt der Peer noch andere Manager, so kann er diese befragen. Gleichzeitig kann er diese anderen Manager auch um eine neue Liste bi�en. Ist jedoch keiner der ihm bekannten Manager mehr erreichbar, so muss dieser Peer selber zum Manager werden, um wieder eine neue Managerliste und die Ressource zu erhalten. 4.5 Stochastisches Locking Wie bei allen Shared-Memory-Systemen muss verhindert werden, dass ein gleichzeitiger Schreibzugriff auf eine Ressource von mehreren Applikationen zu Inkonsistenzen führt. Prinzipiell sind zwei Arten dieses Problem zu lösen denkbar: zum einen ein „optimistisches“ Verfahren und zum anderen ein „pessimistisches“ Verfahren. Das pessimistische entspricht einem Lockingverfahren, bei dem erst dann eine Ressource gesperrt wird, wenn alle Knoten dem zugestimmt haben. Anschließend kann die Ressource verändern kann. Dies ist jedoch in Peer-to-Peer-Umgebungen nicht machbar, da Knoten jeder Zeit unerreichbar werden können. Ein optimistisches Verfahren verzichtet auf ein Sperren der Ressource und versucht parallele Schreibzugriffe danach aufzulösen. Dieser Ansatz eignet sich nur für Szenarien, in denen es nur selten zu Konflikten kommen kann. Deswegen kommt bei Daedalus ein hybrides Lockingverfahren zum Einsatz, das ein Locking einsetzt, jedoch nicht fordert, dass alle Knoten an der Entscheidung beteiligt sind. So gilt die Ressource genau dann als gesperrt, wenn eine ausreichend große Mehrheit der Manager po- 30 sitiv antwortet. Das hier verwendete Verfahren basiert auf den Ideen des SigmaProtokolls [32], angepasst an dynamischere Netze. Dabei wurde die Zuverlässigkeit zugunsten einer besseren Skalierbarkeit reduziert, da nicht mehr alle Server Lockinganfragen beantworten. Die Ressource wird gelockt, indem der Peer eine Nachricht an alle Manager verschickt, wie in Abbildung 4.1 verdeutlicht. Diese tragen den Wunsch in eine Queue ein. Derjenige, der an erster Stelle in der Queue steht, kann die Ressource locken. Da aber die Queue bei den Managern unterschiedlich aussehen kann, da die Laufzeiten der Nachrichten unterschiedlich sind, muss nun erst ein Konsens zwischen den Managern erzielt werden. Dazu verschickt eine bestimmte Fraktion der Manager eine Nachricht an alle Manager und den Peer, der die Ressource locken möchte, die den ersten Eintrag der Queue enthält. Erhält der Peer eine Mindestanzahl von Stimmen, so wird die Ressource für ihn gelockt. Erhält er die notwendige Mehrheit nicht, so sollte er allen Managern mi�eilen, dass er darauf verzichtet und kann nach einiger Zeit einen erneuten Versuch starten. Dadurch wird verhindert, dass sich zwei oder mehrere Lockinganfragen gegenseitig blockieren. Nun muss der Peer warten, bis er in späteren Runden eine ausreichende Mehrheit der Stimmen auf sich vereinigen kann. Knoten B und C teilen allen Managern und A mit, welcher Knoten Gelockt hat Knoten A sendet eine Locking-Anfrage F E G H I D K O B N P O Q P A A K N K M B O Q H C J M G I D K K B H C K F E J M G I D C J F E Knoten A sendet die neue Version des Datums N P Q A O Manager Unicast O Knoten Broadcast Abbildung 4.1: Der Lockingmechanismus. Der Knoten A sendet eine Anfrage an alle Manager, eine Fraktion der Manager beantwortet diese mit einer Nachricht an den Knoten A und alle andern Manager. Durch Auszählung der positiven und negativen Antworten fällt die Entscheidung ob ein Knoten das Datenobjekt gelockt hat. Manager, die selber keine Stimme abgegeben haben, warten auf die Voten der anderen Manager und entscheiden, ebenso wie der beantragende Peer wer die Ressource gelockt hat. Versucht ein Peer die Ressource zu verändern, ohne sie vorher erfolgreich gelockt zu haben, so wird dieser Versuch ignoriert. 31 Nachdem der Peer den Lockingschutz nicht mehr benötigt, gibt er ihn wieder frei, indem er einen Broadcast mit dieser Information an alle Manager schickt. Um aber zu verhindern, dass ein anderer Peer die Nachricht fälscht, um selber den Lockingschutz zu erhalten, fragt eine Fraktion der Manager bei dem Peer nach, ob diese Freigabe von ihm kommt. Ist eine Mindestzahl der Antworten des Peers negativ, so wird davon ausgegangen, dass der Peer das Schreibrecht weiterhin benötigt und die Freigabe eine Fälschung war. Um zu verhindern, dass ein Peer vom Netz getrennt wird, bevor er den Lock freigeben oder die Anfragen bestätigen kann, und somit die Ressource für immer blockieren würde, läu� das Locking nach einer Zeit TM ab. Verfällt der Lockingschutz oder wurde er freigegeben, so wird erneut bestimmt, wer nun die Ressource locken kann, wenn weitere Interessenten in der Queue stehen. 4.6 Schreiben der Ressource Nachdem ein Knoten die Ressource gelockt hat, so kann er sie uneingeschränkt verändern. Um Datenverlust zu verhindern, sollte er zunächst, nachdem er das Schreibrecht erlangt hat, die Ressource erneut laden, wenn er kein Manager ist. Da jede Ressource eine Versionsnummer hat, werden nur neuere Versionen von Managen akzeptiert. Das Verändern einer alten Version würde also zur Folge haben, dass all die Manager, die bereits eine neuere Version gespeichert haben, diese Version als veraltet betrachten und verwerfen. Wurde die Ressource von dem Peer verändert, schickt er diese per Broadcast an alle Manager. Eine Fraktion der Manager fragt dann beim Peer nach, ob die Ressource von ihm stammt; wie bei der Freigabe des Lockingmechanismus, soll dies Fälschungen von anderen Peers verhindern. Dazu wird dem Peer ein Hashwert der Ressource übermi�elt, anhand dessen die Ressource mit seiner Version vergleichen kann. Sind eine Mindestzahl der Antworten des Peers positiv, wird die Ressource von allen Managern als die aktuelle Version gespeichert. Bevor die Bestätigungen des Peers angekommen sind, wird bei jeder Leseanfrage die alte Version an einen Peer übermi�elt. 32 4.7 Verlassen der Gruppe Es kann vorkommen, dass ein Manager oder ein Peer, der gerade noch eine Anfrage verschickt hat, nicht mehr erreichbar ist. Stellt ein Peer fest, dass ein anderer Peer nicht erreichbar ist, indem er zum Beispiel wiederholt auf Anfragen nicht reagiert, so teilt er dies allen Managern mit. Diese können dann ihre Zähler anpassen und diesen Peer aus der Liste der ihnen bekannten Manager streichen. War dies nur eine temporäre Störung, die inzwischen behoben wurde, und der vermeintlich unerreichbare Peer erhält diese Fehlernachricht, so verhält er sich so, als wäre er neu in die Gruppe gekommen. Das Verlassen einer Gruppe kann aber auch durch eine Nachricht an alle Manager angekündigt werden. Das verhindert, dass erst einige Nachrichten versendet werden müssen, ehe der Fehler auffällt. Verlässt ein Manager diesen Status, so versendet er ebenfalls eine Nachricht, die diesen Umstand ankündigt. Nun kann das Verlassen von mehreren Managern schnell dazu führen, dass die Gruppe Gefahr läu�, die Ressource nicht mehr speichern zu können. Um dem vorzubeugen, müssen immer genügend Manager vorhanden sein. Dies kann auf zweierlei Wegen erreicht werden. Zum einen können gewöhnliche Gruppenmitglieder zu Managern gemacht werden, wenn die Zahl der Manager unter SP fällt, zum anderen können Peers, die nicht in dieser Gruppe sind, jedoch noch genügend Reserven haben, in diese Gruppe gebeten und zu Managern gemacht werden, wenn die Managerzahl unter SB fällt. Stellen Manager fest, dass nicht genügend Manager in der Gruppe vorhanden sind, so schicken sie zunächst eine Aufforderung an Nichtmanager der Gruppe, mit denen sie zuletzt Kontakt ha�en. Dazu speichert jeder Manager die Adressen der Peers, die ihn zuletzt um die Ressource baten. Können nicht genügend Gruppenmitglieder zu Managern gemacht werden, zum Beispiel weil die Gruppengröße im einstelligen Bereich liegt, so veröffentlich ein Manager diesen Umstand in einer separaten Gruppe, in der all die Geräte Mitglied sind, die leistungsfähig genug sind, um noch in weitern Gruppen als Manager zu dienen. Die Peers in dieser Gruppe entscheiden zufällig, ob sie dieser Bi�e nachkommen. Durch diese Vorgehensweise kann erreicht werden, dass auch, wenn alle Interessenten an einer Ressource das Netz verlassen haben, die Ressource weiter existiert, solange noch Knoten mit freien Ressourcen erreichbar sind. 33 5 Evaluierung 5.1 Skalierbarkeit Die Zahl der Nachrichten, die ein Knoten zu bearbeiten hat, hängt von der Rolle ab, die dieser Knoten in einer Gruppe übernimmt. Hier muss also zwischen Managern und regulären Knoten unterschieden werden. Darüber hinaus richtet sich die Anzahl der Nachrichten nach der Größe und der Aktivität der Gruppe. Die Größe des Netzes und damit die Zahl aller Peers im Daedalus-Netz hat hingegen keinen Einfluss auf die Nachrichtenmenge, da sämtliche Kommunikation in JXTA-Gruppen erfolgt. Tabelle 5.1 zeigt die zu erwartende Nachrichtenzahl eines Managers in Abhängigkeit der Gruppengröße. Sie zeigt, dass Manager eine linear zur Gruppengröße wachsende Zahl von Nachrichten empfangen, aber nur eine konstante Zahl von Nachrichten senden. Der Grund hierfür ist, dass nur eine konstante Zahl von Managern auf eine Anfrage antwortet. So sinkt die Wahrscheinlichkeit, dass ein Knoten auf eine bestimmte Anfrage antwortet mit der Anzahl der Knoten in einer Gruppe. Gleichzeitig nimmt die Zahl der Anfragen in einer Gruppe mit der Zahl der Knoten zu, wenn man unterstellt, dass alle Knoten in etwa gleich aktiv sind. Neue Knoten Lesen Schreiben Locking Last durch das Senden O(1) O(1) O(1) O(1) Last durch das Empfangen O(N) O(1) O(N) O(N) Tabelle 5.1: Lasten für Manager durch Nachrichten. Die Last durch eingehende Nachrichten steigt linear mit zunehmender Gruppengröße. Die Zahl der zu sendenden Nachrichten bleibt konstant. Die Zahl der Nachrichten, die ein regulärer Knoten im Vergleich dazu empfängt und sendet, ist von der Gruppengröße unabhängig. Da auf jede Anfrage eines regulären Knotens nur eine konstante Zahl von Managern antwortet, ist die Last ausschließlich von der Anzahl und Art der Anfragen eines dieser Knoten abhängig und somit von selbstbestimmbaren Größen. Die Gesamtlast des Systems lässt sich nur schwer bestimmen, da das JXTA-Netzwerk virtuell ist und keine Rückschlüsse auf die tatsächliche Topologie zulässt. Da jeder Manager O(N) Nachrichten empfängt und die Zahl der Manager einer Gruppe von der Zahl der Gruppenmitglieder linear abhängt, liegt die Größenordnung 34 der Nachrichten in einer Gruppe bei O(N2). Dies zeigt, dass Daedalus bei großen Gruppen erheblich ineffizienter wird, da jedoch eine Gruppe nur die Knoten enthält, die sich für ein Datenobjekt interessieren, werden große Gruppen nur sehr selten au�reten. Nicht betrachtet in dieser Analyse ist die Last, die durch Nachrichten entsteht, die von einem Knoten weitergeleitet werden. Diese Betrachtung ist jedoch für das Ubiquitous-Computing weniger wichtig, da ressourcenarme Geräte diese Aufgaben nicht oder nur im geringen Maße wahrnehmen. Darüber hinaus hängt diese Last von allen JXTA Knoten ab, und ist somit nicht auf Basis von Daedalus bestimmbar. Die Last eines Knotens skaliert folglich im worst case linear mit der Zahl der Gruppenmitglieder, im besten Fall ist sie vollständig unabhängig von externen Größen und kann von einem Knoten selbständig bestimmt werden. Demgegenüber steht eine quadratische Laststeigerung des Gesamtnetzverkehrs. Da aber der Großteil dieser Last auf stationäre, leistungsstarke Netzwerkknoten fällt, scheint dieser Trade-off für Ubiquitous-Computing-Szenarien akzeptabel, insbesondere da die zu erwartende Gruppengröße, verglichen mit der Gesamtzahl der Knoten in einem Netz, klein ist, verglichen mit den Netzwerkgrößen anderer Verfahren. 5.2 Performanz Der Performanz von Daedalus hängt von der Zeit ab, die für die Kommunikation nötig ist, und von der Zeit, die die einzelnen Knoten zur Verarbeitung der Pakete benötigen. Zunächst wurde die Verarbeitungszeit ermi�elt, indem alle DaedalusKnoten auf einem Rechner liefen, wodurch keine Kommunikation über Netzkomponenten nötig war. Die Messung erfolgte auf einem Windows 2000 PC mit einem 2 GHz Prozessor mit der Java 2 Standard Edition (J2SE) 1.5.0 und der JXTA Version 2.3.4. Die ermi�elten Zeiten sind in Tabelle 5.2 aufgeführt. Zu beobachten ist dabei, dass die Zeit, die für das Verändern eines Datenobjektes nötig ist, linear steigt, wenn die Zahl der Manager erhöht wird, die auf eine Anfrage reagieren. Erklärt werden kann dies mit dem Scheduling des Rechners. So sind mit zunehmender Knotenzahl mehr Kontextwechsel nötig. Um die Performanz von Daedalus in einem Netzwerk beurteilen zu können, ist es nötig die Zeiten zu ermi�eln, die JXTA für das Übermi�eln einer Nachricht benötigt. Die tatsächliche Zeit hängt stark von der Netzstruktur und den Transporteigenscha�en der verwendeten Hardware ab. Deswegen wurde in einer IRISA Studie [5] die Round Trip Time (RTT) von JXTA-Unicast-Nachrichten mit der einer gewöhnlichen Socket-Kommunikation verglichen. Hierbei zeigte sich, dass in LAN-Netzen JXTA, je nach verwendeter Kommunikationsmethode, um den Faktor fünf bis 30 langsamer war als die Socket-Kommunikation. Hauptgrund hierfür ist die Verarbeitung der JXTA-Nachrichten. Messungen über die Suche mit JXTA wurden vom JXTA-Benchmark-Projekt [25] durchgeführt. 35 Anhand dieser Daten ist es nun möglich, die Performanz von Daedalus für ein Szenario abzuschätzen. Die Zeit, die für das Verändern eines Datenobjektes nötig ist setzt sich aus der Zeit für das Locking, dem Verteilen der neuen Version und deren Validierung, der Freigabe des Lockings sowie der Zeit zum Verarbeiten der Nachrichten zusammen. Update-Zeit: Tu = Tl + Td + Tr Für das Locking sind zwei Sendevorgänge nötig, für das Verteilen und Validieren sowie für die Freigabe des Lockings jeweils drei. Dazu kommt die Zeit für das Verarbeiten der JXTA- und Daedalus-Nachrichten. In Abhängigkeit von dieser Sendezeit ergibt sich also folgende Beziehung: Update-Zeit: Tu = 8 Ts + Tc In einem Szenario, in dem sich alle Knoten in dem gleichen WLAN befinden, welches eine gewöhnliche RTT von 1ms hat, hat die eigentlich Kommunikation kaum einen Einfluss auf die Performanz, die Leistungsstärke der Knoten jedoch einen hohen. So benötigt ein Update in einer Gruppe mit zwei Managern so etwa 144 ms, ein Update in einer Gruppe mit fünf Managern 354 ms. Erfolgt das Update von einem Knoten aus, der mit einer Breitbandverbindung angebunden ist, die eine RTT von 80 ms hat, nimmt die Bedeutung der Netzstruktur zu. So benötigt ein Updatevorgang nun in einer Gruppe mit zwei Managern 460 ms und 670 ms in einer Gruppe mit fünf Managern. Da in vielen Szenarien jedoch die Kommunikation zumindest teilweise über das Internet erfolgt, wurde schließlich noch ein reales Daedalus-Szenario getestet. Dabei kommunizierten die Knoten über das Internet miteinander, an das sie per Breitbandverbindung angeschlossen waren. Dazu wurde zuerst die Zeit gemessen, die nötig ist, bis sich ein Gerät mit dem JXTA-Netzwerk verbunden hat und der Basisgruppe des Daedalus-Systems beigetreten ist. Danach die Zeit bis ein Knoten Mitglied einer Gruppe geworden ist, und die Zeit, die ein passiver Knoten benötigt, um die aktuelle Version in Erfahrung zu bringen. Schließlich wurde die Zeit ermi�elt, die nötig ist um ein Datenobjekt zu verändern, indem zuerst das Datenobjekt gesichert, geschrieben und danach wieder freigegeben wurde. Bis auf die erste Messung hängen alle von der Gruppengröße zu einem bestimmten Maße ab. Die Zeit, für den Beitri� zum JXTA-Netzwerk benötigt wird, ist jedoch unabhängig von der Zahl der Knoten, die den Daedalus anbieten oder nutzen. Diese Größe ist nur von der Erreichbarkeit der, dem Knoten bekannten, Rendezvous-Peers abhängig. Diese Zeit spielt jedoch eine große Rolle, da sie sich als bestimmend für die Zeit, bis ein Knoten den Wert einer Ressource ermi�eln kann, erweist. Um die Zeit für das Verbinden zum JXTA-Netzwerk zu ermi�eln wurden 50 Messungen vorgenommen. Gemessen wurde dabei die Zeit, die nötig ist, um zum 36 Netzwerk verbunden zu werden, einen Rendezvous-Peer zu finden und der Daedalus-Basisgruppe beizutreten. Dabei kann in Abbildung 5.1 beobachtet werden, dass in den meisten Fällen in etwas mehr als zehn Sekunden eine Verbindung aufgebaut werden konnte, jedoch einige Ausreißer die nötige Zeit verdreifachten. Als entscheidend für die Frage, wie lange für diesen Vorgang gebraucht wurde, erweist sich die Zeit, die zum Verbinden mit einem Rendezvous-Peer benötigt wird. So kann der Ausfall eines solchen Knotens dazu führen, dass beim nächsten Verbindungsau�au eine wesentlich längere Zeit benötigt wird, nachfolgende Verbindungen können dann allerdings wieder schneller erfolgen, solange der neue Rendezvous-Peer erreichbar bleibt. Genügend Rendezvous-Peers sind folglich notwendig, wenn ein Knoten schnell auf Daedalus zugreifen will und er über keine permanente Verbindung verfügen kann. Im Durchschni� wurden für den Beitri� 13 Sekunden benötigt, wobei die Häl�e aller Verbindungsau�auten in unter elf Sekunden erfolgt war. Abbildung 5.1: Gemessene Zeiten bis der Knoten mit dem JXTA-Netzwerk verbunden ist Die zum Beitri� einer Gruppe nötige Zeit hängt, je nach Messpunkt, nicht oder nur bedingt von der Anzahl der Knoten in dieser Gruppe ab. Da ein Knoten bereits nach dem ersten Welcome-Paket aktiv arbeiten kann, wurde nur bis zum Eintreffen des ersten Welcome-Pakets gemessen. Dadurch wird die benötigte Zeit jedoch unabhängig von der Anzahl der Knoten. Die hohe Varianz, die man den Werten aus Abbildung 5.2 entnehmen kann, entsteht durch veränderte Netzwerktopologien. So ist es möglich, wenn der Sender des Hello-Pakets und der Sender des Welcome-Pakets nur über kurze Wege miteinander verbunden sind, der Kommunikationskanal deutlich schneller aufgebaut werden kann. Der Anteil der Zeit, den JXTA für den eigentlichen Gruppenbeitri� benötigt, ist dabei relativ klein und 37 stabil. Der Au�au des Unicast-Kommunikationskanals für die Welcome-Pakete nimmt hier den größten Teil der Zeit ein und stellt auch gleichzeitig die variabelste Einflussgröße dar. Erkennbar ist jedoch, dass die Werte eine untere Schranke bei ungefähr einer Sekunde haben und die Mehrheit der Messwerte unter 2,5 Sekunden lag. Im Durchschni� wurden für den Beitri� zu einer Gruppe 2,6 Sekunden benötigt. Abbildung 5.2: Gemessene Zeit vom Gruppeneintri� bis zur Erlangung der Ressource Für das Laden einer Ressource ergibt sich ungefähr ein Wert von 0,4 Sekunden, wie Abbildung 5.3 zeigt. Die dri�e und letzte Messreihe soll darüber Auskun� geben, wie sich Daedalus in einem der beiden Standardanwendungsfälle, dem Verändern der Ressource, verhält. Hierbei wurde die Zeit gemessen, die für das Sichern eines Datenobjektes, das Publizieren und Bestätigen der Veränderung und schließlich dem Freigeben des Objektes nötig war. Der Knoten, der die Veränderung vornehmen sollte, war ein Manager, weswegen ein Ermi�eln der aktuellen Version nach dem Sichern des Objektes entfallen konnte. Für Knoten, die keine Manager sind, verlängert sich demzufolge die nötige Zeit um die Zeit, die für das Laden der Ressource nötig ist, im Durchschni� also um 0,4 Sekunden. Gemessen wurde zunächst in Gruppen mit zwei, drei und fünf Managern. Anschließend wurden noch Messungen mit zehn und zwanzig Managern vorgenommen. In allen Fällen wurde die Zahl der Manager, die für die Entscheidung über den Lockmechanismus zuständig sind, auf zehn festgelegt. Zu erwarten ist also nur eine Zunahme der Zeiten bis zu zehn Managern, Gruppen mit mehr Managern sollten keinen Zuwachs dieser Werte erfahren. Abbildung 5.4 zeigt die Verteilung der gemessenen Zeiten. Abbildung 5.5 zeigt die Entwicklung des Durchschni�swertes und des Medians bei zunehmender Managerzahl. Erkennbar ist, dass die Zeit langsam zunimmt 38 und insbesondere die Varianz deutlich wächst. Gruppen mit mehr als zehn Managern zeigen, wie erwartet, keine signifikanten Veränderungen zu Gruppen mit zehn Managern. Es zeigt sich jedoch, dass die Zahl der Manager, die über den Lockmechanismus entscheiden, Auswirkungen auf die Performanz des Gesamtsystems beim Schreiben haben. Hier muss also in den jeweiligen praktischen Anwendungsfällen ein Kompromiss zwischen Performanz und Konsistenzsicherheit gefunden werden. Einzelner PC Internet Szenario Verbinden zu JXTA 2627 ms 13211 ms Einer Gruppe beitreten 268 ms 2618 ms Ressource laden 130 ms 421 ms Ressource speichern mit 2 Managern 139 ms 1054 ms Ressource speichern mit 3 Managern 187 ms 1688 ms Ressource speichern mit 5 Managern 349 ms 2651 ms Ressource speichern mit 10 Managern 4130 ms Ressource speichern mit 20 Managern 4266 ms Tabelle 5.2: Daedalus-Performanz Die Messungen zeigen deutlich, dass die Performanz des Systems, auch wenn sie weitgehend unabhängig von der Anzahl der Knoten ist, viel Raum für Verbesserungen lässt. Da der Großteil der Zeit jedoch für Aufgaben verwendet wird, die das JXTA-Framework erfüllt, ist dies der vielversprechendste Ort, um die nötigen Zeiten zu reduzieren. Allerdings dür�e durch eine stärkere Verbreitung und damit eine höhere Zahl von Rendezvous-Peers und Relay-Peers dafür sorgen, dass zukün�ig die Kommunikation im JXTA-Netzwerk schneller erfolgen kann. 39 Abbildung 5.3: Gemessene Zeiten zum Ermi�eln von ungecachten Ressourcen Abbildung 5.4: Gemessene Zeiten beim Verändern der Ressource rote Punkte bei zwei, grüne bei drei, blaue bei fünf, viole�e bei zehn und schwarze Punkte bei 20 Managern 40 Abbildung 5.5: Median (grün) und Durchschnitswert (rot) der ermi�elten Zeiten für zwei, drei, fünf und zehn Managern 5.3 Fehlermodell Um das Verhalten eines Systems im Fehlerfall vorherzusagen, ist es zunächst nötig, mögliche Fehlerquellen zu bestimmen. Neben der Nichterreichbarkeit eines Knotens ist mit fehlerha�en und manipulierten Knoten zu rechnen. Die Konsequenzen der Fehler hängen jedoch von der Anzahl der Fehler ab, da ein einzelner fehlerha�er Knoten kaum Einfluss auf das Gesamtsystem hat. Dazu ist es nötig, die Zahl der möglichen Fehler zu ermi�eln, bei der Daedalus noch korrekt funktionieren kann. Tabelle 5.3 zeigt die Zuordnung zwischen Fehlern und Folgen. Die Felder „ne“ stehen dabei für nicht erreichbare Knoten, die Felder „�“ für fehlerha�e oder manipulierte. 41 �RL �F �F �M �M M N ne � ne � ne � ne � ne � ne � ne � • • • • • • • • Lesen scheitert • • Daten nicht erreichbar • • Daten veraltet • • • • • • • • • • Locking scheitert • • • • • • • • • • Validierung scheitert • • Datenmanupilation möglich • • Locking für falschen Knoten • • Lockingfreigabe durch falschen Knoten Tabelle 5.3: Abhängig von der Anzahl der fehlerha�en (�) oder nicht erreichbaren (ne) Knoten kommt es zu diesen Fehlern Sind alle Knoten einer Gruppe nicht erreichbar, ist das Datenobjekt dieser Gruppe nicht mehr verfügbar. Knoten, die nun der Gruppe beitreten, erstellen neue Versionen des Datenobjektes, unabhängig von der vorhergehenden. Trat dieser Fehler nur temporär auf und kein neuer Knoten erzeugte in der Zwischenzeit eine neue Version, so kann, nachdem die Knoten der Gruppe wieder erreichbar sind, die Gruppe fortgesetzt werden. Sind alle Manager einer Gruppe nicht erreichbar, so können Anfragen regulärer Knoten nicht beantwortet werden, worau�in diese zu Managern werden. Da reguläre Knoten möglicherweise nicht die aktuelle Version eines Datenobjektes kennen, geht diese verloren. Sta�dessen ist nur eine ältere Version vorhanden. Sind mindestens zwei Dri�el der Manager einer Fraktion manipuliert oder fehlerha�, kann diese Fraktion falsche Informationen an neue Knoten liefern, das Schreibrecht einem falschen Knoten zuweisen und das Locking au�eben. Des weiteren ermöglicht dies anderen Knoten das Datenobjekt zu manipulieren. Sind mehr als ein Dri�el aller Manager einer Fraktion fehlerha�, so können Validierungsanfragen und Lockingentscheidungen fehlschlagen. Betri� dies nur eine Fraktion, so können nachfolgende Anfragen erfolgreich sein. Sind mehr als ein Dri�el der Manager fehlerha�, die ein Knoten um die Ressource bi�et 42 (�RL), ist es nicht möglich, die aktuelle Version des Datenobjektes zu erhalten. Folgende Anfragen können jedoch zu einem Ergebnis führen. 5.4 Verfügbarkeit Die Verfügbarkeit eines einzelnen Knotens in einem Peer-to-Peer-Netz ist aufgrund der geringen Verweildauer und der fehlenden Kontrolle nur gering. Durch redundante Anfragen kann jedoch ein hohes Maß an Verfügbarkeit des Gesamtsystems erreicht werden. Sämtliche Vorgänge werden in Daedalus redundant ausgeführt, wobei es im Falle des Lesens einer Ressource dem Knoten überlassen bleibt, den Grad der Redundanz selbst festzulegen. Neben der Verfügbarkeit ist die Folge eines Fehlers von Bedeutung. Um die Verfügbarkeit eines Knotens zu ermi�eln, ist es zunächst nötig, die Mean Time to Failure (MTTF) sowie die Mean Time to Repair (MTTR) zu bestimmen. Die MTTR besteht dabei aus der Zeit, die für einen Knoten nötig ist, sich erneut mit dem JXTA Netzwerk zu verbinden, der Daedalus-Gruppe und der Ressourcengruppe beizutreten und schließlich erneut das Datenobjekt zu erlangen. Diese Zeit summiert sich auf 20237ms. Die MTTF ist nicht ohne Weiteres bestimmbar. Schließt man alle Fehler aus, so entspricht sie der Zeit, die ein Knoten in einer Gruppe Mitglied ist. Die Verfügbarkeit berechnet sich nun durch: Verfügbarkeit: As = MTTF MTTF + MTTR Die Redundanz für den Gruppeneintri� entspricht F, wobei F die Fraktionsgröße ist und zwischen 3 und 10 liegt, wenn die Gruppe groß genug ist. Nimmt man für einen Knoten eine Verfügbarkeit von AK=0,9374, was einer MTTF von fünf Minuten entspricht, und eine Fraktionsgröße von 3 an, so ergibt sich eine Verfügbarkeit für den Gruppeneintri� von AG=0,9998. Erhöht sich die Fraktionsgröße auf 10 Knoten, so hä�e dies eine Verfügbarkeit für den Gruppeneintri� von AG=0,999 999 999 999 zur Folge. Die Konsequenz eines fehlerha�en Gruppeneintri�s ist entweder, dass der Knoten von einer leeren Gruppe ausgeht oder dass er falsche Daten hinsichtlich der Größe der Gruppe hat. Geht ein Knoten davon aus, dass die Gruppe leer ist, so kann er nicht in der Gruppe partizipieren, jedoch auch nicht andere Knoten behindern. Darüber hinaus kann er zu einem späteren Zeitpunkt erneut einen Gruppeneintri� versuchen. Erhielt der Knoten falsche Informationen über die Gruppe, kann der Knoten ohne Probleme in der Gruppe teilnehmen, er wird jedoch Anfragen beantworten, für die er nicht zuständig ist. Solange dies jedoch nur für einen kleinen Teil der Knoten zutri�, ist die zusätzliche Last vernachlässigbar. Die Verfügbarkeit des Lesens hängt davon ab, wieviele Manager ein Knoten um 43 ein Datenobjekt bi�et. Folglich kann jeder Knoten auf Kosten von Bandbreite eine hohe Zuverlässigkeit erlangen. In Abhängigkeit von AL ergibt sich also folgende Leseverfügbarkeit AR: AR=1-(1-AK)RL Bei einer dreifach redundanten Anfrage an Knoten mit der Verfügbarkeit von AK=0,9375 beträgt die Leseverfügbarkeit 0,9998. Scheitert die Anfrage, weil kein Knoten antwortet, so kann diese Anfrage noch einmal gestellt werden, es entsteht also lediglich eine Verzögerung. Wird die Anfrage jedoch mit einem falschen Datenobjekt beantwortet, empfiehlt sich ein zusätzlicher Datenschutz, etwa in Form von Checksummen, um das Datenobjekt zu überprüfen. Verändert ein Knoten das Datenobjekt, so wird die neue Version als Broadcast an alle Manager verschickt. Folglich verfügt jeder Manager danach mit einer Wahrscheinlichkeit von RK über die korrekte neue Version. Zusätzlich empfängt jeder Manager noch mindestens PA Validierungsnachrichten, anhand deren der Manager die Version überprüfen kann. Besteht eine Fraktion aus 3 Knoten, bedeutet dies, dass jeder Manager mindestens 2 Bestätigungsnachrichten erhalten muss. Die Verfügbarkeit der Validierung ist in diesem Fall AV=0,996. Es besteht also eine Gesamtzuverlässigkeit für diesen Vorgang von A=0,9958. In den meisten Fällen wird man also Fraktionsgrößen deutlich größer als 3 Knoten wählen. Einen weiterer Zugewinn an Verfügbarkeit kann darüber hinaus auch in diesem Fall durch die Verwendung von Checksummen oder Codierungsverfahren erreicht werden. Die Verfügbarkeit des stochastischen Lockings hängt von den gleichen Parametern ab, von denen auch die Verfügbarkeit des Schreibens abhängt. Folglich sind beide Zuverlässigkeiten gleich. Beide Vorgänge unterscheiden sich jedoch in der Konsequenz des Verfügbarkeit . Ist die Entscheidung der Fraktion, die über das Locking abstimmt, fehlerha�, so wird das Schreibrecht auf die Ressource entweder einem andern Knoten oder gar keinem Knoten zugesprochen. In beiden Fällen führt der Fehler nicht zu inkonsistenten Daten sondern zu einer Verzögerung. 5.5 Responsivität Das Maß der Responsivität gibt an, mit welcher Wahrscheinlichkeit ein Vorgang zu einem Zeitpunkt erfolgreich in einer bestimmten Zeit ausgeführt werden kann. Dabei hängt diese Größe von der Verfügbarkeit des Dienstes und der Wahrscheinlichkeit, das Ergebnis in der geforderten Zeit zu erhalten, ab [22]. Responsivität: ri(t) = ai pi Ausgehend von den in den vorhergehenden Abschni�en ermi�elten Werten ergeben sich die, in Tabelle 5.4 angegebenen, Werte für die Responsivität. Dabei 44 wurde die Fraktionsgröße auf fünf Manager festgelegt. Die Leseoperation erfolgt ebenfalls fünffach parallel. Laden Speichern (2 Manager) Speichern (3 Manager) Speichern (5 Manager) Speichern (10 Manager) Speichern (20 Manager) r(0,5) 0,75 0 r(1) ~1 0,489 r(2) ~1 0,946 r(3) ~1 ~1 r(4) ~1 ~1 r(5) ~1 ~1 r(7) ~1 ~1 r(8) ~1 ~1 0 0,249 0,697 0,847 ~1 ~1 ~1 ~1 0 0 0,3 0,7 0,9 0,95 ~1 ~1 0 0 0 0,15 0,55 0,85 0,9 ~1 0 0 0 0,05 0,5 0,8 0,95 ~1 Tabelle 5.4: Responsivität einer Gruppe beim Laden und Verändern eines Datenobjektes 5.6 Datenoverhead Der Datenoverhead ist die Menge an Daten die übermi�elt werden müssen, ohne das sie Informationen für die Anwendungen enthalten. Das sind im Besonderen die Nachrichten, die zum Eintri� in Gruppen, zur Gruppenverwaltung und zum Locking nötig sind. Die Nachrichtengrößen von Daedalus ohne Nutzlast sind in Tabelle 5.5 aufgeführt. Für einen Vergleich zu einer reinen Datenübermi�lung ohne JXTA muss darüber hinaus für jede Nachricht der Overhead von JXTA berücksichtigt werden, der 877 Byte beträgt. In einem Szenario, in dem ein Knoten in einer Gruppe mit drei Managern ein Datenobjekt verändern will, muss er neben den eigentlichen Daten noch 2214 Bytes senden und 3054 Bytes empfangen. Insgesamt also 5528 Bytes zusätzlich zu den Daten, die gespeichert werden sollen, für Daedalus. Der Overhead der durch die JXTA-Kommunikation entsteht, 10524 Bytes, bedeutet, dass Daedalus im Vergleich zu einem direkten Übermi�eln der Nutzdaten in diesem Fall 16052 Bytes mehr übertragen muss. 45 Nachrichtentyp Bye Error Hello Invitation Manager-Request Mutex Mutex-Responce Request Ressource Validation Validation-Request Welcome Größe in Bytes 216 296 219 210 220 206 324 220 392 235 347 376 Tabelle 5.5: Paketgrößen von Daedalusnachrichten 5.7 Zusammenfassung Die Performanzeinschätzungen und der Overhaed machen deutlich, dass Daedalus nicht für jedes Szenario einsetzbar ist. Insbesondere profitieren Applikationen um so mehr von Daedalus, je länger die Daten gespeichert bleiben. Werden die Daten zu häufig verändert, so sind andere Verteilungsmechanismen, etwa ein Multicast, zweckmäßiger. Da das Verändern von Daten vergleichsweise viel Zeit in Anspruch nimmt, ist es sinnvoll die Daten so zu strukturieren, dass Veränderungen selten und nur von wenigen Knoten aus erfolgen. Optimierungspotential besteht in den Nachrichtenpaketen, die gegenwärtig etwas größer sind, als unbedingt nötig. Darüber hinaus kann besonders für große Gruppen eine Veränderung der Parameter wie Fraktionsgröße und der Mindestmehrheiten eine Steigerung der Performanz erreicht werden. Weitergehend ist ein Verzicht auf das Locking bei manchen Daten denkbar, was eine Performanzsteigerung um den Faktor drei zur Folge haben kann. Dies kann jedoch zu Dateninkonsistenzen führen, die durch andere Schichten abgefangen werden müssen. Da der Datenoverhead von Daedalus und JXTA unabhängig von der Größe des Datenobjektes ist, empfiehlt es sich, Daten zusammenzufassen und größere Datenobjekte in Daedalus zu speichern. So liegt der Datenoverhead für das Verändern eines ein MByte großen Datenobjektes unter 2%. 46 6 Die Implementation 6.1 MagicMap als Umgebung Das in dieser Arbeit vorgestellte Peer-to-Peer-Shared-Memory-System wurde als Proof-of-Concept für das MagicMap-Projekt [19] implementiert. Bei MagicMap handelt es sich um eine Anwendung, die mi�els Signalstärkemessungen von WLAN-Geräten die Position eines PDAs oder ähnlichen mobilen Geräten ermittelt. Ist die Position bekannt, wird diese in Karten dargestellt. Ziel dieses Projektes ist es, positionsbasierte Dienste und die Suche nach Geräten, beziehungsweise den dazugehörigen Personen, anzubieten. Die Positionen und Karten werden bisher durch einen Webservice gespeichert und verwaltet, der auf einem zentralen Server läu�. Es zeichnet sich jedoch ab, dass diese Lösung den zu erwartenden Anforderungen nicht genügen wird. Bereits bei einer relativ geringen Belastung betrug die Antwortzeit des Servers mehrere Minuten. Da eine Veröffentlichung der Technik und der So�ware in der Zeitschri� c’t [9] geplant ist, ist mit sehr vielen Anfragen zu rechnen, die der Server in keiner vertretbaren Zeit beantworten könnte. Die Abbildung 6.1 zeigt die MagicMap-Architektur, den Beitrag dieser Arbeit stellen die gelb gezeichneten Schni�stellen und die hellblau gezeichneten Zylinder dar. MagicMap-Knoten messen selbständig die WLAN-Signalstärken von anderen Geräten und übermi�eln diese Werte an den Server. Ein Knoten, der die Position eines anderen Gerätes ermi�eln möchte, fragt den Server nach allen Messwerten zu diesem Gerät und kann anhand der Daten die Position berechnen. Aufgrund des Szenarios lassen sich einige Aussagen bezüglich der teilnehmenden Geräte treffen, die die hohen Anforderungen des im vorherigen Kapitel vorgestellten Verfahrens vereinfachen. So ist jede Ressource nur für eine kleine Zahl von Peers interessant, so wird die Gruppengröße in der Regel deutlich unter hundert Peers liegen. Die Peers werden zwar weiterhin relativ kurz aktiv sein, jedoch signifikant länger, als bei dem Beispiel des mobilen Kalendereintrages. Dadurch, dass die PDAs ihre Position anhand von WLAN-Signalstärken bestimmen, kann mit einer hohen Wahrscheinlichkeit gerechnet werden, dass sie über WLAN ebenfalls kommunizieren werden. Dies ist natürlich nicht garantiert, da zur Positionsbestimmung nur das Messen nötig ist, ein Zugang zu dem WLAN-Netz muss nicht gegeben sein. Da jedoch ausreichend über einen WLAN-Zugang verfügen werden, sind diese Ausnahmen kein Problem für das System. Da das Ziel von MagicMap die Ermöglichung von positionsbasierten Dienstleistungen ist, ist es auch wahrscheinlich, dass genügend dauerha� verfügbare Peers teilnehmen, so dass die Kontinuität von Daten gewährleistet werden kann. 47 Abbildung 6.1: Die MagicMap-Architektur Neben dem veränderten Speichern hat ein Peer-to-Peer-Ansatz für MagicMap auch Folgen für die Berechnung der Daten. Eine einfache Lösung, bei der alle Knoten die Positionen von den Knoten berechnen, die sie interessieren, ist problematisch. Ein Knoten würde dazu in einer Vielzahl von Gruppen teilnehmen und viele Datenobjekte auswerten. Zudem entsteht durch das vielfältige Berechnen einer einzelnen Position ein hohes Maß an Redundanz, ohne dass dadurch die Positionsberechnung verbessert wird, wenn die Ergebnisse nicht kommuniziert werden. Deswegen sollen die Positionsberechnungen von einigen, leistungsstarken Knoten erfolgen und dann in Daedalus veröffentlich werden, so dass alle anderen Knoten die Position erfahren können. In Abbildung 6.2 wird der Knoten B von den beiden Knoten C und D vermessen. Der Knoten A berechnet anhand der Messwerte dieser Knoten nun die Position und veröffentlicht sie in Daedalus. 48 A B C D E measures calculates Abbildung 6.2: Verteiltes Messen und Berechnen in MagicMap. Die Messwerte der Knoten C und D werden von A benötigt um die Position von B zu bestimmen. 6.2 Schni�stelle zu MagicMap MagicMap ist modular aufgebaut, das heißt, dass jedes Modul eine Aufgabe übernimmt und jedes dieser Module prinzipiell durch andere ersetzt oder auf es komple� verzichtet werden kann. Dies hat den Vorteil, dass auf einem Gerät nur die Module installiert werden müssen, die auch tatsächlich benötigt werden. Ist kein GPS-Empfänger installiert, so wird dieses Modul nicht benötigt und ist keine Ausgabemöglichkeit vorgesehen, so muss die Visualisierung mi�els Karten nicht vorhanden sein. Dies hat jedoch zur Folge, dass eine Vielzahl von Prozessen die Funktionalität von Daedalus in Anspruch nimmt. Hier bieten sich nun zwei prinzipiell verschiedene Ansätze an, jedes Modul mit der Schni�stelle auszusta�en. Zum einen kann das Shared-Memory-System als Bibliothek statisch oder dynamisch mit jedem Modul verlinkt werden. Der große Nachteil dieser Vorgehensweise liegt im Verlust der Flexibilität. Jedes Modul ist dann auf die Verwendung dieses Shared-Memory-Systems angewiesen und kann nur mit großem Aufwand andere Speichertechniken nutzen. Zudem schränkt dieser Ansatz die möglichen Programmiersprachen für die Entwicklung von Modulen ein. Durch das statische Linken würden darüber hinaus deutlich mehr Ressourcen benötigt werden, da mehrere Instanzen gleichzeitig laufen müssen. Ein anderer Ansatz, und der in diesem Fall gewählte, implementiert das SharedMemory-System als eigenes Modul. Auf jedem Gerät läu� dieses Modul als eigenständiger Prozess und kommuniziert mit den anderen Modulen per UDP. Der Vorteil dieser Lösung ist, dass sie keinerlei Annahmen und Einschränkungen über andere Module machen muss. Die Wahl von UDP als Kommunikationsprotokoll ist zum einen in der bisherigen serverzentrierten Shared-Memory-Infrastruktur begründet. Zum anderen entspricht sie auch pragmatischen Anforderungen. So wäre eine Implementierung als Webservice prinzipiell denkbar, jedoch erscheint der zusätzliche Ressourcenbedarf in keiner Relation zum möglichen Gewinn an 49 Flexibilität zu stehen, da die primäre Pla�form für MagicMap PDAs sind. Da diese Schni�stelle von mehreren anderen Modulen gleichzeitig genutzt werden kann, ergeben sich hohe Anforderungen an diese Schni�stelle, die, wenn sie vollständig erfüllt werden sollen, auf die parallele Nutzung von mehreren SharedMemory-Instanzen hinführen. So würden zwei Lockanforderungen von verschiedenen Modulen für die gleiche Ressource bedeuten, dass ein Endpunkt des JXTA-Netzwerkes mit zwei verschiedenen IDs diese Anfragen versendet. Es zeigt sich jedoch, dass dieses hohe Maß an Parallelität, die nur durch parallel laufende JXTA-Endpunkte erreichbar ist, in der Praxis von MagicMap nicht nötig ist. Es kann davon ausgegangen werden, dass zwei Module nicht die gleichen Ressourcen verändern wollen, da ein WLAN-Positionierungsmodul nur die Positionen von anderen WLAN-Geräten, ein GPS-Modul nur die eigene Position bestimmen kann. Um jedoch diesen Fall nicht vollkommen ausschließen zu müssen, bietet die Schni�stelle neben den Funktionen von Daedalus noch weitere Funktionen an, die den Wert einer bestimmen Ressource ändern. Einem Modul, das auf Daedalus au�auen will, stehen folgende Funktionen zur Verfügung. „Get" ermi�elt den aktuellen Wert einer Ressource, das Shared-Memory-Modul antwortet mit diesem Wert oder einem Fehler, wenn diese Ressource noch keinen Wert enthält oder keine Verbindung zum JXTA-Netzwerk besteht. Mit „Lock" kann das Modul eine Ressource sichern, um sie mit „Set" zu verändern, mit „Release" wird diese Ressource wieder freigegeben, siehe Abbildung 6.3. Mit den Aufrufen „Minresult" und „Timeout" können die Werte für die Mindestzahl von Suchergebnissen, nach dem das Modul informiert wird, und die Zeit, die auf eine Antwort im JXTA-Netz gewartet wird, festgelegt werden. Mit „Search" kann eine Suche nach einer JXTA-Gruppe oder einem Peer gestartet werden. Wurde die Mindestzahl von Gruppen oder Peers gefunden, wird das Modul mit einer UDPNachricht informiert. Möchte das Modul nicht so lange warten, kann es auch jeder Zeit mit „Results" die Liste der aktuell gefundenen Gruppen und Peers erfragen. Damit ein hierarchischer Positionierungsbaum erstellt und verwaltet werden kann, existieren die Aufrufe „Join" und „Leave" um einer Gruppe beizutreten oder eine Gruppe zuverlassen. Damit ein Modul eine Ressource verändern kann, ohne dass sie sich um das Sichern und Freigeben der Ressource kümmern muss, ermöglicht es die Funktion „Update" Modulen, die unabhängig von dem Wert der Ressource diese verändern wollen, dies zu tun. 50 DSM Modul MagicMap Position ermitteln Get Ressource ermitteln JXTA-Gruppe Hello Welcome Request Resource Got Ressource sichern Lock Position verändern Locked Get Got Set Release Anfrage aus dem Cache beantworten Ressource veröffentlichen und freigeben MutexRequset MutexResponce Resource ValidationReq. Validation MutexRelease ValidationReq. Validation Abbildung 6.3: Die Interaktion von MagicMap, DSM-Modul und der JXTAGruppe, die für die Ressource zuständig ist 6.3 Clustering der Daten Es reicht nicht, einzig die Serverkommunikation mit der Peer-to-Peer-Schni�stelle zu ersetzen, vielmehr ist es nötig, die einzelnen Daten zu analysieren und zu gruppieren. Würde für jeden Messwert ein neues Datenobjekt erzeugt werden, so entstünde ein erheblicher Overhead für die Verwaltung, zudem wäre die Zahl der Knoten in der entsprechenden Gruppe sehr klein, sodass es leicht zu Datenverlust kommen kann, wenn diese Knoten das Netzwerk verlassen. Für die Gruppierung der Messwerte ergeben sich zwei Möglichkeiten, zum einen können alle Messwerte zu einem Gerät in einem Datenobjekt gespeichert werden oder alle Messwerte eines Gerätes. Speichert man alle Werte zu einem Gerät in einem Objekt, so vereinfacht dies die Ermi�lung der Position, weil nur ein einziges Objekt abzufragen ist. Jedoch müssen in diesem Fall mehrere Knoten schreibend auf dieses Objekt zugreifen. Da die gewünschte Aktualisierungsrate von 10 Sekunden selbst bei realistischen Knotenzahlen nicht mehr eingehalten werden kann, muss diese Möglichkeit ausgeschlossen werden. Die Alternativvariante, alle Messwerte, die ein Gerät ermi�elt, in einem Datenobjekt zu speichern, hat den Vorteil, dass für dieses Objekt kein Lockingmechanismus nötig ist. Hier stellt sich jedoch das Problem, dass ein Knoten, der eine Position ermi�eln möchte, nicht feststellen kann, auf welche Datenobjekte er zugreifen muss, um alle Messwerte zu erhalten. So ist es nötig, dass jeder Knoten, der die Signalstärke eines Gerätes gemessen hat, sich in eine Liste einträgt, die der rechnende Knoten auslesen und so alle Datenobjekte ermi�eln kann. Für dieses Datenobjekt ist jedoch ein Lockingmechanismus nötig, weil mehrere Knoten sich 51 parallel in die Liste ein- oder austragen könnten. Anders als bei dem Locking des Messwerte-Datenobjektes ist hier mit keiner hohen Aktualisierungsrate zu rechnen und veraltete Einträge verfälschen das Ergebnis nicht. Neben den beiden Datenobjekten kommt noch ein weiteres hinzu, in dem die berechnete Position eines Gerätes gespeichert wird. Bei diesem Objekt kann es ebenfalls zu konkurrierenden Schreibvorgängen kommen, wenn die Position redundant von mehreren Knoten berechnet werden soll. In der Abbildung 6.4 ist der Au�au dieser Datenobjekte an einem Beispiel dargestellt. Das Objekt „MagicMapx-Position“ enthält die berechnete Position des Gerätes x. „MagicMap-x-Sense“ enthält alle Messwerte von x und „MagicMap-x-See“ enthält alle Knoten, die ein Signal vom Gerät x empfangen können. ���������������� �� ������� ���������� �������� �� ������� ���������� �������� �������������� � � � ������������������� �� ���������� ���������� ���������� �������� �� ���������� ���������� ���������� �������� Abbildung 6.4: Datenobjekte für MagicMap 6.4 Daedalus als MagicMap-Modul Wird die MagicMap-Applikation gestartet, so verbindet sie sich mit dem JXTANetzwerk. Dazu wird versucht, mit einem Rendezvous-Peer Kontakt aufzunehmen. Dieser Vorgang kann unter Umständen sehr lange dauern, ist keiner dieser Rendezvous-Peers in unmi�elbarer Nähe, dauert dies im Durchschni� über zehn Sekunden. Ein Verzicht auf eine Verbindung zum Rendezvous-Peer würde mit sehr hoher Wahrscheinlichkeit bedeuten, dass dieser Peer nicht mit anderen kommunizieren kann. Es ist also von Vorteil, wenn Geräte, die an diesem System teilnehmen und längere Zeit erreichbar sein werden, selber als Rendezvous-Peer agieren. 52 JXTA "NetGroup" "HU_ROK_DistributedSharedMemoryGroup" "MagicMap-Position-AA:00:B7:EF:A9:23"-Gruppe "MagicMap-Map-Berlin-Adlershof"-Gruppe "MagicMap-Position-6C:15:70:AB:09:99"-Gruppe "MagicMap-Map-Berlin-Mitte"-Gruppe "HU_ROK_MagicMap"-Gruppe "Europe"-Gruppe "Germany"-Gruppe "Berlin"-Gruppe Abbildung 6.5: Beispielha�e Gruppenhierarchie Nachdem die Verbindung aufgebaut wurde, tri� der Peer nun der Gruppe „HU_ROK_DistributedSharedMemoryGroup" bei. Diese Gruppe bildet die Basis für alle Ressourcegruppen, die Untergruppen von dieser sein werden. Da jeder Peer, der an Daedalus teilnimmt, Mitglied dieser Gruppe sein muss, bietet sich die Gruppe an, um in ihr nach anderen Peers zu suchen. Beispielsweise kann man nach Freunden suchen, wenn man den Namen ihres Peers kennt. Neben der Suche nach anderen Teilnehmern ermöglicht die flache Einordnung sämtlicher Ressourcen unter dieser Gruppe auch eine gezielte Suche anhand des Ressourcennamens oder Teilen davon. Zusätzlich tri� er noch der Gruppe „HU_ROK_MagicMap" bei. Diese ist die Wurzel für eine hierarchische Gruppenstruktur, die die Welt beschreibt, wie sie exemplarisch in Abbildung 6.5 zu sehen ist. Jetzt wird die Applikation die Position des Gerätes erfahren wollen, dazu liest sie die Ressource „MagicMap-x-Position" aus, wobei x für die MAC-Adresse des WLAN-Modules des Gerätes steht. Dazu wird der Gruppe gleichen Namens unterhalb der Basisgruppe beigetreten. Jede Gruppe verfügt über eine Broadcastkanal. Jeder kann an diesen Kanal Nachrichten senden, die dann alle Manager der Gruppe empfangen. An diesen Kanal schickt nun der neue Peer ein Hello-Paket, siehe Abbildung 6.6. Das Hello-Paket enthält die ID des Peers und seine Geräteklasse. Dabei steht eine Null für ein sehr leistungsschwaches Gerät mit schlechter Anbindung, eine Drei dagegen für einen sehr leistungsfähigen Peer mit einer Breitbandleitung. 53 <?xml version="1.0"?> <!DOCTYPE DSM-PacketType> <DSM-PacketType> <hello> <from> urn:jxta:uuid-59616261646162614A787 46150325033FABA1D93F26A4E69B058CA90 B963F41D03 </from> <class> 2 </class> </hello> </DSM-PacketType> Abbildung 6.6: Das Hello-Paket Erhält ein Peer ein Hello-Paket, so erhöht er zunächst seine Zähler für Mitglieder und Manager und überprü� danach, ob er diesem Paket antworten muss. Ist dies der Fall, so schickt er ein Welcome-Paket, siehe Abbildung 6.7, an den Absender des Hello-Pakets. Die Felder „manager_count" und „member_count" geben dabei Auskun� über die gegenwärtige Zahl von Managern und Mitgliedern. Erhält ein Peer auf ein Hello-Paket mehrere, divergierende Angaben zu den Zahlen, so speichert er den ersten ihn erreichenden Wert und ändert diesen nur um höchstens fünf Prozent pro weiterer Nachricht. Dieses Vorgehen verhindert, dass ein falsch informierter Manager andere in die Irre führen kann, da aber keine exakte Kenntnis der Größen notwendig ist, muss so nicht bis zum Eintreffen einer Mindestzahl von Antworten gewartet werden. Neben diesen Zahlen werden noch eine Reihe von IDs von Managern übermi�elt, diese speichert der neu hinzugekommene Peer, um später Anfragen an diese Peers zu stellen. Schließlich existiert noch das Feld „mutex", das, wenn ein Peer über das Schreibrecht gegenwärtig verfügt, seine ID enthält. Hat gegenwärtig kein Peer das Schreibrecht, so wird dieses Feld nicht übermi�elt. Erhält ein Peer auf sein Hello-Paket hin keine Antwort, so bedeutet dies, dass die Gruppe leer ist, es zumindest keine aktiven Teilnehmer gibt. In diesem Fall hat kein anderer Peer seine Position für ihn bestimmt. Hat er aber selber andere WLANGeräte orten können, so liest er deren Position anhand der auf ihre MAC-Adresse passende Ressource aus. Hat der Peer jedoch eine oder mehrere Welcome-Nachrichten erhalten, so sucht er sich aus der Managerliste drei Manager aus, die er mit einem Request-Paket, siehe Abbildung 6.8, um die Ressource bi�et. Dabei übermi�elt er neben seiner ID 54 noch den Namen der Ressource. Wenn ein Peer dieses Request-Paket empfängt, so überprü� er zunächst ob er überhaupt über die Ressource verfügt. Ist dies der Fall, so übermi�elt er sie an den Absender des Request-Paketes mi�els eines Resource-Paketes, siehe Abbildung 6.9, wobei neben dem Namen der Ressource, die Versionsnummer, die ID des Autors der Version im Feld „from", die Uhrzeit, zu der diese Version erstellt wurde im Feld „date", die eigentliche Ressource im Feld „value" und schließlich noch seine eigene ID im Feld „sender". Letzteres ermöglicht dem Anfragesteller festzustellen, welche Master noch antworten. <?xml version="1.0"?> <!DOCTYPE DSM-PacketType> <DSM-PacketType> <welcome> <manager_count>2</manager_count> <member_count>10</member_count> <manager> urn:jxta:uuid-59616261646162614A78 746150325033FABA1D93F26A4E69B058CA 90B963F41D03 </manager> <manager> urn:jxta:uuid-59616255646162614868 74AC503250AB85B70D93F26A4009B0577A 90B963F4C603 </manager> <mutex> urn:jxta:uuid-5961625564616261486874AC 503250AB85B70D93F26A4009B0577A90B963F4 C603 </mutex> </welcome> </DSM-PacketType> Abbildung 6.7: Das Welcome-Paket Hat der Peer nun auch die Ressource erhalten, so kann er zunächst überprüfen, ob genügend Manager vorhanden sind und in diesem Fall den Status selber ablegen, wenn seine Mindestverweilzeit abgelaufen ist. Diese Mindestverweilzeit berechnet sich wie folgt: die Geräteklasse mal zwei Minuten minus 20 Sekunden pro Gruppe, in der dieser Peer bereits Manager ist, plus den letzten drei Stellen der ID des Peer als Millisekunden. Diese Berechnung sorgt dafür, dass leistungsschwache Geräte so schnell wie möglich den Managerposten aufgeben können. 55 Zudem muss die Auslastung eines Knotens berücksichtigt werden, da auch ein ansonsten leistungsstarker Peer nur in einer bestimmte Menge von Gruppen Manager sein kann, ohne dass die Last zu hoch werden würde. Der Einfluss der ID soll verhindern, dass nachdem die Managerzahl groß genug wurde, alle Geräte einer Klasse auf einmal diesen Posten verlassen. Will ein Peer nicht mehr Manager sein, so gibt er dies mit einer Bye-Nachricht, siehe Abbildung 6.10, bekannt. Wobei er neben seiner ID im Feld „from" noch über den Status Auskun� gibt, den er verlässt. Verlässt er den Managerstatus, bleibt aber noch in der Gruppe, so wird im „status"Feld „manager" angegeben. Empfängt ein Peer diese Bye-Nachricht, so passt er nur seine Zähler an und überprü� ob dieser Peer zuvor in seiner Managerliste war, in diesem Fall wird er aus der Liste gestrichen. Nun kann der Peer die empfangene Ressource auswerten. Die Daten geben dabei Auskun�, wer diese Position berechnet hat, welcher Pfad den Standort am genauesten beschreibt und welche Karte der Berechnende verwendet hat. Will nun seinerseits der Peer eine berechnete Position veröffentlichen, so tri� er zunächst der entsprechenden Gruppe, wie oben beschrieben, bei. Danach muss er das Schreibrecht erlangen, dies geschieht indem er ein Mutex-Paket an alle Manager verschickt. Mutex-Pakete werden für das Beantragen, der Freigabe verwendet. In Abbildung 6.11 ist ein Mutex-Paket für die Beantragung des Schreibrechts zu sehen, beim Freigeben wird sta� dem Feld „request" das Feld „release" verwendet. Analog das Feld „yield", wenn der Peer einem anderen den Vortri� gewähren möchte, indem er seinen Wunsch fallen lässt und nach kurzer Zeit erneut beantragt. In diesen Feldern wird die ID des Peers übermi�elt. <?xml version=”1.0”?> <!DOCTYPE DSM-PacketType> <DSM-PacketType> <request> <from> urn:jxta:uuid-59616255646162614868 74AC503250AB85B70D93F26A4009B0577A 90B963F4C603 </from> <name> test </name> </request> </DSM-PacketType> Abbildung 6.8: Das Request-Paket 56 <?xml version="1.0"?> <!DOCTYPE DSM-PacketType> <DSM-PacketType> <resource> <name>test</name> <version>12</vesion> <from> urn:jxta:uuid-59616255646162614868 74AC503250AB85B70D93F26A4009B0577A 90B963F4C603 </from> <date>10254848</date> <value>Test String</value> <sender> urn:jxta:uuid-59616255646162614868 74AC503250AB85B70D93F26A4009B0577A 90B963F4C603 </sender> </resource> </DSM-PacketType> Abbildung 6.9: Das Resource-Paket <?xml version=”1.0”?> <!DOCTYPE DSM-PacketType> <DSM-PacketType> <bye> <from> urn:jxta:uuid-59616255646162614868 74AC503250AB85B70D93F26A4009B0577A 90B963F4C603 </from> <status>manager</status> </bye> </DSM-PacketType> Abbildung 6.10: Das Bye-Paket 57 <?xml version=”1.0”?> <!DOCTYPE DSM-PacketType> <DSM-PacketType> <mutex> <request> urn:jxta:uuid-59616255646162614868 74AC503250AB85B70D93F26A4009B0577A 90B963F4C603 </request> </mutex> </DSM-PacketType> Abbildung 6.11: Das Mutex-Request-Paket Erhält ein Peer die Bi�e um das Schreibrecht, so vermerkt er diese in einer Queue. Danach überprü� er, ob er für die Beantwortung von Schreibrechtsanfragen zuständig ist. Ist dies der Fall, so sendet er ein Mutex-Response-Paket, siehe Abbildung 6.12, an alle Manager und den Antragsteller. Diese Nachricht enthält neben der ID des absendenden Managers, die ID des Peers, der in seiner Queue an erster Stelle steht. Alle anderen Manager und der Antragsteller sammeln diese Nachrichten und zählen die Stimmen, die jeder Peer bekommt. Erhält ein Peer zwei Dri�el der Stimmen, so erhält er das Schreibrecht. Erhält der Antragsteller keine Mehrheit und gleichzeitig auch kein anderer eine Zwei-Dri�el-Mehrheit, so schickt er mit dem Mutex-Paket eine Yield-Nachricht, worau�in alle Manager ihn von der Queue löschen und wieder hinten anstellen und so agieren als wäre es ein erneuter Request. Dadurch wird verhindert, dass sich zwei oder mehrere Schreibrechtswünsche gegenseitig blockieren. Wenn der Peer nun das Schreibrecht erlangt hat, sollte er zunächst Manager nach der aktuellen Fassung der Ressource bi�en, so er nicht selber Manager ist, und damit automatisch über die aktuelle Version verfügt. Danach kann er nun die Ressource entsprechend verändern und, wenn dies geschehen ist, an alle Manager mit einem Resource-Paket übermi�eln. Die Manager werden diese Ressource zunächst nicht sofort speichern. Vielmehr werden einige eine Anfrage an den Knoten schicken, der die Ressource gelockt hat. Dieses Validation-Request-Paket, siehe Abbildung 6.13, enthält in diesem Fall neben dem Absender im Feld „from" die Felder „node" und „hash". Dabei enthält „node" die ID des vermeintlichen Senders und „hash" enthält einen Hashwert auf die Ressource. Diese Angaben überprü� der Peer auf Korrektheit und übermi�elt das Ergebnis mit dem Validation-Paket, siehe Abbildung 6.14, an alle Manager. Wenn mindestens zwei Dri�el aller Anfragen positiv beantwortet wurden, wird diese neue Version von allen Managern als die aktuelle übernommen. Die Korrektheit wird bestätigt, indem das Feld „hash" auf „yes" gesetzt wird, „no" würde eine Inkorrektheit bedeuten. Damit ein Peer, der das Schreibrecht hat und abstürzt, nicht das gesamte System behindert, gilt dieses Schreibrecht nur für 20 Sekunden. 58 <?xml version=”1.0”?> <!DOCTYPE DSM-PacketType> <DSM-PacketType> <mutex_response> <from> urn:jxta:uuid-59616255646162614868 74AC503250AB85B70D93F26A4009B0577A 90B963F4C603 </from> <access_to> urn:jxta:uuid-59616255646162614868 74AC503250AB85B70D93F26A4009B0577A 90B963F4C603 </access_to> </mutex_response> </DSM-PacketType> Abbildung 6.12: Das Mutex-Response-Paket <?xml version="1.0"?> <!DOCTYPE DSM-PacketType> <DSM-PacketType> <validation_request> <from> urn:jxta:uuid-59616255646162614868 74AC503250AB85B70D93F26A4009B0577A 90B963F4C603 </from> <node>yes</node> </validation_request> </DSM-PacketType> Abbildung: 6.13: Das Validation-Request-Paket 59 <?xml version="1.0"?> <!DOCTYPE DSM-PacketType> <DSM-PacketType> <validation> <from> urn:jxta:uuid-59616255646162614868 74AC503250AB85B70D93F26A4009B0577A 90B963F4C603 </from> </validation> </DSM-PacketType> Abbildung 6.14: Das Validation-Paket Nachdem die Ressource erfolgreich verändert wurde, gibt der Peer nun sein Schreibrecht auf. Dies geschieht durch eine Mutex-Nachricht an alle Manager, wobei das Feld „release" seine ID enthält. Empfangen die Manager diese Nachricht, geben sie die Ressource noch nicht frei. Einige Manager werden dem Peer ein Validation-Request-Paket schicken, um die Echtheit der Nachricht zu überprüfen. Dabei wird analog zum Verfahren des Speicherns vorgegangen, sta� des Feldes „hash" wird nun aber das Feld „release" genutzt. <?xml version="1.0"?> <!DOCTYPE DSM-PacketType> <DSM-PacketType> <error> <from> urn:jxta:uuid-59616255646162614868 74AC503250AB85B70D93F26A4009B0577A 90B963F4C603 </from> <node> urn:jxta:uuid-77616228AA6BC2004854 787C5A52522B88470D93F26A4010B807A7 95E96309D303 </node> </error> </DSM-PacketType> Abbildung 6.15: Das Error-Paket Will der Peer die Gruppe verlassen, so gibt er dies mit dem Bye-Paket bekannt, dabei wird der Status auf „group" gesetzt. Hin und wieder kann es vorkommen, dass ein Peer ohne diese Nachricht verschicken zu können, die Gruppe verlässt. 60 Damit die Zähler für die Gruppengröße auch sinken können, wenn dies der Fall ist, verschicken Peers eine Error-Nachricht, siehe Abbildung 6.15, an alle Manager, wenn ein Peer nach einer gewissen Zeit nicht auf eine Anfrage geantwortet hat. Zudem kann es passieren, dass nach einer Zeit lang Inaktivität, ein Peer feststellen muss, dass alle seine Manager in der Liste nicht mehr erreichbar sind. In diesem Fall schickt er ein Manager-Request-Paket, siehe Abbildung 6.16, an alle Manager, welche ihm darau�in wie auf ein Hello-Paket antworten, nur dass sie ihrerseits keine Zähler verändern. <?xml version=”1.0”?> <!DOCTYPE DSM-PacketType> <DSM-PacketType> <manager_request> <from> urn:jxta:uuid-59616255646162614868 74AC503250AB85B70D93F26A4009B0577A 90B963F4C603 </from> </manager_request> </DSM-PacketType> Abbildung 6.16: Das Manager-Request-Paket 6.5 Alternative Lösungen Neben der hier vorgestellten Integrationsmöglichkeit bieten sich andere Lösungen an, wenn bestimmte Anforderungen an MagicMap gestellt werden. Durch den hohen Zeitaufwand für Schreibvorgänge in Daedalus kann es sinnvoll sein, Daten, die nur punktuell oder für eine sehr kurze Zeitspanne relevant sind, nicht zu speichern sondern an die Empfängerknoten direkt zu versenden. Für MagicMap kommt dies beispielsweise für die Signalstärkemessungen in Frage, die zum einen nur bis zur nächsten Messung Gültigkeit haben und die darüber hinaus nur für eine sehr kleine Zahl von Knoten relevant sind, sodass ein direktes Versenden der Daten performanter erfolgen kann. Der Nachteil einer solchen Lösung besteht darin, dass Knoten, die neu hinzukommen eine Zeit lang warten müssen, ehe sie Daten erhalten können. Wird die Aktualisierungsfrequenz jedoch so erhöht, dass die Zeit, die ein Knoten zur Erlangung eines Datenobjektes in Daedalus benötigt, vergleichbar ist, verschwindet dieser Nachteil. Eine solch hohe Updatefrequenz ist jedoch kaum von Daedalus leistbar, sodass hier eine Verteilungslösung zwingend wird. 61 In diesen Fällen wird ein Speichersystem wie Daedalus jedoch nicht überflüssig. Sta�dessen übernimmt es in diesem Szenario das Speichern der nötigen Verwaltungsinformationen. Denkbar wäre es, dass alle Berechnungsknoten, die sich für die Messerwerte eines bestimmten Knotens interessieren, dies in einem DaedalusDatenobjekt veröffentlichen. Somit kann jeder Knoten die Messwerte an genau die Knoten schicken, die sie gegenwärtig benötigen. Neben den Positionsdaten können noch weitere, für MagicMap wichtige, Daten gespeichert werden. In manchen Fällen kann es wünschenswert sein, dass bei Erreichen einer bestimmten Position oder beim Verlassen eines Gebietes eine Nachricht versendet wird. So könnte Alarm gegeben werden, wenn ein autonomes Fahrzeug den Arbeitsbereich verlässt. Die Information, welcher Knoten zu welchen Bedingungen informiert werden soll, kann dabei als Datenobjekt in Daedalus gespeichert und von anderen Knoten ausgewertet werden. Dadurch, dass diese Information nicht statisch bei einigen Knoten konfiguriert wurde, ist es möglich, kurzfristig und ohne großen Aufwand andere Überwachungen zu veranlassen. Neben einer solchen, auf Daedalus basierenden Lösung, ist es auch denkbar, alle Daten in MagicMap direkt zu versenden. Diese Lösung kann in einigen Fällen am performantesten sein, jedoch erfordert sie, dass die Konfiguration weitestgehend konstant bleibt. In geschlossenen Szenarien, wo dies der Fall und die Performanz das wichtigste Kriterium ist, ist ein Verzicht auf Daedalus oder andere Shared-Memory-Systeme sinnvoll. Schließlich bleibt die jetzige Situation, ein zentraler Server, als Option weiter erhalten. Diese Variante ist, so der Server ausreichend performant ist, die schnellste Lösung. Sie erfordert darüber hinaus weniger Leistung von den mobilen Knoten, als es verteilte Lösungen können. Der Nachteil liegt hierbei in der Unflexibilität. Neue Knoten können schnell zu einer Überlast des Server führen, und damit die Performanz verschlechtern oder hohe Kosten verursachen, wenn ein neuer Server benötigt wird. Die Möglichkeiten zeigen, dass hierbei ein Kompromiss zwischen Flexibilität und der Performanz gefunden werden muss. Je flexibler die Lösung gestaltet werden muss, desto mehr Rollen übernimmt ein verteiltes Speicher-System was zu einem Verlust an Performanz führt. Je mehr über das Szenario bekannt ist, in dem MagicMap eingesetzt werden soll, desto einfacher kann eine spezielle Lösung für genau dieses Szenario entworfen werden, das eine hohe Performanz bietet. Ist dieses Wissen jedoch nicht vorhanden, bietet sich Daedalus als Datenspeicher für die Selbstkonfiguration der Knoten an. 62 7 Zusammenfassung und Ausblick Ziel dieser Arbeit war der Entwurf eines Peer-to-Peer-Shared-Memory-Systems für Ubiquitous-Computing. Anders als bei bisherigen Peer-to-Peer-Shared-Memory-Systemen erforderte dies auf die besonderen Bedingungen von mobilen und eingebe�eten Geräten Rücksicht zu nehmen. Jedes Peer-to-Peer-System stellt bereits einen Kompromiss zwischen Zuverlässigkeit und Performanz dar. In diesem Fall kommt nun eine weitere Komponente hinzu, das Sparen von Ressourcen. Dabei ist es nicht notwendigerweise so, dass alle Geräte über die gleiche Beschränkung der Ressourcen verfügen. Diesen Umstand macht sich Daedalus zunutze, indem die teilnehmenden Geräte in verschiedene Klassen unterteilt werden, anhand deren ihre Ressourcen genutzt werden. Aufgrund der Klasseneinteilung kann Daedalus jedem Knoten gerade soviel Ressourcen abverlangen, dass das System funktionieren kann, ohne dabei die Ressourcen leistungsschwacher Geräte zu überfordern. So reicht die Bandbreite der möglichen Beteiligungsformen von einem reinen On-Demand-Verhalten bis hin zu einer Belastung, die vergleichbar mit der Belastungherkömmlicher Peerto-Peer-Systeme ist. Daedalus ist folglich nicht ausschließlich ein System für Ubiquitous-Computing, es eignet sich ebenso für gewöhnliche Netzwerkstrukturen. Dazu nimmt jeder Knoten einer Gruppe eine bestimmte Rolle ein, entweder agiert er aktiv als Manager oder passiv als regulärer Knoten. Je leistungsfähiger ein Knoten ist, desto höher ist die Wahrscheinlichkeit, dass dieser Knoten eine aktive Rolle übernimmt. Neben der Einteilung der Knoten in Klassen basiert Daedalus auf zwei weiteren Ideen. Zum einen der Gruppenstruktur und zum anderen dem stochastischen Locking. Jedes Datenobjekt ist genau einer Gruppe zugeordnet, die es speichert und verwaltet. Alle Knoten, die sich für dieses Datenobjekt interessieren, sind Mitglied in der Gruppe und nehmen je nach Leistungsklasse Verwaltungsaufgaben wahr oder agieren als Klient. Durch diese Unterteilung wird der Verwaltungs-Overhead reduziert. Die Last eines einzelnen Knotens ist nun nicht mehr von der Anzahl der Knoten im gesamten Daedalus-System abhängig, sondern einzig von der Zahl der Knoten in einer spezifischen Gruppe. Das stochastische Locking verhindert, dass durch gleichzeitige Schreibzugriffe Inkonsistenzen entstehen. Eine Locking-Anforderung wird hierbei nicht von allen Replikas beantwortet, sondern nur von einem kleinen Teil. Zudem ist es nicht nötig, dass alle Antworten auf diese Anfrage positiv ausfallen, eine Mehrheit genügt, um ein Datenobjekt zu sperren. Dabei stellt dieser Ansatz einen Kompromiss zwischen einem pessimistischen Ansatz, wie er etwa in Form des Lockings in Server-orientierten Distributed-Shared-Memory-Systemen zum Einsatz kommt, und einem optimistischen Ansatz, der nachträglichen Conflict-Resolution, das in einigen Peer-to-Peer-Shared-Memory-Systemen eingesetzt wird, dar. 63 Es zeigt sich, dass trotz des Au�aus auf einfache, unzuverlässige und ressourcenarme Geräte eine vergleichsweise hohe Verfügbarkeit erreicht werden kann, ohne die Performanz und die Skalierbarkeit zu stark zu beschränken. Dennoch eignet sich Daedalus weniger für besonders zeitkritische Anwendungen. So benötigt das Verändern eines Datenobjektes im Durchschni� 4 Sekunden, eine hohe Responsivität ist hingegen erst erreichbar, wenn dafür 7 Sekunden zur Verfügung stehen. In kleinen Gruppen kann dieser Wert jedoch deutlich unterschri�en werden und in größeren Gruppen nimmt er nicht zu. Durch die Zuweisung von verschiedenen Rollen an einzelne Knoten einer Gruppe ist es möglich, die Last von ressourcenarmen Geräten konstant zu halten, und somit unabhängig von der Gruppengröße. Die Last hängt nur von der Aktivität dieses Gerätes ab. Im Gegenzug dazu steigt die Last der Manager, also der Knoten, die über mehr Ressourcen verfügen, linear mit der Zahl der Gruppenmitglieder an. Anders als bei einigen anderen Lösungen ist sie aber unabhängig von der Zahl der Knoten im gesamten Netzwerk. Die Last, die durch den Nachrichtenverkehr in einer Gruppe entsteht, steigt dagegen sehr schnell, nämlich quadratisch, an. Da in den meisten Szenarien die Netzwerkinfrastruktur jedoch gut ausgebaut ist, stellt dies einen akzeptablen Kompromiss dar. Schließlich wird durch die eindeutige Zuordnung von Gruppe und Datenobjekt die Gruppengröße in den meisten Fällen klein sein, und nur in wenigen Ausnahmefällen auf tausend oder mehr Knoten ansteigen. Die Einbindung in MagicMap hat gezeigt, dass ein sorgsames Clustering der Daten nötig ist, wenn Daedalus effizient arbeiten soll. Um den Overhead zu reduzieren, der durch die Verwaltung der Datenobjekte entsteht, ist es nötig, verschiedene Daten in einem Datenobjekt zusammenzufassen. Darüber hinaus muss dafür Sorge getragen werden, dass zeitkritische Abläufe nicht durch Daedalus behindert werden. So war es nötig, die Zahl der schreibend auf ein Datenobjekt zugreifenden Knoten zu reduzieren. Daedalus bietet neben einem höheren Maß an Flexibilität für MagicMap-Szenarien eine deutlich bessere Skalierbarkeit als der bisherige Server. Da der Server für alle MagicMap-Knoten zuständig ist, steigt seine Last mit jedem neuen Knoten an. Die Last eines Daedalus-MagicMap-Knotens hingegen nimmt nicht zu, wenn neue Knoten hinzukommen. Neben MagicMap bieten sich noch eine Reihe von weiteren Einsatzmöglichkeiten für Daedalus an. Applikationen, die es Arbeitsgruppen ermöglichen zusammenzuarbeiten, können ihre Daten in Daedalus speichern und somit mobilen Nutzern zugänglich machen, ohne in eine Serverinfrastruktur zu investieren. OpenSource-Projekte, wie Wikipedia, können dieses System nutzen, wenn sie keine finanziellen Mi�el zum Betrieb eigener Server haben. In Katastrophengebieten, ohne Infrastruktur, kann Daedalus zum Austausch von Nachrichten und Statusinformationen dienen, um etwa jedem Helfer einen Überblick zu bieten. Daedalus bietet keinen Datenschutz und nur ein geringes Maß an Datenpersis- 64 tenz. Die Persistenz der Daten kann nur für stabile, große oder langsam schrumpfende Gruppen gewährleistet werden. Sinkt die Gruppengröße zu schnell, ist es nicht möglich das Datenobjekt auf andere Knoten zu kopieren. Ist eine Gruppe einmal leer, geht auch das dazugehörige Datenobjekt verloren. Um auch einen Schutz der Daten vor unrechtmäßigen Zugriffen zu schützen, sind mehrere Wege denkbar. So könnten die Daten auf Applikationsebene verschlüsselt werden, wodurch jedoch keine Sabotage der Daten verhindert werden kann. Auf der Basis von JXTA ist es denkbar, Beschränkungen auf Gruppeneintritte zu legen, dieses würde jedoch einen möglichen Verlust der Datenpersistenz zur Folge haben. 65 8. Literaturverzeichnis [1] K. ABERER, A. DATTA, M. HAUSWIRTH und R. SCHMIDT: Das P-Grid-Overlay- [2] G. ANTONIU, L. BOUGÉ und M. JAN: JuxMem: An Adaptive Supportive [3] G. ANTONIU, L. BOUGÉ und M. JAN: JuxMem: Weaving together the P2P and [4] G. ANTONIU, J.-F. DEVERGE und S. MONNET: Building Fault-Tolerant [5] G. ANTONIU, P. HATCHER, M. JAN UND D. NOBLET: Performance Evaluation of JXTA Communication Layers, in: Proc. Workshop on Global and Peer-to-Peer Computing (GP2PC 2005), Cardiff, UK, May 2005. [6] F. BAGCI, J. PETZOLD, W. TRUMLER und TH. UNGERER: Ubiquitous Mobile [7] M. Barborak, A. Dahbura, and M. Malek: The Consensus Problem in FaultTolerant Computing, in: ACM Computing Surveys, Vol. 25, No. 2, 171-220, June 1993 [8] ROBERT BECKER, FRANZISKA LIEBSCH, YANN-RUDOLF MICHEL und DANIEL MÜLLER: JXTA: Einführung und Überblick, unveröffentlicht, Netzwerk: Von einem einfachen Prinzip zu einem komplexen System, in: Datenbank Spektrum, 5. Jahrgang, He� 13, Mai 2005. Platform for Data Sharing on the Grid, in: Journal of Parallel and Distributed Computing Practices, 2005. DSM paradigms to enable a Grid Data-sharing Service, in: Kluwer Journal of Supercomputing, 2005. Consistency Protocols for an Adaptive Grid Data-Sharing Service, in: Proceedings ACM Workshop on Adaptive Grid Middleware (AGridM 2004), Antibes Juan-les-Pins, France, September 2004. Agent System in a P2P-Network, in: UbiSys-Workshop at the Fi�h Annual Conference on Ubiquitous Computing, Sea�le, Oktober 2003. Seminararbeit, Freie Universität Berlin 2004. [9] c’t: h�p://www.heise.de/ct/ [10] MIGUEL CASTRO und BARBARA LISKOV, Practical Byzantine Fault Tolerance, in: Proceedings of the Third Symposium on Operating Systems Design and Implementation, New Orleans, USA, Februar 1999. 66 [11] JOSH CATES, Robust and Efficient Data Management for a Distributed Hash Table, unveröffentlicht, Master’s thesis, Massachuse�s Institute of Technology, 2003. [12] Chord: h�p://pdos.csail.mit.edu/chord/ [13] IAN CLARKE, OSKAR SANDBERG, BRANDON WILEY und THEODORE W. HONG: Freenet: A Distributed Anonymous Information Storage and Retrieval System, in: Lecture Notes in Computer Science Bd. 2009 S. 46 ff, 2001. [14] ANWITAMAN DATTA, MANFRED HAUSWIRTH und KARL ABERER: Updates in Highly Unreliable, Replicated Peer-to-Peer Systems, in: Proceedings of the 23rd International Conference on Distributed Computing Systems, ICDCS2003, 2003. [15] Freenet: h�p://freenet.sourceforge.net/ [16] EMIR HALEPOVIC UND RALPH DETERS: JXTA Performace Study, in: IEEE Pacific Rim Conference on Communications, Computers and Signal Processing (PACRIM ’03), Victoria, B.C., Canada: IEEE Computer Society, Aug. 2003, pp. 149–154. [17] Heise Online: h�p://www.heise.de/ [18] TOBIAS HÜBNER und MARTIN SCHWEIGERT: WLAN-basierte Ortung mit MagicMap, unveröffenticht, Studienarbeit, Humboldt-Universität zu Berlin 2005. [19] PETER K. IBACH, TOBIAS HÜBNER und MARTIN SCHWEIGERT, MagicMap– Kooperative Positionsbestimmung über WLAN, Chaos Communication Congress, Berlin, 27.-29. Dezember 2004. [20] ICQ: h�p://www.icq.net [21] Ivy: h�p://pdos.csail.mit.edu/ivy/ [22] A. M. JOHNSON UND M. MALEK: Survey of So�ware Tools for Evaluating Reliability, Availability, and Serviceability, in: ACM Computing Surveys, 20 (4), 227-269, December 1988; translated and reprinted in Japanese, Kyoritsu Shuppan Co., Ltd., publisher, 1990 [23] JuxMem: h�p://juxmem.gforge.inria.fr/ 67 [24] JXTA: h�p://www.jxta.org/ [25] JXTA-Bench Projekt: h�p://bench.jxta.org/ [26] JXTA Protocol Specifications Project. Project JXTA v2.3.x: Protocol specification. Technical report, April 2005. h�p://spec.jxta.org/. [27] Kazaa: h�p://www.kazaa.com/ [28] JOHN D. KUBIATOWICZ: Extracting Guarantees from Chaos, in: Communications of the ACM, Bd. 46, Nr. 2, Februar 2003. [29] JOHN KUBIATOWICZ, DAVID BINDEL, YAN CHEN, STEVEN CZERWINSKI, PATRICK EATON, DENNIS GEELS, RAMAKRISHNA GUMMADI, SEAN RHEA, HAKIM WEATHERSPOON, WESTLEY WEIMER, CHRIS WELLS und BEN ZHAO: OceanStore: An Architecture for Global-Scale Persistent Storage, in: Proceedings of the Ninth international Conference on Architectural Support for Programming Languages and Operating Systems (ASPLOS 2000), November 2000. [30] JOHN KUBIATOWICZ, DAVID BINDEL, YAN CHEN, PATRICK EATON, DENNIS GEELS, RAMAKRISHNA GUMMADI, SEAN RHEA, HAKIM WEATHERSPOON, WESTLEY WEIMER, CHRIS WELLS und BEN ZHAO: OceanStore: An Extremely Wide-Area Storage System, in: U.C. Berkeley Technical Report UCB// CSD-00-1102, März 1999. [31] Jean-Claude Laprie und Karama Kanoun: So�ware Reliability and System Reliability, in Michael R. Lyu: So�ware Reliability Engineering. New York 1995: 27-69 [32] S.D.LIN, Q. LIAN, M. CHEN und Z. ZHANG: A Practical Distributed Mutual Exclusion Protocol in Dynamic Peer-to-Peer Systems, in: IPTPS04, 2004. [33] S. LODHA und A. D. KSHEMKALYANI: A Fair Distributed Mutual Exclusion Algorithm, in: IEEE Transactions on Parallel and Distributed Systems, Bd. 11(6), S. 537-549, Juni 2000. [34] MagicMap: h�p://www.informatik.hu-berlin.de/rok/MagicMap/ [35] Miroslaw Malek: Folien zu Dependability and Responsiveness Concepts, Measures and Models, In: Vorlesung Zuverlässige Systeme, Humboldt-Universität zu Berlin. Wintersemester 2002/2003 68 [36] MIROSLAW MALEK: Introduction to NOMADS, in: Computing Frontiers 2004, Ischia, Italy, April 2004. [37] A. MAUTHE UND D. HUTCHISON, Peer-to-Peer Computing: Systems, Concepts and Characteristics, in: Praxis in der Informationsverarbeitung & Kommunikation (PIK) Special Issue on Peer-to-Peer, 26(03/03), 2003. [38] N. MILANOVIC, J. RICHLING, M. MALEK: Lightweight Services for Embedded Systems, in: Proceedings of the 2nd IEEE Workshop on So�ware Technologies for Embedded and Ubiquitous Computing Systems (WSTFEUS 2004), Vienna, Austria, 2004. [39] ATHICHA MUTHITACHAROEN, ROBERT MORRIS, THOMER GIL und BENJIE CHEN: Ivy: A Read/Write Peer-to-peer File System, in: Proceedings of the 5th USENIX Symposium on Operating Systems Design and Implementation (OSDI ’02), 2002. [40] Napster: h�p://www.napster.com/ [41] OceanStore: h�p://oceanstore.cs.berkeley.edu/ [42] P-Grid: h�p://www.p-grid.org/ [43] SEAN RHEA, PATRICK EATON, DENNIS GEELS, HAKIM WEATHERSPOON, BEN ZHAO und JOHN KUBIATOWICZ: Pond: the OceanStore Prototype, in: Proceedings of the 2nd USENIX Conference on File and Storage Technologies (FAST ’03), März 2003. [44] STEFAN SAROIU, P. KRISHNA GUMMADI und STEVEN D. GRIBBLE: A Measurement Study of Peer-to-Peer File Sharing Systems, in: Proceedings of Multimedia Computing and Networking 2002 (MMCN’02), Januar 2002. [45] Seti@home: h�p://setiathome.ssl.berkeley.edu/ [46] BUJOR D. SILAGHI: Replication Techniques for Peer-to-Peer Networks, unveröffentlicht, Dissertation, University of Maryland 2003. [47] Slashdot: h�p://slashdot.org/ [48] ION STOICA, ROBERT MORRIS, DAVID LIBEN-NOWELL, DAVID KARGER, M. FRANS KAASHOEK, FRANK DABEK und HARI BALAKRISHNAN: Chord: A Scalable Peer-to-peer Lookup Service for Internet Applications, in: IEEE Transactions on Networking Bd. 11, Februar 2003. 69 [49] Tapestry: h�p://www.cs.ucsb.edu/~ravenben/tapestry/ [50] Ma�hias Werner: Responsivität: Ein konsensbasierter Ansatz. Magdeburg 2000 [51] Wikipedia: h�p://www.wikipedia.de/ [52] ZHENG ZHANG: The Power of DHT as a Logical Space, in: �dcs, Bd. 00, S. 325-331, Oktober 2004. [53] BEN Y. ZHAO, LING HUANG, JEREMY STRIBLING, SEAN C. RHEA, ANTHONY D. JOSEPH und JOHN D. KUBIATOWICZ, Tapestry: A Resilient Globalscale Overlay for Service Deployment, in: IEEE Journal on Selected Areas in Communications, Bd. 22, S. 41-53, Januar 2004. 70 Erklärung Hiermit erkläre ich, dass ich die vorliegende Arbeit selbstständig und ohne unerlaubte Hilfe verfasst habe. Alle verwendeten Quellen und Hilfsmi�el sind als solche aufgeführt. Darüber hinaus erkläre ich hiermit mein Einverständnis, dass die vorliegende Arbeit in der Bibliothek des Instituts für Informatik der Humboldt-Universität zu Berlin ausgestellt werden darf. Berlin, den 29. November 2005 Christian Keller 71