Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 10939|Απάντηση: 1

Διάφοροι τρόποι χρήσης κατανεμημένων κλειδαριών (redis, zookeeper, βάση δεδομένων)

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 30/8/2018 3:04:32 μ.μ. | | | |
Ε: Ένας διακομιστής υπηρεσιών, μία βάση δεδομένων, λειτουργία: ερώτηση για το τρέχον υπόλοιπο του χρήστη, αφαίρεση 3% του τρέχοντος υπολοίπου ως χρέωση διεκπεραίωσης

συγχρονισμένο
κλειδαριά
Κλείδωμα DB

Ε: Δύο διακομιστές υπηρεσιών, μία βάση δεδομένων, λειτουργία: ερώτηση για το τρέχον υπόλοιπο του χρήστη, αφαίρεση 3% του τρέχοντος υπολοίπου ως χρέωση διεκπεραίωσης
Κατανεμημένες κλειδαριές

Τι είδους κατανεμημένη κλειδαριά χρειαζόμαστε;
Μπορεί να διασφαλίσει ότι σε ένα κατανεμημένο σύμπλεγμα εφαρμογών, η ίδια μέθοδος μπορεί να εκτελεστεί μόνο από ένα νήμα σε ένα μηχάνημα ταυτόχρονα.

Εάν αυτή η κλειδαριά είναι κλειδαριά επανεισόδου (αποφύγετε τα αδιέξοδα)

Αυτή η κλειδαριά είναι καλύτερο να είναι κλειδαριά αποκλεισμού (σκεφτείτε αν τη θέλετε σύμφωνα με τις ανάγκες της επιχείρησής σας)

Αυτή η κλειδαριά είναι καλύτερο να είναι μια δίκαιη κλειδαριά (σκεφτείτε αν τη θέλετε ή όχι σύμφωνα με τις επιχειρηματικές ανάγκες)

Υπάρχουν εξαιρετικά διαθέσιμες λειτουργίες κλειδώματος απόκτησης και απελευθέρωσης

Η απόδοση των κλειδαριών απόκτησης και απελευθέρωσης είναι καλύτερη

1. Κατανεμημένες κλειδαριές βασισμένες σε βάσεις δεδομένων

Κατανεμημένα κλειδώματα με βάση υλοποιήσεις που βασίζονται σε πίνακες

Όταν θέλουμε να κλειδώσουμε μια μέθοδο, εκτελέστε την ακόλουθη SQL:
εισαγωγή στις τιμές methodLock(method_name,desc) ('method_name','desc')
Επειδή έχουμε θέσει έναν περιορισμό μοναδικότητας στο method_name, εάν υποβληθούν πολλά αιτήματα στη βάση δεδομένων ταυτόχρονα, η βάση δεδομένων θα διασφαλίσει ότι μόνο μία λειτουργία μπορεί να πετύχει, τότε μπορούμε να υποθέσουμε ότι το νήμα που έλαβε με επιτυχία το κλείδωμα της μεθόδου και μπορεί να εκτελέσει το περιεχόμενο του σώματος της μεθόδου.

Όταν εκτελεστεί η μέθοδος, εάν θέλετε να απελευθερώσετε το κλείδωμα, πρέπει να εκτελέσετε την ακόλουθη Sql:
διαγραφή από το methodLock όπου method_name ='method_name'

Αυτή η απλή υλοποίηση παραπάνω έχει τα ακόλουθα προβλήματα:

  • Αυτό το κλείδωμα εξαρτάται από τη διαθεσιμότητα της βάσης δεδομένων, η οποία είναι ένα μόνο σημείο και θα προκαλέσει τη μη διαθεσιμότητα του επιχειρηματικού συστήματος μόλις κλείσει η βάση δεδομένων.
  • Αυτό το κλείδωμα δεν έχει χρόνο λήξης και μόλις αποτύχει η λειτουργία ξεκλειδώματος, η εγγραφή κλειδώματος θα παραμείνει στη βάση δεδομένων και άλλα νήματα δεν θα μπορούν πλέον να αποκτήσουν το κλείδωμα.
  • Αυτό το κλείδωμα μπορεί να είναι μόνο χωρίς αποκλεισμό, επειδή η λειτουργία εισαγωγής δεδομένων θα αναφέρει απευθείας ένα σφάλμα μόλις αποτύχει η εισαγωγή. Τα νήματα που δεν αποκτούν κλειδώματα δεν θα εισέλθουν στην ουρά και θα πρέπει να ενεργοποιήσουν ξανά τη λειτουργία απόκτησης κλειδώματος για να αποκτήσουν ξανά το κλείδωμα.
  • Η κλειδαριά δεν επανεισέρχεται και το ίδιο νήμα δεν μπορεί να αποκτήσει ξανά την κλειδαριά μέχρι να απελευθερωθεί. Επειδή τα δεδομένα στα δεδομένα υπάρχουν ήδη.
  • Αυτή η κλειδαριά είναι μια άδικη κλειδαριά και όλα τα νήματα που περιμένουν την κλειδαριά ανταγωνίζονται για την κλειδαριά από τύχη.


Φυσικά, μπορούμε να λύσουμε τα παραπάνω προβλήματα και με άλλους τρόπους.

  • Είναι η βάση δεδομένων ένα μόνο σημείο; Δημιουργήστε δύο βάσεις δεδομένων και τα δεδομένα θα συγχρονιστούν και προς τις δύο κατευθύνσεις. Μόλις κλείσετε το τηλέφωνο, μεταβείτε γρήγορα στη βιβλιοθήκη αντιγράφων ασφαλείας.
  • Δεν υπάρχει χρόνος λήξης; Απλώς κάντε μια προγραμματισμένη εργασία για να καθαρίσετε τα δεδομένα χρονικού ορίου στη βάση δεδομένων σε τακτά χρονικά διαστήματα.
  • Μη αποκλεισμός; Κάντε έναν βρόχο while μέχρι να πετύχει το ένθετο και μετά να επιστρέψει επιτυχία.
  • Μη επανείσοδος; Προσθέστε ένα πεδίο στον πίνακα της βάσης δεδομένων για να καταγράψετε τις πληροφορίες κεντρικού υπολογιστή και τις πληροφορίες νήματος του μηχανήματος που λαμβάνει αυτήν τη στιγμή το κλείδωμα και, στη συνέχεια, την επόμενη φορά που θα λάβετε το κλείδωμα, ρωτήστε πρώτα τη βάση δεδομένων, εάν οι πληροφορίες κεντρικού υπολογιστή και οι πληροφορίες νήματος του τρέχοντος μηχανήματος μπορούν να βρεθούν στη βάση δεδομένων, μπορείτε να του εκχωρήσετε απευθείας το κλείδωμα.
  • Άδικο; Δημιουργήστε έναν άλλο ενδιάμεσο πίνακα για να καταγράψετε όλα τα νήματα που περιμένουν την κλειδαριά και ταξινομήστε τα ανάλογα με το χρόνο δημιουργίας και μόνο το πρώτο που δημιουργήθηκε επιτρέπεται να αποκτήσει την κλειδαριά


