Chord

Το Chord [14] είναι ένα δίκτυο ομότιμων κόμβων που προσφέρει ένα κλιμακούμενο πρωτόκολλο αναζήτησης υλοποιώντας τη διεπαφή του ΚΠΚ. Αυτό το πρωτόκολλο υποστηρίζει μία και μόνο λειτουργία: δοθέντος ενός κλειδιού, το αντιστοιχίζει σε έναν κόμβο του δικτύου. Ο τρόπος αυτής της αντιστοίχισης γίνεται ακολουθώντας μία παραλλαγή του συνεπή κατακερματισμού (consistent hashing). Η μέθοδος αυτή τείνει να εξισορροπεί το φορτίο κάθε κόμβου κατανέμωντας περίπου το ίδιο πλήθος κλειδιών σε αυτούς και επιπλέον περιλαμβάνει σχετικά μικρή μετακίνηση κλειδιών μεταξύ των κόμβων όταν κόμβοι προσχωρούν ή εγκαταλείπουν το σύστημα. Η συνεπής συνάρτηση κατακερματισμού που χρησιμοποιεί το Chord λειτουργεί ως εξής: αναθέτει σε κάθε κόμβο και κάθε κλειδί (που αντιπροσωπεύει ένα αντικείμενο δεδομένων) ένα αναγνωριστικό $ m$ -διφίων2.6 χρησιμοποιώντας μία βασική συνάρτηση κατακερματισμού, όπως η SHA-1 [10]. Επιπλέον, το $ m$ διαλέγεται σχετικά μεγάλο έτσι ώστε να αποφευχθεί η περίπτωση της ανάθεσης του ίδιου αναγνωριστικού σε δύο διαφορετικούς κόμβους. Για την περίπτωση των κόμβων, το αναγνωριστικό υπολογίζεται από τον κατακερματισμό της IP διεύθυνσής του, ενώ για την περίπτωση των κλειδιών πρώτα επιλέγεται ένα κατάλληλο κλειδί, το οποίο θα αντιστοιχεί σε ένα συγκεκριμένο αντικείμενο δεδομένων, και στη συνέχεια κατακερματίζεται. Για παράδειγμα, αν το Chord χρησιμοποιηθεί για την φιλοξενία μίας εφαρμογής διαμοιρασμού αρχείων, τότε ένα κατάλληλο κλειδί που θα ταυτοποιεί ένα πόρο (ένα αρχείο) μπορεί κάλλιστα να είναι το όνομα του. Αυτό θα αποτελέσει το κλειδί. Το αναγνωριστικό κλειδί θα υπολογιστεί από τον κατακερματισμό του κλειδιού αυτού.

Στη συνέχεια περιγράφεται ο τρόπος, σύμφωνα με τον οποίο υλοποιείται η αντιστοίχιση κλειδιών σε κόμβους. Τα αναγνωριστικά ταξινομούνται σε έναν ιδεατό δακτύλιο αναγνωριστικών modulo $ 2^m$ , δηλαδή από 0 έως $ 2^m - 1$ . Έστω ότι χρησιμοποιείται η συνάρτηση $ H$ ως συνάρτηση κατακερματισμού. Το κλειδί $ k$ ανατίθεται στον πρώτο κόμβο του οποίου το αναγνωριστικό είναι ίσο ή ακολουθεί το αναγνωριστικό κλειδί του κλειδιού $ k$ , $ H(k)$ . Αυτός ο κόμβος καλείται διάδοχος κόμβος (successor node) του κλειδιού $ k$ και συμβολίζεται ως $ successor(H(k))$ . Πιο περιγραφικά, αν τα αναγνωριστικά αναπαρίστανται με έναν κύκλο αριθμών από το 0 έως το $ 2^m - 1$ , τότε ο διάδοχος του αναγνωριστικού κλειδιού $ H(k)$ είναι ο πρώτος κόμβος μετά το $ H(k)$ κατά τη φορά των δεικτών του ρολογιού. Συχνά θα λέμε πως ο κόμβος με αναγνωριστικό αριθμό $ successor(H(k))$ είναι υπεύθυνος για το αναγνωριστικό κλειδί $ H(k)$ ή για το κλειδί $ k$ . Επομένως, εύκολα συμπεραίνεται πως ένας κόμβος $ successor(H(k))$ είναι υπεύθυνος για ένα σύνολο αναγνωριστικών κλειδιών.

