Chord: A scalable Peer-to-Peer Lookup Service for Internet Applications Παρουσίαση: Αθανασόπουλος, Αλεξάκης, Δεβελέγκα, Πεχλιβάνη, Φωτιάδου, Φωτόπουλος Authors: Stoica, Morris, Karger, Kaashoek, Balakrishman SIGCOMM 2001
Εισαγωγή Τα συστήματα ομότιμων κόμβων (P2P) και οι εφαρμογές τους είναι κατανεμημένα συστήματα που δεν υπόκεινται σε κεντρική διαχείριση ή ιεραρχημένη οργάνωση. Σε κάθε κόμβο εκτελείται λογισμικό ισοδύναμων λειτουργιών. Η βασική λειτουργία ενός συστήματος p2p είναι ο αποτελεσματικός (γρήγορος) τρόπος ανάκτησης δεδομένων.
Εισαγωγή To Chord είναι ένα επεκτάσιμο (scalable), κατανεμημένο πρωτόκολλο για αναζήτηση σε δυναμικά P2P συστήματα με συχνές εισόδους και εξόδους κόμβων Βασική λειτουργία του Chord: Δοθέντος ενός κλειδιού, το Chord το αντιστοιχεί σε κάποιο κόμβο
The Base Chord Protocol Το πρωτόκολλο Chord καθορίζει: 1) πώς εντοπίζεται ένα κλειδί 2) πώς ένας νέος κόμβος εισάγεται στο σύστημα 3) πώς ανακάμπτουμε από μία αποτυχία(failure) ή εκούσια αναχώρηση ενός υπάρχοντος κόμβου
Consistent Hashing To Chord χρησιμοποιεί consistent hashing για την αντιστοίχιση των κλειδιών στους κόμβους. Χρησιμοποιεί μια συνάρτηση κατακερματισμού (base hash function) όπως η SHA-1 για την αντιστοίχιση κάθε κόμβου και κάθε κλειδιού με ένα m-bit αναγνωριστικό(ID). node ID = hash(IP address) key ID = hash(key) Το μήκος m του αναγνωριστικού πρέπει να είναι αρκετά μεγάλο, έτσι ώστε η πιθανότητα δύο κόμβοι ή δύο κλειδιά να αντιστοιχίσουν στο ίδιο ID να είναι αμελητέα.
Consistent Hashing Τα αναγνωριστικά (ID’s) ταξινομούνται σε ένα δακτύλιο modulo 2 m. Το κλειδί k αντιστοιχίζεται στον πρώτο κόμβο που το αναγνωριστικό(ID) του είναι ίσο ή έπεται στον δακτύλιο. Αυτός ο κόμβος ονομάζεται successor(k). Αναπαριστώντας τα ID’s σε ένα δακτύλιο με αριθμούς από 0 έως 2 m -1, ο successor(k) είναι ο πρώτος κόμβος που συναντάμε ξεκινώντας από το k και διατρέχοντας σύμφωνα με τους δείκτες του ρολογιού. Successor(2) = 3 Successor(1) = 1 Successor(6) = 0
Simple Key Location Κάθε κόμβος χρειάζεται να γνωρίζει μόνο τον successor (επόμενο) κόμβο του στο δακτύλιο. Ερωτήματα για δοθέντα ID’s δρομολογούνται γύρω στον δακτύλιο μέσω των successors δεικτών, μέχρις ότου συναντήσουν τον κόμβο που είναι ο υπεύθυνος για το κάθε ID. Η λύση αυτή είναι σωστή αλλά αναποτελεσματική, καθώς μπορεί να χρειαστεί να διατρέξουμε όλους τους κόμβους Ν του δακτυλίου για να πάρουμε απάντηση. Για αυτό το Chord διατηρεί πρόσθετες πληροφορίες δρομολόγησης.
Scalable Key Location m: αριθμός των bits των αναγνωριστικών (ID’s) κλειδιών/κόμβων. Finger table: κάθε κόμβος διατηρεί έναν πίνακα δρομολόγησης με το πολύ m εγγραφές. Η i-στη εγγραφή του πίνακα του κόμβου n περιέχει το ID του πρώτου κόμβου s, ο οποίος έπεται του n κατά τουλάχιστο 2 i-1 στον δακτύλιο, s=successor(n+2 i-1 ), όπου 1 ≤ i ≤ m (πράξεις modulo 2 m). Μια εγγραφή του finger table περιέχει το Chord ID και την IP address του κόμβου που αφορά.
Scalable Key Location Κάθε κόμβος αποθηκεύει πληροφορίες για κόμβους που τον ακολουθούν σε κοντινή απόσταση από αυτόν στο δακτύλιο. (για O(logN) κόμβους) Ο finger table ενός κόμβου γενικά δεν περιλαμβάνει αρκετές πληροφορίες για να προσδιορίσει τον successor ενός τυχαίου κλειδιού.
Scalable Key Location Όταν ένας κόμβος δεν γνωρίζει τον successor ενός κλειδιού k, βρίσκει τον κόμβο που το ID του είναι πιο κοντά στο k από το δικό του. Αυτός ο κόμβος θα γνωρίζει περισσότερα για το τμήμα του δακτυλίου που αφορά το k από ότι ο n. Επαναλαμβάνοντας αυτή την διαδικασία, ο n θα μάθει ποιος κόμβος βρίσκεται πιο κοντά στο k.
Διαδικασία Αναζήτησης Αναζήτηση του successor του k από τον κόμβο n Εάν το k βρίσκεται μεταξύ του n και του successor του n, τότε ο successor του k είναι ίδιος με τον successor του n. Αλλιώς η αναζήτηση συνεχίζεται στον μακρινότερο κόμβο του finger table του n, που όμως προηγείται του k. Βήματα αναζήτησης Ο(logN)
Node Joins Σε ένα δυναμικό δίκτυο οι κόμβοι μπορεί να εισέρχονται και να αναχωρούν οποιαδήποτε στιγμή. Ο βασικός στόχος είναι να υπάρχει η δυνατότητα να εντοπίσουμε κάθε κλειδί στο δίκτυο οποιαδήποτε στιγμή. Στο Chord ισχύουν δύο προτάσεις: 1)Κάθε κόμβος γνωρίζει τον successor (επόμενο) του. 2)Για κάθε πληροφορία k, o κόμβος με ID = successor(k) είναι υπεύθυνος για τον k. Για να γίνονται αυτές οι αναζητήσεις σε χρόνο logm, θα πρέπει επίσης να είναι σωστές οι πληροφορίες σε κάθε finger table. Για διευκόλυνση κάθε κόμβος του Chord διατηρεί έναν δείκτη predecessor στον αμέσως προηγούμενο κόμβο του.
Node Joins To Chord εκτελεί τρεις διαδικασίες όταν ένας νέος κόμβος n εισάγεται στο δίκτυο: 1.Αρχικοποίηση του finger table του κόμβου n, ανάθεση ως predecessor του n τον predecessor του successor του n, και ανάθεση ως predecessor του successor του n, το ίδιο τον n. 2.Ενημέρωση των finger tables των κόμβων που θα πρέπει να αναφέρονται στον n: Το i-στο finger ενός κόμβου p θα δείχνει στον n αν και μόνο αν: ο κόμβος p προηγείται του n κατά τουλάχιστο 2 i-1 το i-στο finger του p έδειχνε σε κόμβο που έπεται του n 3.Μεταφορά των δεδομένων για τα οποία θα είναι υπεύθυνος ο νέος κόμβος n από τον προηγούμενο υπεύθυνο.
Node Leaves To Chord εκτελεί τις παρακάτω διαδικασίες όταν ένας κόμβος n εξέρχεται από το δίκτυο: 1.Μεταφορά των δεδομένων για τα οποία ήταν υπεύθυνος ο κόμβος n στον successor του. 2.Ενημέρωση του δείκτη predecessor έτσι ώστε να δείχνει τον predecessor που είχε ο n. 3.Ενημέρωση των finger tables των κόμβων που δείχνουν στον n έτσι ώστε να δείχνουν τον successor του n.