Κατανεμημένες κλειδαριές βασισμένες σε αποκλειστικές κλειδαριές

Εκτός από την προσθήκη και τη διαγραφή εγγραφών στον πίνακα δεδομένων, οι κατανεμημένες κλειδαριές μπορούν επίσης να εφαρμοστούν με τη βοήθεια των κλειδαριών που συνοδεύουν τα δεδομένα.

Χρησιμοποιούμε επίσης τον πίνακα βάσης δεδομένων που μόλις δημιουργήσαμε. Οι κατανεμημένες κλειδαριές μπορούν να υλοποιηθούν μέσω αποκλειστικών κλειδαριών σε βάσεις δεδομένων. Η μηχανή InnoDB που βασίζεται σε MySQL μπορεί να χρησιμοποιήσει τις ακόλουθες μεθόδους για την υλοποίηση λειτουργιών κλειδώματος:

Εάν προσθέσετε για ενημέρωση μετά την πρόταση ερωτήματος, η βάση δεδομένων θα προσθέσει ένα αποκλειστικό κλείδωμα στον πίνακα της βάσης δεδομένων κατά τη διάρκεια της διαδικασίας ερωτήματος. Όταν προστίθεται ένα αποκλειστικό κλείδωμα σε μια εγγραφή, άλλα νήματα δεν μπορούν πλέον να προσθέσουν ένα αποκλειστικό κλείδωμα στην εγγραφή σε αυτήν τη γραμμή.

Μπορούμε να σκεφτούμε ότι το νήμα που αποκτά την αποκλειστική κλειδαριά μπορεί να αποκτήσει την κατανεμημένη κλειδαριά και όταν ληφθεί η κλειδαριά, η επιχειρηματική λογική της μεθόδου μπορεί να εκτελεστεί και στη συνέχεια να ξεκλειδωθεί με τις ακόλουθες μεθόδους:

δημόσιο κενό ξεκλείδωμα(){ connection.commit(); }

μέσω connection.commit(); λειτουργία για την απελευθέρωση της κλειδαριάς.

Αυτή η μέθοδος μπορεί να λύσει αποτελεσματικά τα προβλήματα που αναφέρθηκαν παραπάνω σχετικά με την αδυναμία απελευθέρωσης της κλειδαριάς και μπλοκαρίσματος της κλειδαριάς.

Μπλοκάρισμα κλειδαριών; Η δήλωση for update επιστρέφει αμέσως μετά την επιτυχή εκτέλεση και παραμένει αποκλεισμένη μέχρι να ολοκληρωθεί με επιτυχία.

Η υπηρεσία διακόπηκε μετά το κλείδωμα, δεν μπορεί να απελευθερωθεί; Με αυτόν τον τρόπο, η βάση δεδομένων απελευθερώνει το κλείδωμα από μόνη της μετά τη διακοπή λειτουργίας της υπηρεσίας.

Ωστόσο, εξακολουθεί να μην λύνει άμεσα το πρόβλημα του μοναδικού σημείου της βάσης δεδομένων, της επανεισόδου και του δίκαιου κλειδώματος.

Για να συνοψίσουμε τον τρόπο χρήσης της βάσης δεδομένων για την υλοποίηση κατανεμημένων κλειδωμάτων, τα οποία βασίζονται και τα δύο σε έναν πίνακα στη βάση δεδομένων, το ένα είναι να προσδιορίσουμε εάν υπάρχει κλείδωμα από την ύπαρξη εγγραφών στον πίνακα και το άλλο είναι να εφαρμόσουμε κατανεμημένα κλειδώματα μέσω του αποκλειστικού κλειδώματος της βάσης δεδομένων.

Πλεονεκτήματα του κατανεμημένου κλειδώματος σε βάσεις δεδομένων

Απευθείας με τη βοήθεια της βάσης δεδομένων, είναι εύκολο να γίνει κατανοητό.

Μειονεκτήματα της εφαρμογής κατανεμημένων κλειδαριών σε βάσεις δεδομένων

Θα υπάρξουν διάφορα προβλήματα και η όλη λύση θα γίνεται όλο και πιο περίπλοκη στη διαδικασία επίλυσης του προβλήματος.

Η λειτουργία της βάσης δεδομένων απαιτεί ορισμένα γενικά έξοδα και πρέπει να ληφθούν υπόψη ζητήματα απόδοσης.

2. Κατανεμημένες κλειδαριές με βάση την προσωρινή μνήμη

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

Υπάρχουν πολλά ώριμα προϊόντα προσωρινής αποθήκευσης επί του παρόντος, συμπεριλαμβανομένων των Redis, memcached κ.λπ. Εδώ παίρνουμε το Redis ως παράδειγμα για να αναλύσουμε το σχήμα χρήσης της κρυφής μνήμης για την υλοποίηση κατανεμημένων κλειδαριών.

Υπάρχουν πολλά σχετικά άρθρα στο Διαδίκτυο σχετικά με την εφαρμογή κατανεμημένων κλειδαριών με βάση το Redis και η κύρια μέθοδος υλοποίησης είναι η χρήση της μεθόδου Jedis.setNX.

Υπάρχουν επίσης αρκετά προβλήματα με την παραπάνω εφαρμογή:

1. Πρόβλημα ενός σημείου.

2. Αυτή η κλειδαριά δεν έχει χρόνο λήξης, μόλις αποτύχει η λειτουργία ξεκλειδώματος, θα έχει ως αποτέλεσμα η εγγραφή κλειδώματος να είναι συνεχώς σε επεξήγηση και άλλα νήματα δεν μπορούν πλέον να αποκτήσουν την κλειδαριά.

3. Αυτή η κλειδαριά μπορεί να είναι μόνο χωρίς μπλοκάρισμα και θα επιστρέψει απευθείας ανεξάρτητα από την επιτυχία ή την αποτυχία.

4. Αυτή η κλειδαριά δεν επανεισέρχεται, αφού ένα νήμα αποκτήσει την κλειδαριά, δεν μπορεί να αποκτήσει ξανά την κλειδαριά πριν απελευθερώσει την κλειδαριά, επειδή το κλειδί που χρησιμοποιείται υπάρχει ήδη στο redis. Οι λειτουργίες setNX δεν μπορούν πλέον να εκτελεστούν.

5. Αυτή η κλειδαριά είναι άδικη, όλα τα νήματα αναμονής ξεκινούν τις λειτουργίες setNX ταυτόχρονα και τα τυχερά νήματα μπορούν να πάρουν την κλειδαριά.