Figure: Ο δακτύλιος αναγνωριστικών του Chord με m = 6.
Image chord_circle2

Στο Σχήμα 2.4, φαίνεται ένας δακτύλιος αναγνωριστικών με $ 64$ αναγνωριστικά $ (m = 6)$ . Ο δακτύλιος αποτελείται από $ 10$ μόλις κόμβους στους οποίους έχουν αποθηκευτεί, συνολικά, $ 5$ κλειδιά. Ο διάδοχος κόμβος του αναγνωριστικού κλειδιού $ 10$ είναι ο $ N14$ , επομένως το κλειδί $ 10$ θα αποθηκευτεί σε αυτόν τον κόμβο. Όμοια, τα αναγνωριστικά κλειδιά $ 24$ και $ 30$ θα αποθηκευτούν στον κόμβο $ N32$ , το $ 38$ στον κόμβο $ N38$ και το $ 54$ στον $ N56$ . Συνδυάζοντας τα παραπάνω με το παράδειγμα θα λέγαμε ότι ο κόμβος $ N14$ θα είναι υπεύθυνος για όλα τα αναγνωριστικά κλειδιά του διαστήματος $ (8, 14]$ , ο κόμβος $ N32$ για όλα τα κλειδιά του διαστήματος $ (21, 32]$ , ενώ ο $ N56$ για αυτά του $ (51, 56]$ .

Ο συνεπής κατακερματισμός είναι σχεδιασμένος έτσι ώστε να προκαλεί την ελάχιστη διαταραχή των κλειδιών κατά την προσχώρηση και αποχώρηση κόμβων από και προς το δίκτυο. Για την διατήρηση του συνεπή κατακερματισμού και της αντιστοίχισης των κλειδιών στις περιπτώσεις που ένας κόμβος $ n$ εισέρχεται στο δίκτυο, συγκεκριμένα κλειδιά που προηγουμένως είχαν ανατεθεί στον διάδοχο κόμβο του $ n$ τώρα ανατίθενται σε αυτόν. Αντίστοιχα, όταν ο κόμβος $ n$ εγκαταλείπει το δίκτυο, όλα τα κλειδιά που του είχαν ανατεθεί επαναανατίθενται στον διάδοχο του $ n$ . Καμία περαιτέρω αλλαγή δεν χρειάζεται να συμβεί όσο αφορά στην ανάθεση των κλειδιών στους κόμβους. Στο παραπάνω παράδειγμα, εάν ένας κόμβος προοριζόταν να προσχωρήσει στο δίκτυο με αναγνωριστικό $ 26$ , τότε θα συνελάμβανε το κλειδί με αναγνωριστικό $ 24$ από τον κόμβο $ N32$ .

