Cloister → απλή διαχείριση συστάδων OTP

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

Cloister → απλή διαχείριση συστάδων OTP

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

Το μήνυμα που διέρχεται μεταξύ διεργασιών σε διαφορετικούς κόμβους, καθώς και μεταξύ συνδέσμων και οθονών, είναι διαφανές […]

Στην πράξη, όλα είναι λίγο πιο περίπλοκα. Διανέμονται Έρλανγκ αναπτύχθηκε όταν το "κοντέινερ" σήμαινε ένα μεγάλο σιδερένιο κιβώτιο για τη ναυτιλία και το "docker" ήταν απλώς συνώνυμο του longshoreman. ΣΕ IP4 υπήρχαν πολλές μη κατειλημμένες διευθύνσεις, οι διακοπές δικτύου συνήθως προκλήθηκαν από αρουραίους που μασούσαν μέσα από το καλώδιο και ο μέσος χρόνος λειτουργίας του συστήματος παραγωγής μετρήθηκε σε δεκαετίες.

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

Σημείωση: Γνωρίζω ότι υπάρχει libcluster. Είναι πραγματικά υπέροχο, έχει πάνω από χίλια αστέρια, ο συγγραφέας είναι διάσημος στην κοινότητα και όλα αυτά. Εάν οι μέθοδοι που προσφέρει αυτό το πακέτο για τη δημιουργία και τη διατήρηση ενός cluster είναι αρκετές για εσάς, χαίρομαι για εσάς. Δυστυχώς χρειάζομαι πολύ περισσότερα. Θέλω να ελέγχω το στήσιμο λεπτομερώς και να μην είμαι εξωτερικός θεατής στο θέατρο της αναδιοργάνωσης του cluster.

Απαιτήσεις

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

  • διαφανής εργασία τόσο με μια σκληρά κωδικοποιημένη λίστα κόμβων όσο και με δυναμική ανακάλυψη μέσω υπηρεσιών Έρλανγκ;
  • πλήρως λειτουργική επανάκληση για κάθε αλλαγή τοπολογίας (κόμβος εκεί, κόμβος εδώ, αστάθεια δικτύου, διαχωρισμοί).
  • διαφανής διεπαφή για την εκκίνηση ενός συμπλέγματος με μεγάλα και σύντομα ονόματα, όπως και με :nonode@nohost;
  • Υποστήριξη Docker out of the box, χωρίς να χρειάζεται να γράψετε κώδικα υποδομής.

Το τελευταίο σημαίνει ότι αφού δοκίμασα την εφαρμογή τοπικά στο :nonode@nohost, ή σε ένα τεχνητά κατανεμημένο περιβάλλον χρησιμοποιώντας test_cluster_task, απλά θέλω να τρέξω docker-compose up --scale my_app=3 και δείτε πώς εκτελεί τρεις περιπτώσεις στο docker χωρίς καμία αλλαγή κώδικα. Θέλω επίσης εξαρτημένες εφαρμογές όπως mnesia - όταν αλλάζει η τοπολογία, στα παρασκήνια ξαναφτιάχνουν το cluster ζωντανά χωρίς κανένα πρόσθετο χτύπημα από την εφαρμογή.

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

Επιλεγμένη προσέγγιση

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

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

config :cloister,
  otp_app: :my_app,
  sentry: :"cloister.local", # or ~w|n1@foo n2@bar|a
  consensus: 3,              # number of nodes to consider
                             #    the cluster is up
  listener: MyApp.Listener   # listener to be called when
                             #    the ring has changed

Οι παραπάνω παράμετροι σημαίνουν κυριολεκτικά τα εξής: Μοναστήρι χρησιμοποιείται για την εφαρμογή OTP :my_app, χρήσεις ανακάλυψη της υπηρεσίας erlang για να συνδέσετε κόμβους, τουλάχιστον τρεις, και MyApp.Listener ενότητα (εφαρμογή @behaviour Cloister.Listener) έχει ρυθμιστεί να λαμβάνει ειδοποιήσεις σχετικά με αλλαγές τοπολογίας. Μια λεπτομερής περιγραφή της πλήρους διαμόρφωσης μπορείτε να βρείτε στο τεκμηρίωση.