Φυσικά, υπάρχουν και τρόποι επίλυσής του.

  • Σήμερα, οι κύριες υπηρεσίες προσωρινής αποθήκευσης υποστηρίζουν την ανάπτυξη συμπλεγμάτων για την επίλυση προβλημάτων ενός σημείου μέσω ομαδοποίησης.
  • Δεν υπάρχει χρόνος λήξης; Η μέθοδος setExpire του redis υποστηρίζει τον εισερχόμενο χρόνο λήξης και τα δεδομένα διαγράφονται αυτόματα μετά τη συμπλήρωση του χρόνου.
  • Μη αποκλεισμός; ενώ εκτελούνται επανειλημμένα.
  • Δεν είναι δυνατή η επανείσοδος; Αφού ένα νήμα αποκτήσει την κλειδαριά, αποθηκεύστε τις τρέχουσες πληροφορίες κεντρικού υπολογιστή και τις πληροφορίες νήματος και ελέγξτε εάν είστε ο κάτοχος της τρέχουσας κλειδαριάς πριν την αποκτήσετε την επόμενη φορά.
  • Άδικο; Τοποθετήστε όλα τα νήματα σε αναμονή σε μια ουρά προτού ένα νήμα αποκτήσει κλειδαριά και, στη συνέχεια, αποκτήστε το κλείδωμα με βάση την πρώτη είσοδο, την πρώτη έξοδο.


Η πολιτική συγχρονισμού του συμπλέγματος redis απαιτεί χρόνο και είναι πιθανό το νήμα Α να κλειδώσει μετά την επιτυχή ρύθμιση του NX, αλλά αυτή η τιμή δεν έχει ενημερωθεί στον διακομιστή όπου το νήμα Β εκτελεί το setNX, γεγονός που θα προκαλέσει προβλήματα συγχρονισμού.

Ο Salvatore Sanfilippo, ο συγγραφέας του redis, πρότεινε τον αλγόριθμο Redlock, ο οποίος εφαρμόζει κατανεμημένη διαχείριση κλειδώματος (DLM) που είναι πιο ασφαλής και αξιόπιστη από έναν μόνο κόμβο.

Ο αλγόριθμος Redlock υποθέτει ότι υπάρχουν κόμβοι N redis που είναι ανεξάρτητοι μεταξύ τους, γενικά ρυθμισμένοι σε N=5, και αυτοί οι κόμβοι N τρέχουν σε διαφορετικά μηχανήματα για να διατηρήσουν τη φυσική ανεξαρτησία.

Τα βήματα του αλγορίθμου είναι τα εξής:

1. Ο πελάτης λαμβάνει την τρέχουσα ώρα σε χιλιοστά του δευτερολέπτου.
2. Ο πελάτης προσπαθεί να αποκτήσει το κλείδωμα των N κόμβων, (κάθε κόμβος παίρνει το κλείδωμα με τον ίδιο τρόπο όπως το κλείδωμα της προσωρινής μνήμης που αναφέρθηκε προηγουμένως) και οι N κόμβοι λαμβάνουν το κλείδωμα με το ίδιο κλειδί και τιμή. Ο πελάτης πρέπει να ορίσει το χρονικό όριο πρόσβασης στη διεπαφή και ο χρόνος λήξης της διεπαφής πρέπει να είναι πολύ μικρότερος από το χρονικό όριο κλειδώματος, για παράδειγμα, ο χρόνος αυτόματης απελευθέρωσης κλειδώματος είναι 10 δευτερόλεπτα και, στη συνέχεια, το χρονικό όριο διεπαφής ορίζεται σε περίπου 5-50 ms. Αυτό σας επιτρέπει να λήξει το χρονικό όριο το συντομότερο δυνατό κατά την πρόσβαση σε έναν κόμβο redis μετά την πτώση του και μειώνει την κανονική χρήση της κλειδαριάς.
3. Ο πελάτης υπολογίζει πόσος χρόνος χρειάζεται για να αποκτήσει την κλειδαριά, αφαιρώντας τον χρόνο που λαμβάνεται στο βήμα 1 με την τρέχουσα ώρα, μόνο όταν ο πελάτης αποκτήσει περισσότερους από 3 κόμβους της κλειδαριάς και ο χρόνος για την απόκτηση της κλειδαριάς είναι μικρότερος από τον χρόνο λήξης της κλειδαριάς, ο πελάτης αποκτά την κατανεμημένη κλειδαριά.
4. Ο χρόνος απόκτησης της κλειδαριάς από τον πελάτη είναι ο καθορισμένος χρόνος χρονικού ορίου κλειδώματος μείον τον χρόνο που δαπανήθηκε για την απόκτηση της κλειδαριάς που υπολογίστηκε στο βήμα 3.
5. Εάν ο πελάτης δεν καταφέρει να αποκτήσει το κλείδωμα, ο πελάτης θα διαγράψει όλες τις κλειδαριές με τη σειρά του.
Χρησιμοποιώντας τον αλγόριθμο Redlock, μπορεί να διασφαλιστεί ότι η υπηρεσία κατανεμημένου κλειδώματος μπορεί ακόμα να λειτουργεί όταν κλείνει έως και 2 κόμβους, γεγονός που βελτιώνει σημαντικά τη διαθεσιμότητα σε σύγκριση με το προηγούμενο κλείδωμα βάσης δεδομένων και κλείδωμα προσωρινής μνήμης.

Ωστόσο, ένας ειδικός που διανέμεται έγραψε ένα άρθρο "Πώς να κάνετε κατανεμημένο κλείδωμα" αμφισβητώντας την ορθότητα του Redlock.

Ο ειδικός ανέφερε ότι υπάρχουν δύο πτυχές που πρέπει να ληφθούν υπόψη όταν εξετάζετε τις κατανεμημένες κλειδαριές: απόδοση και ορθότητα.

Εάν χρησιμοποιείτε μια κατανεμημένη κλειδαριά υψηλής απόδοσης και δεν απαιτείται η ορθότητα, τότε αρκεί η χρήση κλειδώματος προσωρινής μνήμης.

Εάν χρησιμοποιείτε μια εξαιρετικά αξιόπιστη κατανεμημένη κλειδαριά, τότε πρέπει να λάβετε υπόψη αυστηρά ζητήματα αξιοπιστίας. Το Redlock, από την άλλη, δεν πληροί την ορθότητα. Γιατί όχι? Οι ειδικοί απαριθμούν διάφορες πτυχές.

Σήμερα, πολλές γλώσσες προγραμματισμού χρησιμοποιούν εικονικές μηχανές με λειτουργίες GC, στο Full GC, το πρόγραμμα θα σταματήσει να επεξεργάζεται το GC, μερικές φορές το Full GC διαρκεί πολύ, ακόμη και το πρόγραμμα έχει μερικά λεπτά καθυστέρησης, το άρθρο παραθέτει το παράδειγμα HBase, HBase μερικές φορές GC για λίγα λεπτά, γεγονός που θα προκαλέσει τη λήξη της μίσθωσης. Για παράδειγμα, στην παρακάτω εικόνα, ο υπολογιστής-πελάτης 1 λαμβάνει ένα κλείδωμα και πρόκειται να επεξεργαστεί έναν κοινόχρηστο πόρο και όταν πρόκειται να επεξεργαστεί έναν κοινόχρηστο πόρο, το Full GC εμφανίζεται μέχρι να λήξει το κλείδωμα. Με αυτόν τον τρόπο, ο πελάτης 2 παίρνει ξανά το κλείδωμα και αρχίζει να εργάζεται στον κοινόχρηστο πόρο. Όταν το πρόγραμμα-πελάτης 2 κάνει επεξεργασία, το πρόγραμμα-πελάτης 1 ολοκληρώνει το πλήρες GC και ξεκινά την επεξεργασία κοινόχρηστων πόρων, έτσι ώστε και οι δύο υπολογιστές-πελάτες να επεξεργάζονται κοινόχρηστους πόρους.