Παρουσιάζοντας και καλύπτοντας το θέμα του καταμερισμού των αναγνωριστικών κλειδιών στους κόμβους του δικτύου υπεισέρχεται αυτομάτως το θέμα του εντοπισμού ενός συγκεκριμένου αναγνωριστικού κλειδιού και εύλογα εγείρεται το ερώτημα του ````πόσο αποτελεσματικά μπορεί να εντοπιστεί ένα συγκεκριμένο αναγνωριστικό κλειδί'''', όπου με τον όρο ````αποτελεσματικά'''' εννοείται η ταχύτητα εντοπισμού όσον αφορά στην πολυπλοκότητα χρόνου. Έχοντας ως γνώμονα το γεγονός του ότι σε ένα δίκτυο Chord κάθε κόμβος γνωρίζει τον διάδοχό του, μια ερώτηση για την εύρεση του κόμβου που είναι υπεύθυνος για το κλειδί $ k$ μπορεί να απαντηθεί σε $ O(N)$ βήματα, όπου $ N$ είναι το πλήθος των κόμβων του δικτύου. Για να βελτιωθεί αυτό το όριο, το σύστημα Chord διατηρεί σε κάθε κόμβο ένα ποσό πληροφορίας σχετικά με έναν συγκεκριμένο αριθμό κόμβων του δικτύου. Αυτή η πληροφορία είναι οργανωμένη στην δομή που αναφέρθηκε προηγουμένως ως πίνακας δρομολόγησης και στο Chord ονομάζεται πίνακας δεικτών (finger table). Κάθε τέτοιος πίνακας περιέχει το πολύ $ m$ εγγραφές. Κάθε εγγραφή $ i$ στον πίνακα δεικτών του κόμβου $ n$ περιέχει πληροφορίες, όπως την IP διεύθυνση και το αναγνωριστικό, του πρώτου κόμβου $ s$ που διαδέχεται τον $ n$ κατά τουλάχιστον $ 2^{i - 1}$ στο δακτύλιο των αναγνωριστικών κλειδιών. Δηλαδή, ο $ s$ είναι ο διάδοχος του κόμβου $ H(n) + 2^{i - 1}$ , για $ 1 \leq i \leq m$ , ενώ όλες οι αριθμητικές πράξεις υπολογίζονται βάσει modulo $ 2^m$ . Ένας τέτοιος κόμβος, $ s$ , αναφέρεται ως ο $ i$ -οστός δείκτης (finger) του κόμβου $ n$ . Σημειώνεται, ότι ο πρώτος δείκτης ενός κόμβου $ n$ είναι ο διάδοχός του. Σύμφωνα με την αριθμητική σχέση του κόμβου $ n$ και των δεικτών του, κάθε δείκτης $ i$ βρίσκεται σε διπλάσια απόσταση από την απόσταση του $ i - 1$ δείκτη από τον κόμβο $ n$ . Έτσι είναι εμφανές ότι με αυτή την τεχνική η αναζήτηση ενός κόμβου που είναι υπεύθυνος για ένα συγκεκριμένο κλειδί $ k$ μπορεί να επιταχυνθεί σημαντικά. Για να ποσοτικοποιήσουμε αυτόν τον ισχυρισμό μπορούμε να αναφέρουμε ότι εάν οι πίνακες δεικτών έχουν μέγεθος $ m = O(logN)$ , τότε η εύρεση του διαδόχου του κόμβου $ n$ μπορεί να γίνει με μεγάλη πιθανότητα σε $ O(logN)$ βήματα. Η φράση ````με μεγάλη πιθανότητα'''' επιδέχεται αρκετή συζήτηση η οποία μπορεί να βρεθεί στο [14]. Ένα στιγμιότυπο του πίνακα δεικτών ενός κόμβου του συστήματος Chord υπάρχει στο Σχήμα 2.5.

Figure: Παράδειγμα του πίνακα δεικτών του κόμβου N8 του συστήματος Chord με m = 6.
Image chord_finger_table

Μέχρι αυτού του σημείου έχουν καλυφθεί οι δύο από τις τρεις διαδικασίες που μία υλοποίηση ενός ΚΠΚ πρέπει να υλοποιεί και να προσφέρει, όπως αυτές αναφέρθηκαν στην προηγούμενη υποενότητα -- Κατηγοριοποίηση Κατανεμημένων Πινάκων Κατακερματισμού. Στη συνέχεια ακολουθεί η τεχνική που ακολουθεί το Chord σχετικά με τον τρόπο διαχείρισης και αντιμετώπισης της δυναμικότητας του δικτύου.

Για την απλοποίηση των αφίξεων και των αναχωρήσεων, κάθε κόμβος $ n$ διατηρεί έναν δείκτη στον προκάτοχό του (predecessor), δηλαδή στον πρώτο κόμβο με αντίθετη φορά από αυτή του ρολογιού στο δακτύλιο αναγνωριστικών ξεκινώντας από τον $ n$ . Και σε αυτή την περίπτωση οι πληροφορίες που αποθηκεύονται σχετικά με αυτόν τον κόμβο είναι η IP διεύθυνσή του και το αναγνωριστικό του. Όταν ένας κόμβος $ n$ θελήσει να συνδεθεί σε ένα δίκτυο Chord βρίσκει έναν κόμβο $ n'$ , που είναι ήδη συνδεδεμένος σε αυτό, χρησιμοποιώντας κάποιο εξωτερικό μέσο (από ένα δικτυακό τόπο με ασφαλή και περιορισμένη πρόσβαση που διατηρεί τέτοιου είδους πληροφορία) και κατόπιν ζητάει από αυτόν να τον βοηθήσει στην εύρεση της θέσης του μέσα στο δίκτυο εντοπίζοντας τον διάδοχο του [15]. Για την συντήρηση του πίνακα δεικτών, κάθε κόμβος εκτελεί περιοδικά έναν αλγόριθμο σταθεροποίησης (stabilization algorithm) για να ενημερωθεί για τους κόμβους που έχουν πρόσφατα συνδεθεί στο δίκτυο. Σύμφωνα με αυτό το πρωτόκολλο, ένας κόμβος $ n$ ζητάει από τον διάδοχό του να του πει τον προκάτοχό του, $ p$ . Αν ο $ p$ είναι διαφορετικός από τον $ n$ , τότε σημαίνει ότι ο $ p$ είναι ένας νεο-εισερχόμενος κόμβος και πρέπει να γίνει ο διάδοχος του $ n$ . Επιπλέον, κάθε κόμβος εκτελεί περιοδικά δύο επιπλέον αλγόριθμους για να ελέγξει ότι ο πίνακας δεικτών και ο δείκτης στον προκάτοχό του είναι έγκυροι [15]. Αποδεικνύεται ότι αν οι δείκτες στους διαδόχους των κόμβων είναι σωστοί και ο χρόνος που χρειάζεται για την διόρθωση των πινάκων δεικτών είναι λιγότερος από το χρόνο που χρειάζεται για να διπλασιαστεί το δίκτυο σε μέγεθος, οι επερωτήσεις εντοπισμού ενός κλειδιού $ k$ μπορούν να απαντηθούν σωστά με υψηλή πιθανότητα σε $ O(logN)$ βήματα [15].

Τέλος, όσον αφορά στο θέμα των αποτυχιών των κόμβων, όταν ένα κόμβος $ n$ αποτύχει, οι κόμβοι που τον συμπεριλάμβαναν στον πίνακα δεικτών τους θα πρέπει να τον αντικαταστήσουν με τον διάδοχο του $ n$ . Επιπλέον, ένα τέτοιο γεγονός δεν θα πρέπει να εμποδίζει την εξέλιξη μίας επερώτησης για ένα κλειδί $ k$ εν όσω το δίκτυο επανασταθεροποιείται. Για την επίτευξη αυτών των προδιαγραφών κάθε κόμβος του Chord διατηρεί μία λίστα διαδόχων (successor list) μεγέθους $ r$ που περιέχει τους $ r$ πρώτους (κοντινότερους) διαδόχους του. Αυτή η λίστα χρησιμοποιείται όταν ο κόμβος $ n$ έχει αποτύχει. Σε αυτή την περίπτωση όταν ένας κόμβος $ n'$ αντιληφθεί ότι ο διάδοχός του έχει αποτύχει αντικαθιστά την πρώτη εγγραφή του πίνακα δεικτών του με την πρώτη εγγραφή του πίνακα των διαδόχων του, που στην ουσία ήταν ο διάδοχος του $ n$ πριν αυτός αποτύχει. Εάν ένας κόμβος επιλέξει να αποχωρήσει οικειοθελώς από το δίκτυο, τότε μπορεί να ενημερώσει τον διάδοχό και τον προκάτοχό του έτσι ώστε να μπορούν να αλλάξουν τους δείκτες τους και επιπλέον να μπορεί να μεταφέρει τα κλειδιά στον διάδοχό του. Πρακτικά, σύμφωνα με στατιστικά πειράματα, ακόμα και μικρές τιμές του $ r$ είναι αρκετές για να επιτευχθεί η ευρωστία του δικτύου [15]. Αποδεικνύεται με μεγάλη πιθανότητα ότι όποιος κόμβος συνδέεται ή αποσυνδέεται από ένα δίκτυο Chord μπορεί να χρησιμοποιήσει $ O(log^2N)$ μηνύματα έτσι ώστε να ενημερωθούν σωστά όλοι οι δείκτες στους διαδόχους, στους προκατόχους και οι πίνακες δεικτών όλων των κόμβων [14].

Charalampos Nikolaou 2008-04-02