ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΠΡΟΧΩΡΗΜΕΝΑ ΘΕΜΑΤΑ ΒΑΣΕΩΝ Ε ΟΜΕΝΩΝ ΦΘΙΝΟΠΩΡΟ 2007 Λύση ΑΣΚΗΣΗΣ #2 Τ. Σελλής ΕΡΩΤΗΜΑ 1: ΙΑΧΕΙΡΙΣΗ ΑΝΤΙΓΡΑΦΩΝ ΣΕ ΚΑΤΑΝΕΜΗΜΕΝΕΣ ΒΑΣΕΙΣ Ε ΟΜΕΝΩΝ Θεωρούµε ένα κατανεµηµένο Σύστηµα ιαχείρισης Βάσεων εδοµένων µε τέσσερις κόµβους Μ, Ν1, Ν2 και Ν3 και δύο αντικείµενα* που µας ενδιαφέρουν Χ, Υ. Ο κόµβος Μ είναι ο κόµβος µε τα πρωτεύοντα αντίγραφα και για τα δύο αντικείµενα. Αντίγραφα του Χ υπάρχουν και στους κόµβους Ν1, Ν2, ενώ αντίγραφα του Υ υπάρχουν σε όλους τους κόµβους. Έστω ότι στο συγκεκριµένο σύστηµα µπορούν να υλοποιηθούν οι ακόλουθες στρατηγικές για τον χειρισµό των updates: 1. Σύγχρονος αλγόριθµος (eager replication): Οι εγγραφές πραγµατοποιούνται υποχρεωτικά σε όλα τα αντίγραφα ταυτόχρονα µε τον κόµβο που ζήτησε την εγγραφή (µε κάθε κόµβο να έχει δικό του διαχειριστή κλειδωµάτων), ενώ η ανάγνωση ενός αντικειµένου µπορεί να πραγµατοποιηθεί τοπικά σε κάθε κόµβο. 2. Ασύγχρονος αλγόριθµος πρωτεύοντος αντίγραφου (lazy master replication): Όλοι οι κόµβοι εκτός από τον κόµβο µε το πρωτεύον αντίγραφο (master) έχουν αντίγραφα µε δικαίωµα µόνο για ανάγνωση (read only). Οι εγγραφές (updates) πραγµατοποιούνται µόνο στον κόµβο µε το πρωτεύον αντίγραφο και στο τέλος της δοσοληψίας µοιράζονται στους υπόλοιπους κόµβους (αυτή η µέθοδος στη διάλεξη ονοµάστηκε primary-copy locking). 3. Ασύγχρονος οµαδικός αλγόριθµος (lazy group replication): Κάθε κόµβος έχει τον δικό του διαχειριστή κλειδωµάτων. Οι εγγραφές (και φυσικά και οι αναγνώσεις) µπορούν να γίνουν τοπικά σε οποιονδήποτε κόµβο έχει ένα αντίγραφο και µοιράζονται στους υπόλοιπους κόµβους στο τέλος της δοσοληψίας. Έστω ότι πρέπει να εκτελεστεί στον κόµβο Ν1 η δοσοληψία: T = W(X) R(Y) W(Y). Για κάθε µία από τις στρατηγικές (1-3) για τον χειρισµό updates, δώστε όλα τα βήµατα της εκτέλεσης της δοσοληψίας Τ (αιτήσεις για κλειδώµατα, πράξεις στα δεδοµένα, ανταλλαγή δεδοµένων ανάµεσα στους κόµβους). Επίσης, αναλύστε εν συντοµία τα πιθανά προβλήµατα που µπορεί να έχει η κάθε στρατηγική. * Ως αντικείµενα µπορούµε να θεωρήσουµε απλές εγγραφές, σελίδες ή ακόµα και ολόκληρα τµήµατα (segments) κάποιας σχέσης. 1
Λύση 1. Σύγχρονος αλγόριθµος (eager replication): (a) Ζητείται η εκτέλεση της δοσοληψίας T στον κόµβο Ν1. (b) Η T κλειδώνει το X µε X_LOCK στους κόµβους M, Ν1 και Ν2. (c) Ο κόµβος Ν1 ζητάει από τους κόµβους Μ και Ν2 να κάνουν W(X). W(X) στους κόµβους M, Ν1 και Ν2. (d) Η T κλειδώνει το τοπικό αντίγραφο του Υ στον κόµβο Ν1 µε S_LOCK. (e) R(Y) στον κόµβο Ν1. (f) Η T κλειδώνει το Υ µε X_LOCK σε όλους τους κόµβους (M, Ν1, Ν2 και Ν3). (g) Ο κόµβος Ν1 ζητάει από όλους τους κόµβους (M, Ν2 και Ν3) να κάνουν W(X). W(Υ) σε όλους τους κόµβους (h) Η T κάνει commit στον κόµβο Ν1 και ελευθερώνει όλα τα κλειδώµατα για τα X,Y. Ο σύγχρονος αλγόριθµος εγγυάται ότι δεν θα υπάρξουν ασυνέπειες στα δεδοµένα, ότι τα updates είναι ατοµικές πράξεις και ότι η ανάγνωση ενός τοπικού αντίγραφου θα επιστρέφει πάντα την πιο πρόσφατη τιµή της µεταβλητής στο σύστηµα. Όµως, έχει πολύ µεγάλο κόστος εκτέλεσης (µεγαλύτερο χρόνο εκτέλεσης, χειρότερο δυνατό συνολικό χρόνο απόκρισης/απάντησης) καθώς πρέπει να γίνονται update όλοι οι κόµβοι µε αντίγραφα. 2. Ασύγχρονος αλγόριθµος πρωτεύοντος αντίγραφου (lazy master replication): (a) Ζητείται η εκτέλεση της δοσοληψίας T στον κόµβο Ν1. (b) Ο κόµβος Ν1 ζητάει από τον κόµβο Μ να κάνει W(X). (c) Ο κόµβος M κλειδώνει το πρωτεύον αντίγραφο του X µε X_LOCK. (d) W(X) στον κόµβο M. (e) Ο κόµβος M ενηµερώνει τη δοσοληψία T στον κόµβο Ν1 ότι το W(X) ολοκληρώθηκε επιτυχώς. (f) Η T κλειδώνει τοπικά (στον κόµβο Ν1) το Υ µε S_LOCK και εκτελεί το R(Y). (g) Ο κόµβος Ν1 ζητάει από τον κόµβο Μ να κάνει W(Υ). (h) Ο κόµβος M κλειδώνει το πρωτεύον αντίγραφο του Υ µε X_LOCK. (i) W(Υ) στον κόµβο M. (j) Ο κόµβος M ενηµερώνει τη δοσοληψία T στον κόµβο Ν1 ότι το W(Υ) ολοκληρώθηκε επιτυχώς. (k) Η T κάνει commit στον κόµβο Ν1 και ελευθερώνει όλα τα κλειδώµατα για τα X,Y. (l) Ο κόµβος M στέλνει όλα τα updates στους υπόλοιπους κόµβους (W(X) στους Ν1 και Ν2 και W(Y) στους Ν1, Ν2 και Ν3). Ο ασύγχρονος αλγόριθµος πρωτεύοντος αντίγραφου είναι αρκετά πιο γρήγορος σε σχέση µε τον σύγχρονο αλγόριθµο. Όµως, ο φόρτος στον κόµβο µε το πρωτεύον αντίγραφο µπορεί να είναι πολύ µεγάλος και να µετατραπεί σε bottleneck για το σύστηµα. Επίσης, η ανάγνωση των τοπικών αντιγράφων είναι δυνατόν να οδηγήσει στο να µην διαβαστεί η πιο πρόσφατη τιµή της µεταβλητής στο σύστηµα. 3. Ασύγχρονος οµαδικός αλγόριθµος (lazy group replication): (a) Ζητείται η εκτέλεση της δοσοληψίας T στον κόµβο Ν1. (b) Η T κλειδώνει το τοπικό αντίγραφο του Χ στον κόµβο Ν1 µε Χ_LOCK. (c) W(X) στον κόµβο Ν1. 2
(d) Η T κλειδώνει το τοπικό αντίγραφο του Υ στον κόµβο Ν1 µε S_LOCK. (e) R(Y) στον κόµβο Ν1. (f) Η T κλειδώνει το τοπικό αντίγραφο του Υ στον κόµβο Ν1 µε Χ_LOCK. (g) W(Υ) στον κόµβο Ν1. (h) Η T κάνει commit στον κόµβο Ν1 και ελευθερώνει όλα τα τοπικά κλειδώµατα για τα X,Y. (i) Ο κόµβος Ν1 στέλνει όλες τις αλλαγές στους υπόλοιπους κόµβους. Με τη συγκεκριµένη στρατηγική ο κάθε κόµβος µπορεί να εκτελεί πλήρως τις δοσοληψίες που του έρχονται (οδηγώντας σε πολύ καλούς χρόνους απόκρισης εάν δεν ενοχλούν την εφαρµογή πιθανές ασυνέπειες στις τιµές των δεδοµένων) και ο φόρτος κατανέµεται ισοµερώς σε όλους τους κόµβους. Όµως, οδηγεί µε µεγάλη πιθανότητα σε ασυνέπειες στα δεδοµένα και απαιτεί συγχρονισµό ανάµεσα στα αντίγραφα εάν θέλουµε να αποφευχθεί το συγκεκριµένο πρόβληµα (π.χ. µε κάποιο µηχανισµό ελέγχου όπως τα timestamps). ΕΡΩΤΗΜΑ 2: ΕΠΕΞΕΡΓΑΣΙΑ ΕΡΩΤΗΣΕΩΝ ΣΕ ΚΑΤΑΝΕΜΗΜΕΝΕΣ ΒΑΣΕΙΣ Ε ΟΜΕΝΩΝ Θεωρείστε τις ακόλουθες σχέσεις, οι οποίες ανήκουν στην κατανεµηµένη βάση δεδοµένων παιχτών της ιεθνούς Ανεξάρτητης Αρχής Στατιστικών Basket ( ιανα ΣτατιBa): PLAYER (P_ID, NAME, AGE, HEIGHT, NATIONALITY, TEAM, POSITION, PointsPerGame) STATISTICS (STAT_ID, P_ID, DATE, MinsPlayed, POINTS, REBOUNDS, FOULS) Στις παραπάνω σχέσεις, για κάθε παίχτη καταγράφεται το ονοµατεπώνυµό του, η ηλικία του, το ύψος του, η εθνικότητά του, η οµάδα στην οποία παίζει αυτή τη στιγµή, η θέση που παίζει και ο µέσος όρος πόντων που σκοράρει ανά παιχνίδι. Αντίστοιχα, στα στατιστικά (σχέση STATISTICS) καταγράφονται για κάθε αγώνα στον οποίο παίζει ένας παίχτης η ηµεροµηνία του αγώνα, ο συνολικός χρόνος που έπαιξε, οι πόντοι του, τα rebounds που κέρδισε και τα fouls που έκανε. Η σχέση PLAYER έχει υποστεί οριζόντια κατάτµηση µε βάση την εθνικότητα των παιχτών (NATIONALITY) και η σχέση STATISTICS παραγόµενη κατάτµηση µε βάση την κατάτµηση της PLAYER. Στη συγκεκριµένη Οµοσπονδία ανήκουν 160 χώρες, µε την κάθε χώρα να είναι υπεύθυνη για τη διατήρηση σε τοπικό κόµβο του κατανεµηµένου συστήµατος των στοιχείων των παιχτών που έχουν την εθνικότητα της χώρας. Τέλος, τα στατιστικά των παιχτών κρατούνται σε ξεχωριστούς κεντρικούς κόµβους ανά ήπειρο (π.χ. στην Γαλλία για την Ευρώπη). ώστε το βέλτιστο πλάνο εκτέλεσης για καθεµία από τις ακόλουθες ερωτήσεις που έχουν τεθεί στον κόµβο της Βραζιλίας: i. SELECT * WHERE NATIONALITY = GR ii. SELECT NATIONALITY, AVG(HEIGHT) WHERE (NATIONALITY = FR ) OR (NATIONALITY = IT ) GROUP BY NATIONALITY iii. SELECT AVG(PointsPerGame) 3
iv. SELECT NAME, AGE, HEIGHT, DATE, REBOUNDS, STATISTICS WHERE (STATISTICS.P_ID = PLAYER.P_ID) AND (PLAYER.POSITION = CENTER ) AND (NATIONALITY = GR ) Με δεδοµένο ότι δεν σας δίνονται χαρακτηριστικά µεγέθη των σχέσεων, σαν βέλτιστο προσδιορίστε το πλάνο που ποιοτικά θεωρείτε ότι θα είναι το καλύτερο και σύντοµα εξηγείστε το γιατί. Λύση i. Q1 = SELECT * WHERE NATIONALITY = GR 1. Εκτέλεση του Q1 στον κόµβο της Ελλάδας. 2. Μεταφορά των αποτελεσµάτων στη Βραζιλία. ii. SELECT NATIONALITY, AVG(HEIGHT) WHERE (NATIONALITY = FR ) OR (NATIONALITY = IT ) GROUP BY NATIONALITY Χρησιµοποιούµε τοπικά σε κάθε κόµβο το ακόλουθο query: Q2 = SELECT NATIONALITY, AVG(HEIGHT) 1. Εκτέλεση του Q2 στο κόµβο της Γαλλίας ( FR ). 2. Μεταφορά των αποτελεσµάτων (1 tuple) στη Βραζιλία. 3. Εκτέλεση του Q2 στο κόµβο της Ιταλίας ( IT ). 4. Μεταφορά των αποτελεσµάτων (1 tuple) στη Βραζιλία. 5. Ένωση (union) των αποτελεσµάτων στον κόµβο της Βραζιλίας. iii. SELECT AVG(PointsPerGame) Χρησιµοποιούµε τοπικά σε κάθε κόµβο το ακόλουθο query: Q3 = SELECT COUNT(*) as NumberOfPlayers, SUM(PointsPerGame) as TotalPoints 1. Αποστολή του Q3 στους κόµβους που αντιστοιχούν στις 160 χώρες. 2. Εκτέλεση του Q3 σε όλους τους κόµβους. 3. Μεταφορά των αποτελεσµάτων (1 tuple ανά χώρα * 160 χώρες) στη Βραζιλία. 4. Ένωση των αποτελεσµάτων και αποθήκευσή τους στην ενδιάµεση σχέση TMP1. 5. Εκτέλεση του query: Q4 = SELECT SUM(TotalPoints) as GlobalPoints, SUM(NumberOfPlayers) as GlobalPlayers FROM TMP1 4
Και αποθήκευση του στην ενδιάµεση σχέση TMP2 6. Εκτέλεση του query: Q5 = SELECT (GlobalPoints / GlobalPlayers) FROM TMP2 (τα βήµατα 5 και 6 θα µπορούσαν να γίνουν και σε ένα βήµα εάν το επιτρέπει το αντίστοιχο Σ Β ) iv. SELECT NAME, AGE, HEIGHT, DATE, REBOUNDS, STATISTICS WHERE (STATISTICS.P_ID = PLAYER.P_ID) AND (PLAYER.POSITION = CENTER ) AND (NATIONALITY = GR ) 1. Αποστολή του query Q6 στον κόµβο της Ελλάδας. Q6 = SELECT P_ID WHERE (PLAYER.POSITION = CENTER ) 2. Εκτέλεση του Q6 στον κόµβο της Ελλάδας και αποθήκευση των αποτελεσµάτων (P_IDs) στην ενδιάµεση σχέση TMP3. 3. Μεταφορά της TMP3 στον κόµβο της Γαλλίας (κεντρικός κόµβος µε στατιστικά για Ευρώπη). 4. Εκτέλεση του Q7 στον κόµβο της Γαλλίας: Q7 = STATISTICS TMP3 και αποθήκευση των αποτελεσµάτων στην ενδιάµεση σχέση TMP4. 5. Εκτέλεση του Q8 στον κόµβο της Γαλλίας: Q8 = SELECT P_ID, DATE, REBOUNDS FROM TMP4 και αποθήκευση των αποτελεσµάτων στην ενδιάµεση σχέση TMP_STATS. 6. Μεταφορά της TMP_STATS στον κόµβο της Βραζιλίας. 7. Εκτέλεση του Q9 στον κόµβο της Ελλάδας: Q9 = SELECT P_ID, NAME, AGE, HEIGHT, WHERE (PLAYER.POSITION = CENTER ) 5
και αποθήκευση των αποτελεσµάτων στην ενδιάµεση σχέση TMP_PLAYER. 8. Μεταφορά της TMP_PLAYER στον κόµβο της Βραζιλίας. 9. Εκτέλεση του Q10 στον κόµβο της Βραζιλίας: Q10 = TMP_PLAYER TMP_STATS 6