Οι ειδικοί έδωσαν μια λύση, όπως φαίνεται στο παρακάτω σχήμα, μοιάζει με MVCC, φέρτε ένα διακριτικό στην κλειδαριά, το διακριτικό είναι η έννοια της έκδοσης, κάθε φορά που ολοκληρώνεται το κλείδωμα λειτουργίας, το διακριτικό θα προστίθεται 1, φέρτε το διακριτικό κατά την επεξεργασία κοινόχρηστων πόρων, μόνο η καθορισμένη έκδοση του διακριτικού μπορεί να χειριστεί τον κοινόχρηστο πόρο.



Στη συνέχεια, ο ειδικός είπε επίσης ότι ο αλγόριθμος βασίζεται στην τοπική ώρα και ότι ο Redis βασίζεται στη μέθοδο getTimeOfDay για να πάρει την ώρα αντί για το μονοτονικό ρολόι κατά το χειρισμό της λήξης του κλειδιού, κάτι που οδηγεί επίσης σε χρονικές ανακρίβειες. Για παράδειγμα, σε ένα σενάριο, δύο πελάτες 1 και πελάτης 2 έχουν 5 κόμβους redis (A, B, C, D και E).

1. Ο πελάτης 1 αποκτά με επιτυχία το κλείδωμα από τα A, B και C και λαμβάνει το χρονικό όριο κλειδώματος δικτύου από τα D και E.
2. Το ρολόι του κόμβου C είναι ανακριβές, προκαλώντας το χρονικό όριο κλειδώματος.
3. Ο πελάτης 2 αποκτά με επιτυχία το κλείδωμα από τα C, D και E και λαμβάνει το χρονικό όριο κλειδώματος δικτύου από τα A και B.
4. Με αυτόν τον τρόπο, τόσο ο πελάτης 1 όσο και ο πελάτης 2 κλειδώνουν.
Για να συνοψίσουμε τα δύο σημεία που λένε οι ειδικοί σχετικά με τη μη διαθεσιμότητα του Redlock:

1. Το GC και άλλα σενάρια μπορούν να συμβούν ανά πάσα στιγμή, προκαλώντας τον πελάτη να αποκτήσει κλείδωμα και το χρονικό όριο επεξεργασίας αναγκάζει έναν άλλο πελάτη να αποκτήσει το κλείδωμα. Οι ειδικοί έδωσαν επίσης μια λύση στη χρήση αυτοαυξητικών κουπονιών.
2. Ο αλγόριθμος βασίζεται στην τοπική ώρα και το ρολόι θα είναι ανακριβές, με αποτέλεσμα δύο πελάτες να κλειδώνουν ταυτόχρονα.
Επομένως, το συμπέρασμα που δίνουν οι ειδικοί είναι ότι το Redlock μπορεί να λειτουργήσει κανονικά μόνο στο εύρος περιορισμένης καθυστέρησης δικτύου, περιορισμένης διακοπής προγράμματος και περιορισμένου σφάλματος ρολογιού, αλλά τα όρια αυτών των τριών σεναρίων δεν μπορούν να επιβεβαιωθούν, επομένως οι ειδικοί δεν συνιστούν τη χρήση του Redlock. Για σενάρια με υψηλές απαιτήσεις ορθότητας, οι ειδικοί προτείνουν το Zookeeper, το οποίο θα συζητηθεί αργότερα χρησιμοποιώντας το Zookeeper ως κατανεμημένη κλειδαριά.

Απάντηση από τον συγγραφέα του Redis

Ο συγγραφέας του Redis απάντησε γράφοντας ένα blog αφού είδε το άρθρο του ειδικού. Ο συγγραφέας ευχαρίστησε ευγενικά τον ειδικό και στη συνέχεια εξέφρασε τη διαφωνία του με την άποψη του ειδικού.

Ζήτησα μια ανάλυση στην αρχική προδιαγραφή Redlock εδώ:http://redis.io/topics/distlock.Σε ευχαριστώ λοιπόν Martin. Ωστόσο, δεν συμφωνώ με την ανάλυση.


Η συζήτηση του συγγραφέα του REDIS σχετικά με τη χρήση διακριτικών για την επίλυση του προβλήματος του χρονικού ορίου κλειδώματος μπορεί να συνοψιστεί στα ακόλουθα πέντε σημεία:

Σημείο 1, η χρήση κατανεμημένων κλειδαριών είναι γενικά στο ότι δεν έχετε άλλο τρόπο να ελέγξετε τους κοινόχρηστους πόρους, οι ειδικοί χρησιμοποιούν διακριτικά για να εξασφαλίσουν την επεξεργασία των κοινόχρηστων πόρων, τότε δεν υπάρχει ανάγκη για κατανεμημένες κλειδαριές.
Σημείο 2: Για τη δημιουργία διακριτικών, προκειμένου να διασφαλιστεί η αξιοπιστία των διακριτικών που λαμβάνονται από διαφορετικούς πελάτες, η υπηρεσία που δημιουργεί διακριτικά εξακολουθεί να χρειάζεται κατανεμημένες κλειδαριές για να διασφαλίσει την αξιοπιστία της υπηρεσίας.
Σημείο 3, για τον τρόπο με τον οποίο οι ειδικοί λένε ότι τα αυτοαυξητικά διακριτικά, ο συγγραφέας του redis πιστεύει ότι είναι εντελώς περιττό, κάθε πελάτης μπορεί να δημιουργήσει ένα μοναδικό uuid ως διακριτικό και να ορίσει τον κοινόχρηστο πόρο σε μια κατάσταση που μόνο ο πελάτης με το uuid μπορεί να χειριστεί, έτσι ώστε άλλοι πελάτες να μην μπορούν να επεξεργαστούν τον κοινόχρηστο πόρο έως ότου ο πελάτης που αποκτά το κλείδωμα απελευθερώσει το κλείδωμα.
Όπως φαίνεται στο παραπάνω σχήμα, εάν ο πελάτης του διακριτικού 34 στείλει GC κατά τη διαδικασία εγγραφής και προκαλέσει τη λήξη του χρονικού ορίου του κλειδώματος, ένας άλλος πελάτης μπορεί να λάβει το κλείδωμα του διακριτικού 35 και να αρχίσει να γράφει ξανά, με αποτέλεσμα μια διένεξη κλειδώματος. Επομένως, η σειρά των token δεν μπορεί να συνδυαστεί με κοινόχρηστους πόρους.
Σημείο 5, ο συγγραφέας του redis πιστεύει ότι στα περισσότερα σενάρια, οι κατανεμημένες κλειδαριές χρησιμοποιούνται για τον χειρισμό προβλημάτων ενημέρωσης σε σενάρια μη συναλλαγών. Ο συγγραφέας θα πρέπει να εννοεί ότι υπάρχουν ορισμένα σενάρια όπου είναι δύσκολο να συνδυάσετε διακριτικά για να χειριστείτε κοινόχρηστους πόρους, επομένως πρέπει να βασιστείτε σε κλειδαριές για να κλειδώσετε πόρους και να τους επεξεργαστείτε.
Ένα άλλο πρόβλημα ρολογιού για το οποίο μιλούν οι ειδικοί, οι συγγραφείς του Redis δίνουν επίσης μια εξήγηση. Εάν ο χρόνος που απαιτείται για την απόκτηση της κλειδαριάς είναι πολύ μεγάλος και υπερβαίνει τον προεπιλεγμένο χρόνο χρονικού ορίου της κλειδαριάς, τότε ο πελάτης δεν μπορεί να αποκτήσει την κλειδαριά αυτήν τη στιγμή και δεν θα προταθούν παραδείγματα από ειδικούς.