Με αυτή τη διαμόρφωση, η εφαρμογή Μοναστήρι θα εκκίνηση σταδιακά, καθυστερώντας τη διαδικασία εκκίνησης της κύριας εφαρμογής μέχρι να επιτευχθεί συναίνεση (τρεις κόμβοι συνδέονται και συνδέονται, όπως στο παραπάνω παράδειγμα.) Αυτό δίνει στην κύρια εφαρμογή την ευκαιρία να υποθέσει ότι όταν ξεκινήσει, το σύμπλεγμα είναι ήδη διαθέσιμο. Κάθε φορά που αλλάζει η τοπολογία (θα υπάρχουν πολλά από αυτά, επειδή οι κόμβοι δεν ξεκινούν εντελώς συγχρονισμένα), ο χειριστής θα καλείται MyApp.Listener.on_state_change/2. Τις περισσότερες φορές εκτελούμε μια ενέργεια όταν λαμβάνουμε ένα μήνυμα κατάστασης %Cloister.Monitor{status: :up}, που σημαίνει: "Γεια σας, το σύμπλεγμα έχει συναρμολογηθεί."

Στις περισσότερες περιπτώσεις, εγκατάσταση consensus: 3 είναι βέλτιστη γιατί ακόμα κι αν περιμένουμε να συνδεθούν περισσότεροι κόμβοι, η επανάκληση θα περάσει status: :rehashingstatus: :up σε οποιονδήποτε κόμβο που προστέθηκε ή αφαιρέθηκε πρόσφατα.

Κατά την εκκίνηση σε λειτουργία ανάπτυξης, πρέπει απλώς να ρυθμίσετε consensus: 1 и Μοναστήρι θα παραλείψει ευχαρίστως την αναμονή για τη συναρμολόγηση συμπλέγματος όταν δει :nonode@nohostΉ :node@hostΉ :[email protected] - ανάλογα με το πώς διαμορφώθηκε ο κόμβος (:none | :shortnames | :longnames).

Διαχείριση κατανεμημένων εφαρμογών

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

Το κύριο πλεονέκτημα της χρήσης Μοναστήρι είναι ότι εκτελεί όλες τις απαραίτητες λειτουργίες για την ανοικοδόμηση του συμπλέγματος μετά από μια αλλαγή τοπολογίας κάτω από την κουκούλα. Η εφαρμογή απλά εκτελείται σε ένα ήδη προετοιμασμένο κατανεμημένο περιβάλλον, με όλους τους κόμβους συνδεδεμένους, ανεξάρτητα από το αν γνωρίζουμε εκ των προτέρων τις διευθύνσεις IP και επομένως τα ονόματα των κόμβων ή έχουν εκχωρηθεί/αλλαγεί δυναμικά. Αυτό δεν απαιτεί καμία απολύτως ειδική ρύθμιση παραμέτρων του docker και από την άποψη ενός προγραμματιστή εφαρμογών, δεν υπάρχει διαφορά μεταξύ εκτέλεσης σε κατανεμημένο περιβάλλον ή εκτέλεσης σε τοπικό. :nonode@nohost. Μπορείτε να διαβάσετε περισσότερα για αυτό στο τεκμηρίωση.

Αν και πολύπλοκος χειρισμός αλλαγών τοπολογίας είναι δυνατός μέσω μιας προσαρμοσμένης υλοποίησης MyApp.Listener, μπορεί πάντα να υπάρχουν περιπτώσεις ακμών όπου αυτοί οι περιορισμοί της βιβλιοθήκης και οι προκαταλήψεις διαμόρφωσης αποδεικνύονται οι ακρογωνιαίοι λίθοι της υλοποίησης. Δεν πειράζει, απλά πάρτε τα παραπάνω libcluster, που είναι πιο γενικής χρήσης ή ακόμη και να χειριστείτε μόνοι σας το σύμπλεγμα χαμηλού επιπέδου. Ο στόχος αυτής της βιβλιοθήκης κωδικών δεν είναι να καλύψει κάθε πιθανό σενάριο, αλλά να χρησιμοποιήσει το πιο συνηθισμένο σενάριο χωρίς περιττό πόνο και δυσκίνητη αντιγραφή-επικόλληση.

Σημείωση: Σε αυτό το σημείο στο πρωτότυπο υπήρχε η φράση "Happy clustering!" και το Yandex, με το οποίο μεταφράζω (δεν χρειάζεται να περάσω από λεξικά ο ίδιος), μου πρόσφερε την επιλογή "Happy clustering!" Είναι ίσως αδύνατο να φανταστεί κανείς μια καλύτερη μετάφραση, ειδικά υπό το πρίσμα της τρέχουσας γεωπολιτικής κατάστασης.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο