Σχεδόν κάθε επιτυχημένη επιχειρηματική εφαρμογή αργά ή γρήγορα εισέρχεται σε μια φάση όπου απαιτείται οριζόντια κλιμάκωση. Σε πολλές περιπτώσεις, μπορείτε απλά να ξεκινήσετε μια νέα παρουσία και να μειώσετε τον μέσο όρο φορτίου. Υπάρχουν όμως και λιγότερο ασήμαντες περιπτώσεις όπου πρέπει να διασφαλίσουμε ότι διαφορετικοί κόμβοι γνωρίζουν ο ένας τον άλλον και κατανέμουν προσεκτικά τον φόρτο εργασίας.
Αποδείχθηκε τόσο τυχερό που Έρλανγκ, που επιλέξαμε για την ευχάριστη σύνταξη και το hype γύρω του, έχει μια πρώτης τάξεως
Το μήνυμα που διέρχεται μεταξύ διεργασιών σε διαφορετικούς κόμβους, καθώς και μεταξύ συνδέσμων και οθονών, είναι διαφανές […]
Στην πράξη, όλα είναι λίγο πιο περίπλοκα. Διανέμονται Έρλανγκ αναπτύχθηκε όταν το "κοντέινερ" σήμαινε ένα μεγάλο σιδερένιο κιβώτιο για τη ναυτιλία και το "docker" ήταν απλώς συνώνυμο του longshoreman. ΣΕ IP4 υπήρχαν πολλές μη κατειλημμένες διευθύνσεις, οι διακοπές δικτύου συνήθως προκλήθηκαν από αρουραίους που μασούσαν μέσα από το καλώδιο και ο μέσος χρόνος λειτουργίας του συστήματος παραγωγής μετρήθηκε σε δεκαετίες.
Τώρα είμαστε όλοι απίστευτα αυτάρκεις, συσκευασμένοι και διανεμημένοι Έρλανγκ σε ένα περιβάλλον όπου οι δυναμικές διευθύνσεις IP διανέμονται με βάση την αρχή της μεγάλης τυχαιότητας και οι κόμβοι μπορούν να εμφανιστούν και να εξαφανιστούν ανάλογα με την ιδιοτροπία της αριστερής φτέρνας του προγραμματιστή. Για να αποφύγετε σωρεία κωδικών λέβητα σε κάθε έργο που εκτελείται ένα κατανεμημένο Έρλανγκ, για την καταπολέμηση του εχθρικού περιβάλλοντος, απαιτείται βοήθεια.
Σημείωση: Γνωρίζω ότι υπάρχει libcluster
Απαιτήσεις
Αυτό που χρειαζόμουν προσωπικά ήταν μια βιβλιοθήκη που θα αναλάμβανε τη διαχείριση του 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: :rehashing
→ status: :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