Προσωπικά συναισθήματα

Το πρώτο πρόβλημα που συνοψίζω είναι ότι αφού ένας πελάτης αποκτήσει ένα κατανεμημένο κλείδωμα, το κλείδωμα μπορεί να απελευθερωθεί μετά από ένα χρονικό όριο κατά τη διάρκεια της επεξεργασίας του πελάτη. Προηγουμένως, όταν μιλάμε για το χρονικό όριο που ορίζεται από το κλείδωμα της βάσης δεδομένων των 2 λεπτών, εάν μια εργασία καταλαμβάνει ένα κλείδωμα παραγγελίας για περισσότερα από 2 λεπτά, τότε το άλλο κέντρο συναλλαγών μπορεί να αποκτήσει αυτό το κλείδωμα παραγγελίας, έτσι ώστε τα δύο κέντρα συναλλαγών να μπορούν να επεξεργαστούν την ίδια παραγγελία ταυτόχρονα. Υπό κανονικές συνθήκες, η εργασία υποβάλλεται σε επεξεργασία σε δευτερόλεπτα, αλλά μερικές φορές, το χρονικό όριο που ορίζεται με τη συμμετοχή σε μια αίτηση RPC είναι πολύ μεγάλο και υπάρχουν πολλά τέτοια αιτήματα χρονικού ορίου σε μια εργασία, τότε είναι πιθανό να ξεπεραστεί ο χρόνος αυτόματου ξεκλειδώματος. Αν γράψουμε σε java, μπορεί να υπάρχει Full GC στη μέση, οπότε αφού ξεκλειδωθεί το κλείδωμα μετά το χρονικό όριο κλειδώματος, ο πελάτης δεν μπορεί να το αντιληφθεί, κάτι που είναι πολύ σοβαρό. Δεν νομίζω ότι αυτό είναι πρόβλημα με την ίδια την κλειδαριά, εφόσον οποιαδήποτε κατανεμημένη κλειδαριά που αναφέρεται παραπάνω έχει τα χαρακτηριστικά της απελευθέρωσης χρονικού ορίου, τέτοιο πρόβλημα θα προκύψει. Εάν χρησιμοποιείτε τη λειτουργία χρονικού ορίου κλειδώματος, ο υπολογιστής-πελάτης πρέπει να ορίσει το χρονικό όριο κλειδώματος και να προβεί σε ανάλογες ενέργειες, αντί να συνεχίσει να επεξεργάζεται τον κοινόχρηστο πόρο. Ο αλγόριθμος του Redlock επιστρέφει τον χρόνο κλειδώματος που μπορεί να καταλάβει ο πελάτης αφού ο πελάτης αποκτήσει το κλείδωμα και ο πελάτης πρέπει να επεξεργαστεί αυτόν τον χρόνο για να σταματήσει την εργασία μετά από αυτόν τον χρόνο.

Το δεύτερο πρόβλημα είναι ότι οι κατανεμημένοι ειδικοί δεν καταλαβαίνουν το Redlock. Ένα βασικό χαρακτηριστικό του Redlock είναι ότι ο χρόνος για την απόκτηση της κλειδαριάς είναι ο συνολικός χρόνος που η κλειδαριά λήγει από προεπιλογή μείον τον χρόνο που χρειάζεται για την απόκτηση της κλειδαριάς, έτσι ώστε ο χρόνος που χρειάζεται για την επεξεργασία του πελάτη να είναι σχετικός χρόνος, ανεξάρτητα από την τοπική ώρα.

Από αυτή την άποψη, η ορθότητα του Redlock μπορεί να είναι καλά εγγυημένη. Προσεκτική ανάλυση του Redlock, σε σύγκριση με το redis ενός κόμβου, το κύριο χαρακτηριστικό που παρέχει το Redlock είναι η υψηλότερη αξιοπιστία, η οποία είναι ένα σημαντικό χαρακτηριστικό σε ορισμένα σενάρια. Αλλά νομίζω ότι η Redlock έχει ξοδέψει πάρα πολλά χρήματα για να επιτύχει αξιοπιστία.

  • Πρώτον, πρέπει να αναπτυχθούν 5 κόμβοι για να γίνει το Redlock πιο αξιόπιστο.
  • Στη συνέχεια, πρέπει να ζητήσετε 5 κόμβους για να λάβετε το κλείδωμα και μέσω της μεθόδου Future, μπορείτε πρώτα να ζητήσετε σε 5 κόμβους ταυτόχρονα και, στη συνέχεια, να συγκεντρώσετε το αποτέλεσμα απόκρισης, το οποίο μπορεί να συντομεύσει τον χρόνο απόκρισης, αλλά εξακολουθεί να χρειάζεται περισσότερος χρόνος από ένα κλείδωμα redis ενός κόμβου.
  • Στη συνέχεια, επειδή πρέπει να ληφθούν περισσότεροι από 3 από τους 5 κόμβους, μπορεί να υπάρξει διένεξη κλειδώματος, δηλαδή, όλοι έχουν αποκτήσει 1-2 κλειδαριές, και ως αποτέλεσμα, κανείς δεν μπορεί να πάρει την κλειδαριά, αυτό το πρόβλημα, ο συγγραφέας του Redis δανείζεται την ουσία του αλγορίθμου σχεδίας, μέσω της σύγκρουσης σε τυχαίο χρόνο, ο χρόνος σύγκρουσης μπορεί να μειωθεί σημαντικά, αλλά αυτό το πρόβλημα δεν μπορεί να αποφευχθεί πολύ καλά, ειδικά όταν η κλειδαριά αποκτάται για πρώτη φορά, οπότε το κόστος χρόνου απόκτησης της κλειδαριάς αυξάνεται.
  • Εάν 2 από τους 5 κόμβους είναι εκτός λειτουργίας, η διαθεσιμότητα της κλειδαριάς θα μειωθεί σημαντικά, πρώτα απ 'όλα, πρέπει να περιμένετε να λήξει το χρονικό όριο των αποτελεσμάτων αυτών των δύο κατεστραμμένων κόμβων πριν επιστρέψετε, και υπάρχουν μόνο 3 κόμβοι και ο πελάτης πρέπει να αποκτήσει τις κλειδαριές και των 3 κόμβων για να έχει το κλείδωμα, κάτι που είναι επίσης πιο δύσκολο.
  • Εάν υπάρχει διαμέρισμα δικτύου, τότε μπορεί να υπάρξει μια κατάσταση όπου ο πελάτης δεν θα μπορέσει ποτέ να αποκτήσει το κλείδωμα.


