Chord: Difference between revisions
Line 42: | Line 42: | ||
== Skalierbare Suche == |
== Skalierbare Suche == |
||
[[Image:ChordFinger.jpg|thumb|right|250px]] |
[[Image:ChordFinger.jpg|thumb|right|250px]] |
||
Um die Suche effizienter gestalten zu können, |
Um die Suche effizienter gestalten zu können, sind weitere Informationen über den Chord-Ring nötig. Deshalb hat jeder Knoten zusätzlich eine Tabelle mit Verweisen auf ''m'' weitere Knoten, wobei ''m'' die Anzahl der Bits der verwendeten IDs ist. Diese Verweise werden in Chord ''Finger'' genannt. Die Tabelle heisst daher ''Fingertable'' |
||
Die ''Fingertable'' ist wie folgt augebaut:<br> |
Die ''Fingertable'' ist wie folgt augebaut:<br> |
||
Der ''i''-te Eintrag der Tabelle auf Knoten ''n'' zeigt auf den ersten Knoten, der auf ''n'' in einem Abstand von mindestens 2<sup>i-1</sup> folgt. |
Der ''i''-te Eintrag der Tabelle auf Knoten ''n'' zeigt auf den ersten Knoten, der auf ''n'' in einem Abstand von mindestens 2<sup>i-1</sup> folgt. Damit zeigt der letzte Eintrag der Tabelle auf einen Knoten, der mindestens eine halbe Umrundung des Chord-Rings entfernt liegt, der vorletzte auf einen Knoten, der mindestens eine viertel Umrundung entfernt ist, usw. Diese Eigenschaft sichert, dass die maximale Pfadlänge einer Suchanfrage ''O(log N)'' Hops beträgt, weil mit jedem Hop die Distanz zum Ziel halbiert werden kann. |
||
{| cellspacing="10" | |
{| cellspacing="10" | |
||
|- valign="top" | |
|- valign="top" | |
||
Line 72: | Line 72: | ||
|} |
|} |
||
|} |
|} |
||
Bei einer Suchanfrage an Knoten ''n'' nach Schlüssel ''k'' wird nun zunächst der nächstgelegene ''Vorgänger'' des Schlüssels gesucht, den Knoten ''n'' kennt. Dabei wird die ''Fingertable'' so lange von '''unten nach oben''' durchsucht, bis der erste Eintrag ''i'' gefunden wird, dessen Knoten '''nicht''' zwischen ''n'' und ''k'' liegt. Der Eintrag ''i+1'' ist damit der nächstgelegene Vorgänger von ''k'', den ''n'' kennt.<br> |
Bei einer Suchanfrage an Knoten ''n'' nach Schlüssel ''k'' wird nun zunächst der nächstgelegene ''Vorgänger'' des Schlüssels gesucht, den Knoten ''n'' kennt. Dabei wird die ''Fingertable'' so lange von '''unten nach oben''' durchsucht, bis der erste Eintrag ''i'' gefunden wird, dessen Knoten '''nicht''' zwischen ''n'' und ''k'' liegt. Der Eintrag ''i+1'' ist damit der nächstgelegene Vorgänger von ''k'', den ''n'' kennt. Die Suche wird dann mit Hilfe dieses Knotens fortgesetzt. Das wiederholt sich, bis der Knoten gefunden ist, dessen ''Successor'' für ''k'' zuständig ist.<br> |
||
Die Suche wird dann mit Hilfe dieses Knotens fortgesetzt. Das wiederholt sich, bis der Knoten gefunden ist, dessen ''Successor'' für ''k'' zuständig ist.<br> |
|||
Aufgrund des Aufbaus der ''Fingertable'' wird mit jeder Zeile, die in der Tabelle von unten nach oben weitergerückt wird, der Ring immer weiter halbiert. Der letzte Eintrag der Tabelle zeigt also auf einen Knoten der mindestens ½ · 2<sup>m</sup> von ''n'' entfernt ist, der vorletzte Eintrag auf einen Knoten der mindestens ¼ · 2<sup>m</sup> von ''n'' entfernt ist, usw. |
|||
<br style="clear:both" /> |
<br style="clear:both" /> |
||
Revision as of 15:20, 3 March 2006
Überblick
Chord ist ein einfaches, verteiltes Suchprotokoll für Peer-To-Peer Systeme, das Schlüssel auf Knoten abbildet. Dabei passt es sich effizient an Strukturveränderungen, wie das Ausfallen oder Hinzukommen von Knoten an und sichert die Funktionalität auch während dieser Anpassung.
Das Protokoll skaliert sowohl in Bezug auf Speicherbedarf, als auch in Bezug auf Kommunikationsaufwand logarithmisch zur Anzahl der Knoten im System.
Chord wird von der Parallel and Distributed Operating Systems Gruppe am MIT Laboratory for Computer Science entwickelt. Hier sind auch Dokumentationen zu den dort durchgeführten Experimenten und Benchmarks, sowie eine Referenzimplementierung erhältlich.
Aufbau von Chord
System Modell
- Lastbalanzierung
- Chord nutzt Consistent Hashing für eine hinreichend gleichmässige Verteilung der Schlüssel im System.
- Dezentralisierung
- Alle Knoten im System sind gleichberechtigt.
- Skalierbarkeit
- Eine Suche benötigt O(log N) Hops, wobei N die Anzahl aller Knoten im System ist.
- Verfügbarkeit
- Das System passt sich Strukturänderungen an, garantiert dabei aber, dass der für einen Schlüssel zuständige Knoten zu jeder Zeit gefunden wird.
- Flexible Namenswahl
- Es gibt keine Einschränkungen bezüglich der Struktur bzw. Gestalt der verwendeten Schlüssel.
Topologie
Jedem Knoten und Schlüssel wird eine m-Bit lange ID zugeordnet. Damit können sich maximal 2m Knoten im System befinden. Diese ID wird mittels einer Basishashfunktion, wie zum Beispiel SHA-1 (hier ist i.A. m=160) berechnet, indem die Hashfunktion auf die IP-Adresse des Knotens bzw. den Schlüssel selbst angewendet wird.
Die Knoten sind in einem Ring modulo 2m angeordnet. (Chord Ring)
Ein Schlüssel k wird dem Knoten n zugewiesen, dessen ID grösser oder gleich der ID des Schlüssels k ist. Dieser Knoten wird Successor Knoten von k genannt.
Chord bietet nun eine einzige Funktion: Finde den für einen gegebenen Schlüssel k zuständigen Knoten n. Chord bietet keine Funktionalität zur tatsächlichen Speicherung der Daten auf dem zuständigen Knoten.
Einfache Suche
Eine einfache Möglichkeit der Suche nach einem Knoten im Chord Ring, ist die lineare Suche. Jeder Knoten n kennt dabei nur seinen Nachfolgeknoten n' (Successor). Mehr Informationen sind nicht nötig. Wird nun eine Suchanfrage an einen Knoten gerichtet, prüft dieser, ob sein Nachfolgeknoten für den angefragten Schlüssel zuständig ist. Falls ja, ist die Suche beendet. Falls nicht, wird die Anfrage so lange an den jeweils nachfolgenden Knoten weitergereicht, bis das Ziel erreicht ist.
Diese Form der Suche ist zwar nicht besonders effizient, da die Länge des Suchpfades linear zur Anzahl der Knoten im System wächst. Aber sie kann jederzeit als Fallback-Variante dienen. Die minimale Vorraussetzung für die lineare Suche, dass jeder Knoten seinen Nachfolgeknoten kennt, ist damit auch die minimale Vorraussetzung für die Korrektheit des Chord Protokolls. |
Skalierbare Suche
Um die Suche effizienter gestalten zu können, sind weitere Informationen über den Chord-Ring nötig. Deshalb hat jeder Knoten zusätzlich eine Tabelle mit Verweisen auf m weitere Knoten, wobei m die Anzahl der Bits der verwendeten IDs ist. Diese Verweise werden in Chord Finger genannt. Die Tabelle heisst daher Fingertable
Die Fingertable ist wie folgt augebaut:
Der i-te Eintrag der Tabelle auf Knoten n zeigt auf den ersten Knoten, der auf n in einem Abstand von mindestens 2i-1 folgt. Damit zeigt der letzte Eintrag der Tabelle auf einen Knoten, der mindestens eine halbe Umrundung des Chord-Rings entfernt liegt, der vorletzte auf einen Knoten, der mindestens eine viertel Umrundung entfernt ist, usw. Diese Eigenschaft sichert, dass die maximale Pfadlänge einer Suchanfrage O(log N) Hops beträgt, weil mit jedem Hop die Distanz zum Ziel halbiert werden kann.
|
|
Bei einer Suchanfrage an Knoten n nach Schlüssel k wird nun zunächst der nächstgelegene Vorgänger des Schlüssels gesucht, den Knoten n kennt. Dabei wird die Fingertable so lange von unten nach oben durchsucht, bis der erste Eintrag i gefunden wird, dessen Knoten nicht zwischen n und k liegt. Der Eintrag i+1 ist damit der nächstgelegene Vorgänger von k, den n kennt. Die Suche wird dann mit Hilfe dieses Knotens fortgesetzt. Das wiederholt sich, bis der Knoten gefunden ist, dessen Successor für k zuständig ist.