CHORD A Scalable Peer-to-peer Lookup Service for Internet Applications Μαρίνα Δρόσου Νικόλαος Μπουντουρόπουλος Οδυσσέας Πετρόχειλος Παναγιώτης Δομουχτσίδης Χαρά Παπαγεωργίου Νικόλαος Κοκκίνης Μενέλαος Μαρκουλάκης Γεώργιος Λίτσιος
Εισαγωγή Ζητούμενο στα p2p η αποτελεσματική αναζήτηση των κόμβων και των δεδομένων. Λύση προσφέρει το CHORD Κατανεμημένο, scalable πρωτόκολλο αναζήτησης. Βασική λειτουργία: Αντιστοίχηση κλειδιών (δεδομένων) σε κόμβους.
Κατασκευή Χρησιμοποιούμε μια hash function για να αντιστοιχίσουμε κάθε κόμβο και κάθε δεδομένο σε ένα id μήκους m bits. Οι κόμβοι τοποθετούνται σε έναν δακτύλιο 2 m θέσεων ανάλογα με το id τους. Τα κλειδιά (δεδομένα) τοποθετούνται στον πρώτο κόμβο που βρίσκεται σε θέση ≥ του id τους (successor node).
Δρομολόγηση Ο κάθε κόμβος διατηρεί ένα δείκτη στον επόμενό του Εξασφαλίζεται έτσι η εύρεση όλων των δεδομένων Πρόβλημα: Πολυπλοκότητα Ο(n) Ελάττωση πολυπλοκότητας σε Ο(logn) με τη δημιουργία των finger tables.
Finger Tables To finger table του κόμβου n περιέχει το πολύ m καταχωρήσεις Η i-οστή εγγραφή περιέχει τον πρώτο κόμβο που απέχει απόσταση τουλάχιστον 2 i-1 από τον n, 1 ≤ i ≤ m. Π.χ. για τον κόμβο 0: = = =4 successor(1)=1 successor(2)=3 successor(4)=0
Αναζήτηση Παράδειγμα: Ερώτηση στον κόμβο 3 για το κλειδί 1. Προσπαθούμε να εντοπίσουμε τον predecessor(id) εδώ τον predecessor(1), δηλ. τον 0 Επειδή 1 (3, 3.successor] ο 3 δεν είναι ο ζητούμενος. Ο 3 ψάχνει στο finger table του τον πιο κοντινό κόμβο που γνωρίζει για το 1. εδώ αυτός είναι ο 0 Η ερώτηση προωθείται εκεί. Επειδή 1 (0, 0.successor] o 0 είναι ο ζητούμενος. Άρα το κλειδί ένα είναι αποθηκευμένο στον 0.successor, δηλ. στον 1
Εισαγωγή κόμβων Κατά την εισαγωγή νέων κόμβων στο δίκτυο πρέπει να εξασφαλίζεται ότι: Ο κάθε κόμβος διατηρεί το σωστό successor. Κάθε κλειδί k είναι αποθηκευμένο στον κόμβο successor(k). Είναι επιθυμητή και η ορθή διατήρηση των finger tables για επιτάχυνση των αναζητήσεων. Οι παραπάνω ιδιότητες πρέπει να ισχύουν και για την διαγραφή κόμβων.
Εισαγωγή κόμβων Κατά την εισαγωγή ενός κόμβου πρέπει να γίνουν τα εξής: Σύνδεση του νέου κόμβου στο δίκτυο και αρχικοποίηση του finger table του. Ενημέρωση των finger tables των υπόλοιπων κόμβων. Ενημέρωση του software του ανώτερου επιπέδου για τη σωστή μεταφορά δεδομένων στο νέο κόμβο.
Παράδειγμα Εισαγωγή κόμβου 6 Αρχικοποίηση: Υποθέτουμε ότι ο προς εισαγωγή κόμβος γνωρίζει έναν κόμβο του συστήματος, έστω n’. O 6 μαθαίνει τους γειτονικούς του κόμβους ρωτώντας τον n’. Υπολογίζει τις στήλες start και interval και συμπληρώνει τη στήλη successor κάνοντας αναζητήσεις μέσω του n’.
Παράδειγμα Εισαγωγή κόμβου 6 Ενημέρωση: Ενημέρωση των finger tables που πρέπει να περιέχουν τον 6 ως successor. Αλλάζουμε το i-οστό finger ενός κόμβου p αν: Ο p προηγείται του 6 τουλάχιστον κατά 2 i-1 Tο i-στό finger του p έχει τιμή successor μεγαλύτερη του 6
Παράδειγμα Εισαγωγή κόμβου 6 Μεταφορά: Με την εισαγωγή του νέου κόμβου μεταφέρονται τα κλειδιά για τα οποία πλέον είναι υπεύθυνος ο 6 Στο παράδειγμα βλέπουμε τη μεταφορά του κλειδιού 6 Τα κλειδιά μεταφέρονται στον 6 από έναν μόνο κόμβο, τον successor(6).
Διαγραφή κόμβων Διαγραφή κόμβου 1 Μεταφορά των κλειδιών του κόμβου 1 στον κόμβο successor(1) = 3 Ενημέρωση των finger tables Εδώ ενημερώνεται η πρώτη εγγραφή του finger table του κόμβου 0