Μετά την ανάλυση τόσων πολλών λόγων, νομίζω ότι το πιο κρίσιμο σημείο του προβλήματος του Redlock είναι ότι το Redlock απαιτεί από τους πελάτες να διασφαλίζουν τη συνέπεια των εγγραφών και οι 5 κόμβοι υποστήριξης είναι εντελώς ανεξάρτητοι και όλοι οι πελάτες πρέπει να χειρίζονται αυτούς τους 5 κόμβους. Εάν υπάρχει ένας ηγέτης μεταξύ 5 κόμβων, ο πελάτης μπορεί να συγχρονίσει τα δεδομένα του ηγέτη, εφόσον ο πελάτης λάβει το κλείδωμα από τον ηγέτη, έτσι ώστε να μην υπάρχουν προβλήματα όπως κατάτμηση, χρονικά όρια και διενέξεις. Επομένως, προκειμένου να διασφαλιστεί η ορθότητα των κατανεμημένων κλειδαριών, νομίζω ότι η χρήση μιας κατανεμημένης υπηρεσίας συντονισμού με ισχυρή συνέπεια μπορεί να λύσει καλύτερα το πρόβλημα.

Τίθεται ξανά το ερώτημα, πόσο καιρό πρέπει να ορίσω τον χρόνο λήξης; Ο τρόπος ρύθμισης του χρόνου ακύρωσης είναι πολύ σύντομος και το κλείδωμα απελευθερώνεται αυτόματα πριν εκτελεστεί η μέθοδος, τότε θα υπάρξουν προβλήματα συγχρονισμού. Εάν χρειαστεί πολύς χρόνος, άλλα νήματα που παίρνουν την κλειδαριά μπορεί να χρειαστεί να περιμένουν πολύ.

Αυτό το πρόβλημα υπάρχει επίσης με τη χρήση βάσεων δεδομένων για την υλοποίηση κατανεμημένων κλειδαριών.

Η τρέχουσα κύρια προσέγγιση σε αυτό το πρόβλημα είναι να ορίσετε ένα σύντομο χρονικό όριο για κάθε κλείδωμα που λαμβάνεται και να ξεκινήσετε ένα νήμα για να ανανεώνετε το χρονικό όριο κλειδώματος κάθε φορά που πρόκειται να φτάσει στο χρονικό όριο. Τερματίστε αυτό το νήμα ταυτόχρονα με την απελευθέρωση της κλειδαριάς. Για παράδειγμα, το redisson, το επίσημο κατανεμημένο στοιχείο κλειδώματος του redis, χρησιμοποιεί αυτή τη λύση.

Πλεονεκτήματα της χρήσης προσωρινής αποθήκευσης για την εφαρμογή κατανεμημένων κλειδαριών
Καλή απόδοση.

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

Κατανεμημένες κλειδαριές με βάση την εφαρμογή του Zookeeper

Κατανεμημένες κλειδαριές με βάση τους προσωρινά διατεταγμένους κόμβους του Zookeeper.

Η γενική ιδέα είναι ότι όταν κάθε πελάτης κλειδώνει μια μέθοδο, δημιουργείται ένας μοναδικός στιγμιαίος διατεταγμένος κόμβος στον κατάλογο του καθορισμένου κόμβου που αντιστοιχεί στη μέθοδο στο zookeeper. Ο τρόπος για να προσδιορίσετε εάν θα πάρετε μια κλειδαριά είναι απλός, χρειάζεται μόνο να προσδιορίσετε αυτόν με τον μικρότερο σειριακό αριθμό στον διατεταγμένο κόμβο. Όταν απελευθερωθεί η κλειδαριά, απλώς διαγράψτε τον στιγμιαίο κόμβο. Ταυτόχρονα, μπορεί να αποφύγει το πρόβλημα των αδιεξόδων που προκαλούνται από διακοπές λειτουργίας της υπηρεσίας που δεν μπορούν να απελευθερωθούν.

Ας δούμε αν το Zookeeper μπορεί να λύσει τα προβλήματα που αναφέρθηκαν προηγουμένως.

  • Η κλειδαριά δεν θα απελευθερωθεί; Η χρήση του Zookeeper μπορεί να λύσει αποτελεσματικά το πρόβλημα της μη απελευθέρωσης των κλειδαριών, επειδή κατά τη δημιουργία μιας κλειδαριάς, ο πελάτης θα δημιουργήσει έναν προσωρινό κόμβο στο ZK και μόλις ο πελάτης αποκτήσει την κλειδαριά και την κρεμάσει ξαφνικά (η σύνδεση συνεδρίας έχει διακοπεί), τότε ο προσωρινός κόμβος θα διαγραφεί αυτόματα. Άλλοι πελάτες μπορούν να πάρουν ξανά την κλειδαριά.
  • Κλειδαριές που δεν μπλοκάρουν; Μόλις αλλάξει ο κόμβος, το Zookeeper θα ειδοποιήσει τον πελάτη και ο πελάτης μπορεί να ελέγξει εάν ο κόμβος που δημιούργησε είναι ο μικρότερος τακτικός αριθμός μεταξύ όλων των κόμβων.
  • Δεν μπορείτε να εισέλθετε ξανά; Όταν ο πελάτης δημιουργεί έναν κόμβο, γράφει απευθείας τις πληροφορίες κεντρικού υπολογιστή και τις πληροφορίες νήματος του τρέχοντος πελάτη στον κόμβο και την επόμενη φορά που θέλετε να λάβετε το κλείδωμα, μπορείτε να το συγκρίνετε με τα δεδομένα στον τρέχοντα μικρότερο κόμβο. Εάν οι πληροφορίες είναι ίδιες με τις δικές σας, τότε μπορείτε να αποκτήσετε απευθείας την κλειδαριά και εάν είναι διαφορετική, να δημιουργήσετε έναν προσωρινό διαδοχικό κόμβο για να συμμετάσχετε στην ουρά.


Τίθεται ξανά το ερώτημα, γνωρίζουμε ότι το Zookeeper πρέπει να αναπτυχθεί σε συστάδες, θα υπάρξουν προβλήματα συγχρονισμού δεδομένων όπως τα συμπλέγματα Redis;

Το Zookeeper είναι ένα κατανεμημένο εξάρτημα που εγγυάται αδύναμη συνέπεια, δηλαδή τελική συνέπεια.

Το Zookeeper χρησιμοποιεί ένα πρωτόκολλο συγχρονισμού δεδομένων που ονομάζεται Quorum Based Protocol. Εάν υπάρχουν διακομιστές N Zookeeper στο σύμπλεγμα Zookeeper (το N είναι συνήθως περιττό, 3 μπορούν να ανταποκριθούν στην αξιοπιστία δεδομένων και να έχουν υψηλή απόδοση ανάγνωσης και εγγραφής και 5 έχουν την καλύτερη ισορροπία μεταξύ αξιοπιστίας δεδομένων και απόδοσης ανάγνωσης και εγγραφής), τότε μια λειτουργία εγγραφής του χρήστη συγχρονίζεται πρώτα με διακομιστές N/2 + 1 και στη συνέχεια επιστρέφεται στον χρήστη, προτρέποντας τον χρήστη να γράψει με επιτυχία. Το πρωτόκολλο συγχρονισμού δεδομένων που βασίζεται στο πρωτόκολλο βάσει απαρτίας καθορίζει τη συνέπεια της ισχύος που μπορεί να υποστηρίξει το Zookeeper.

Σε ένα κατανεμημένο περιβάλλον, η αποθήκευση δεδομένων που πληροί ισχυρή συνέπεια είναι βασικά ανύπαρκτη και απαιτεί τη σύγχρονη ενημέρωση όλων των κόμβων κατά την ενημέρωση των δεδομένων ενός κόμβου. Αυτή η στρατηγική συγχρονισμού εμφανίζεται στη βάση δεδομένων σύγχρονης αναπαραγωγής master-slave. Ωστόσο, αυτή η στρατηγική συγχρονισμού έχει πολύ μεγάλο αντίκτυπο στην απόδοση εγγραφής και σπάνια παρατηρείται στην πράξη. Επειδή το Zookeeper γράφει κόμβους N/2+1 συγχρονισμένα και οι κόμβοι N/2 δεν ενημερώνονται συγχρονισμένα, το Zookeeper δεν είναι πολύ συνεπές.

Η λειτουργία ενημέρωσης δεδομένων του χρήστη δεν εγγυάται ότι οι επόμενες αναγνώσεις θα διαβάσουν την ενημερωμένη τιμή, αλλά τελικά θα δείξουν συνέπεια. Η θυσία της συνέπειας δεν σημαίνει ότι αγνοούμε εντελώς τη συνέπεια των δεδομένων, διαφορετικά τα δεδομένα είναι χαοτικά, επομένως όσο υψηλή κι αν είναι η διαθεσιμότητα του συστήματος, όσο καλή κι αν είναι η διανομή, δεν έχει καμία αξία. Η θυσία της συνέπειας είναι ακριβώς ότι δεν απαιτείται πλέον ισχυρή συνέπεια στις σχεσιακές βάσεις δεδομένων, αλλά εφόσον το σύστημα μπορεί να επιτύχει τελική συνέπεια.

Μια ερώτηση ενός σημείου; Η χρήση του Zookeeper μπορεί να λύσει αποτελεσματικά ένα πρόβλημα ενός σημείου, το ZK αναπτύσσεται σε συμπλέγματα, εφόσον επιβιώνουν περισσότερα από τα μισά μηχανήματα του συμπλέγματος, η υπηρεσία μπορεί να παρέχεται στον έξω κόσμο.

Θέματα δικαιοσύνης; Η χρήση του Zookeeper μπορεί να λύσει το πρόβλημα των δίκαιων κλειδαριών, οι προσωρινοί κόμβοι που δημιουργούνται από τον πελάτη στο ZK είναι τακτικοί και κάθε φορά που απελευθερώνεται η κλειδαριά, η ZK μπορεί να ειδοποιήσει τον μικρότερο κόμβο για να αποκτήσει την κλειδαριά, διασφαλίζοντας δικαιοσύνη.

Τίθεται ξανά το ερώτημα, γνωρίζουμε ότι το Zookeeper πρέπει να αναπτυχθεί σε συστάδες, θα υπάρξουν προβλήματα συγχρονισμού δεδομένων όπως τα συμπλέγματα Redis;

Το Zookeeper είναι ένα κατανεμημένο εξάρτημα που εγγυάται αδύναμη συνέπεια, δηλαδή τελική συνέπεια.

Το Zookeeper χρησιμοποιεί ένα πρωτόκολλο συγχρονισμού δεδομένων που ονομάζεται Quorum Based Protocol. Εάν υπάρχουν διακομιστές N Zookeeper στο σύμπλεγμα Zookeeper (το N είναι συνήθως περιττό, 3 μπορούν να ανταποκριθούν στην αξιοπιστία δεδομένων και να έχουν υψηλή απόδοση ανάγνωσης και εγγραφής και 5 έχουν την καλύτερη ισορροπία μεταξύ αξιοπιστίας δεδομένων και απόδοσης ανάγνωσης και εγγραφής), τότε μια λειτουργία εγγραφής του χρήστη συγχρονίζεται πρώτα με διακομιστές N/2 + 1 και στη συνέχεια επιστρέφεται στον χρήστη, προτρέποντας τον χρήστη να γράψει με επιτυχία. Το πρωτόκολλο συγχρονισμού δεδομένων που βασίζεται στο πρωτόκολλο βάσει απαρτίας καθορίζει τη συνέπεια της ισχύος που μπορεί να υποστηρίξει το Zookeeper.

Σε ένα κατανεμημένο περιβάλλον, η αποθήκευση δεδομένων που πληροί ισχυρή συνέπεια είναι βασικά ανύπαρκτη και απαιτεί τη σύγχρονη ενημέρωση όλων των κόμβων κατά την ενημέρωση των δεδομένων ενός κόμβου. Αυτή η στρατηγική συγχρονισμού εμφανίζεται στη βάση δεδομένων σύγχρονης αναπαραγωγής master-slave. Ωστόσο, αυτή η στρατηγική συγχρονισμού έχει πολύ μεγάλο αντίκτυπο στην απόδοση εγγραφής και σπάνια παρατηρείται στην πράξη. Επειδή το Zookeeper γράφει κόμβους N/2+1 συγχρονισμένα και οι κόμβοι N/2 δεν ενημερώνονται συγχρονισμένα, το Zookeeper δεν είναι πολύ συνεπές.

Η λειτουργία ενημέρωσης δεδομένων του χρήστη δεν εγγυάται ότι οι επόμενες αναγνώσεις θα διαβάσουν την ενημερωμένη τιμή, αλλά τελικά θα δείξουν συνέπεια. Η θυσία της συνέπειας δεν σημαίνει ότι αγνοούμε εντελώς τη συνέπεια των δεδομένων, διαφορετικά τα δεδομένα είναι χαοτικά, επομένως όσο υψηλή κι αν είναι η διαθεσιμότητα του συστήματος, όσο καλή κι αν είναι η διανομή, δεν έχει καμία αξία. Η θυσία της συνέπειας είναι ακριβώς ότι δεν απαιτείται πλέον ισχυρή συνέπεια στις σχεσιακές βάσεις δεδομένων, αλλά εφόσον το σύστημα μπορεί να επιτύχει τελική συνέπεια.

Το αν το Zookeeper πληροί την αιτιώδη συνέπεια εξαρτάται από τον τρόπο προγραμματισμού του πελάτη.

Πρακτικές που δεν ικανοποιούν την αιτιώδη συνάφεια

  • Η διαδικασία Α γράφει ένα κομμάτι δεδομένων στο /z του Zookeeper και επιστρέφει με επιτυχία
  • Η διαδικασία Α ενημερώνει τη διαδικασία Β ότι ο Α έχει τροποποιήσει τα δεδομένα του /z
  • Ο Β διαβάζει τα δεδομένα του /z του Zookeeper
  • Δεδομένου ότι ο διακομιστής του Zookeeper που είναι συνδεδεμένος με τον Β μπορεί να μην έχει ενημερωθεί με τα γραπτά δεδομένα του Α, τότε ο Β δεν θα μπορεί να διαβάσει τα γραπτά δεδομένα του Α


Πρακτικές που πληρούν την αιτιώδη συνέπεια

  • Η διαδικασία Β ακούει για αλλαγές δεδομένων στο /z στο Zookeeper
  • Η διαδικασία Α γράφει ένα κομμάτι δεδομένων στο /z του Zookeeper και πριν επιστρέψει με επιτυχία, ο Zookeeper πρέπει να καλέσει τον ακροατή που είναι εγγεγραμμένος στο /z και ο αρχηγός θα ειδοποιήσει τον Β για την αλλαγή δεδομένων
  • Αφού απαντηθεί η μέθοδος απόκρισης συμβάντος της διαδικασίας Β, παίρνει τα αλλαγμένα δεδομένα, οπότε το Β θα μπορεί σίγουρα να λάβει την αλλαγμένη τιμή
  • Η αιτιώδης συνέπεια εδώ αναφέρεται στην αιτιώδη συνέπεια μεταξύ του Leader και του B, δηλαδή, ο ηγέτης ειδοποιεί τα δεδομένα για μια αλλαγή


Ο δεύτερος μηχανισμός ακρόασης συμβάντων είναι επίσης η μέθοδος που πρέπει να χρησιμοποιηθεί για τον σωστό προγραμματισμό του Zookeeper, επομένως το Zookeeper θα πρέπει να πληροί την αιτιώδη συνέπεια

Επομένως, όταν εφαρμόζουμε κατανεμημένες κλειδαριές με βάση το Zookeeper, θα πρέπει να χρησιμοποιούμε την πρακτική της ικανοποίησης της αιτιώδους συνέπειας, δηλαδή τα νήματα που περιμένουν την κλειδαριά ακούν τις αλλαγές στην κλειδαριά του Zookeeper και όταν απελευθερωθεί η κλειδαριά, το Zookeeper θα ειδοποιήσει το νήμα αναμονής που πληροί τις συνθήκες δίκαιης κλειδαριάς.

Μπορείτε να χρησιμοποιήσετε απευθείας το πρόγραμμα-πελάτη βιβλιοθήκης τρίτου μέρους Zookeeper, το οποίο ενσωματώνει μια υπηρεσία κλειδώματος επανεισόδου.

Οι κατανεμημένες κλειδαριές που υλοποιούνται με το ZK φαίνεται να ταιριάζουν ακριβώς σε αυτό που περιμέναμε από μια κατανεμημένη κλειδαριά στην αρχή αυτού του άρθρου. Ωστόσο, δεν είναι, και η κατανεμημένη κλειδαριά που εφαρμόζει η Zookeeper έχει στην πραγματικότητα ένα μειονέκτημα, δηλαδή η απόδοση μπορεί να μην είναι τόσο υψηλή όσο αυτή της υπηρεσίας προσωρινής αποθήκευσης. Επειδή κάθε φορά στη διαδικασία δημιουργίας και απελευθέρωσης μιας κλειδαριάς, οι στιγμιαίοι κόμβοι πρέπει να δημιουργούνται και να καταστρέφονται δυναμικά για να πραγματοποιηθεί η λειτουργία κλειδώματος. Η δημιουργία και η διαγραφή κόμβων στο ZK μπορεί να πραγματοποιηθεί μόνο μέσω του διακομιστή οδηγού και, στη συνέχεια, τα δεδομένα κοινοποιούνται σε όλα τα μηχανήματα που ακολουθούν.

Πλεονεκτήματα της χρήσης του Zookeeper για την εφαρμογή κατανεμημένων κλειδαριών
Επιλύστε αποτελεσματικά προβλήματα ενός σημείου, προβλήματα μη επανεισόδου, προβλήματα μη αποκλεισμού και αποτυχία απελευθέρωσης κλειδώματος. Είναι σχετικά απλό στην εφαρμογή.

Μειονεκτήματα της χρήσης του Zookeeper για την εφαρμογή κατανεμημένων κλειδαριών
Η απόδοση δεν είναι τόσο καλή όσο η χρήση της προσωρινής μνήμης για την υλοποίηση κατανεμημένων κλειδωμάτων. Απαιτείται κατανόηση των αρχών της ΖΚ.

Σύγκριση των τριών επιλογών

Από την άποψη της ευκολίας κατανόησης (από χαμηλά σε υψηλά)
Βάση δεδομένων > Cache > Zookeeper

Από την άποψη της πολυπλοκότητας της υλοποίησης (από χαμηλή σε υψηλή)
Zookeeper > προσωρινή μνήμη > βάσεις δεδομένων

Από την άποψη της απόδοσης (από ψηλά σε χαμηλά)
Προσωρινή αποθήκευση > βάση δεδομένων Zookeeper >=

Από την άποψη της αξιοπιστίας (από ψηλά σε χαμηλά)
Zookeeper > προσωρινή μνήμη > βάσεις δεδομένων





Προηγούμενος:Διαφορά σχολιασμών @Bean άνοιξης έναντι @Service
Επόμενος:Μάθετε τη γλώσσα C από το μηδέν εκπαιδευτικό βίντεο
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 22/9/2020 5:34:33 μ.μ. |
[Πραγματική μάχη]. Το NET Core υλοποιεί κατανεμημένες κλειδαριές με βάση το Redis
https://www.itsvse.com/thread-9391-1-1.html

.net/c# Υλοποίηση κατανεμημένου κλειδώματος Zookeeper [Πηγαίος κώδικας]
https://www.itsvse.com/thread-4651-1-1.html

Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com