Εισαγωγή
High Availability Proxy (HAProxy), είναι μια δημοφιλής λύση ανοικτού κώδικα για proxying και TCP/HTTP εξισορροπητή φορτίου που μπορεί να εκτελεστεί σε Solaris, FreeBSD, και Linux. Χρησιμοποιείται συχνότερα για τη βελτίωση της αξιοπιστίας και της απόδοσης ενός περιβάλλοντος διακομιστών, παρέχοντας ισορροπημένη κατανομή του φόρτου εργασίας σε πολλαπλούς διακομιστές. Αυτός ο τύπος εργαλείου χρησιμοποιείται σε πολλά περιβάλλοντα υψηλού προφίλ, όπως το Instagram, το GitHub, το Twitter και το Imgur.
Αυτός ο οδηγός θα σας εισαγάγει στο HAProxy, θα σας εξοικειώσει με την ορολογία της εξισορρόπησης φορτίου και θα σας δώσει παραδείγματα για το πώς θα μπορούσε να αξιοποιηθεί για την ενίσχυση τόσο της απόδοσης όσο και της αξιοπιστίας των περιβαλλόντων διακομιστών.
Βασικοί όροι του HAProxy
Πριν μπούμε στις λεπτομέρειες της εξισορρόπησης φορτίου και του proxying, υπάρχουν ορισμένοι σημαντικοί όροι και έννοιες με τις οποίες πρέπει να εξοικειωθείτε. Θα ξεκινήσουμε ανασκοπώντας αυτές τις έννοιες στις ακόλουθες ενότητες.
ACL (Access Control List)
Όσον αφορά την εξισορρόπηση φορτίου, τα ACL χρησιμοποιούνται για τον έλεγχο μιας συγκεκριμένης συνθήκης και την εκτέλεση μιας ενέργειας με βάση το αποτέλεσμα. Αυτό παρέχει τη δυνατότητα βέλτιστης προώθησης της κίνησης με βάση παράγοντες όπως οι συνδέσεις backend και η αντιστοίχιση προτύπων, καθώς και πολλούς άλλους. Ακολουθεί ένα παράδειγμα χρήσης ACL:
|
1 |
acl url_blog path_beg /blog |
Σε αυτήν την περίπτωση, το ACL ταιριάζει εάν η διαδρομή που ζήτησε ο χρήστης ξεκινά με /blog. Για παράδειγμα, αυτό το αίτημα αντιστοίχισης θα έδειχνε στο http://yourdomain.com/blog/blog-entry-1. Το HAProxy Configuration Manual περιέχει έναν λεπτομερή οδηγό για τη χρήση των ACL.
Το Backend
Τα προωθούμενα αιτήματα λαμβάνονται από ένα σύνολο διακομιστών που αναφέρονται ως backend. Τα αιτήματα ορίζονται στην ενότητα backend της ρύθμισης παραμέτρων του HAProxy. Με τους απλούστερους όρους, ένα backend μπορεί να οριστεί από τους αλγόριθμους εξισορρόπησης φορτίου που θα χρησιμοποιηθούν και μια λίστα θυρών και διακομιστών. Ένα backend θα μπορούσε αποτελείται από έναν μεμονωμένο διακομιστή ή πολλούς διακομιστές. Καθώς προστίθενται περισσότεροι διακομιστές στο backend, η δυνητική χωρητικότητα φορτίου αυξάνεται, με την επεξεργασία να κατανέμεται σε πολλούς διακομιστές. Εάν ορισμένοι από τους διακομιστές backend τεθούν εκτός λειτουργίας, οι υπόλοιποι θα λειτουργήσουν ως εφεδρικοί για τη διεκπεραίωση της επεξεργασίας των αιτημάτων.
Let’s look at an example of a configuration of two backends. In this case, they are a blog-backend and a web-backend. Each has two web servers, listening on port 80:
|
1 2 3 4 5 6 7 8 9 10 |
backend web-backend balance roundrobin server web1 web1.yourdomain.com:80 check server web2 web2.yourdomain.com:80 check backend blog-backend balance roundrobin node http server blog1 blog1.yourdomain.com:80 check server blog2 blog2.yourdomain.com:80 check |
Η γραμμή balance roundrobin προορίζεται για τον καθορισμό του αλγορίθμου εξισορρόπησης φορτίου. Οι λεπτομέρειες βρίσκονται στην επόμενη ενότητα Αλγόριθμοι για Εξισορρόπηση Φορτίου, ενώ η λειτουργία mode http ρυθμίζει τη χρήση proxying επιπέδου 7. Θα το εξηγήσουμε αυτό στην ενότητα Τύποι Εξισορρόπησης Φορτίου. Επίσης, η επιλογή check μετά τις οδηγίες των διακομιστών υποδεικνύει ότι θα ενεργοποιηθούν έλεγχοι υγείας σε αυτούς τους συγκεκριμένους διακομιστές backend.
Το Frontend
Ο ορισμός του τρόπου με τον οποίο τα αιτήματα προωθούνται στο backend αναφέρεται ως frontend. Τα αιτήματα ορίζονται στην ενότητα frontend της ρύθμισης παραμέτρων του HAProxy. Αποτελούνται από ACL, μια θύρα, ένα σύνολο διευθύνσεων IP και έναν κανόνα που ορίζει ποια backend θα χρησιμοποιηθούν ανάλογα με το ποιες συνθήκες ACL πληρούνται, ο οποίος ονομάζεται κανόνας use_backend. Επιπλέον, υπάρχει επίσης ένας κανόνας default_backend για οποιαδήποτε άλλη περίπτωση. Η επόμενη ενότητα θα εξηγήσει πώς μπορεί να ρυθμιστεί ένα frontend για διάφορους τύπους κίνησης δικτύου.
Τύποι Εξισορρόπησης Φορτίου
Έχοντας καθορίσει τα βασικά στοιχεία που χρησιμοποιούνται για την εξισορρόπηση φορτίου, μπορούμε τώρα να προχωρήσουμε στους βασικούς τύπους εξισορρόπησης φορτίου.
Χωρίς εξισορρόπηση φορτίου
Στην πιο στοιχειώδη μορφή της, η έλλειψη εξισορρόπησης φορτίου μπορεί να απεικονιστεί ως εξής:
Σε αυτό το σενάριο, ένας χρήστης συνδέεται απευθείας στον διακομιστή ιστού, στο yourdomain.com. Δεν υπάρχει εξισορρόπηση φορτίου. Καθώς υπάρχει μόνο ένας διακομιστής βάσης δεδομένων, εάν τεθεί εκτός λειτουργίας, η πρόσβαση στις πληροφορίες σε αυτόν διακόπτεται εντελώς. Εάν πολλοί χρήστες προσπαθούν να συνδεθούν ταυτόχρονα σε έναν μόνο διακομιστή ιστού και αυτός δεν είναι σε θέση να διαχειριστεί το φορτίο που ασκείται, όλες οι συνδέσεις θα επιβραδυνθούν ή θα αποτύχουν εντελώς να συνδεθούν.
Εξισορρόπηση φορτίου (επίπεδο 4)
Ένας από τους απλούστερους και πιο πρακτικούς τρόπους εξισορρόπησης της κίνησης δικτύου σε πολλαπλούς διακομιστές είναι η χρήση μεθόδων εξισορρόπησης του επιπέδου μεταφοράς ή επιπέδου 4. Αυτός ο τρόπος εξισορρόπησης φορτίου κατευθύνει κάθε συνδεόμενο χρήστη με βάση το εύρος IP στο οποίο εμπίπτει η διεύθυνση IP του και τη θύρα. Με άλλα λόγια, εάν http://yourdomain.com/anything είναι η πηγή από την οποία προέρχεται το αίτημα, το backend που έχει οριστεί για τη διαχείριση αυτών των αιτημάτων θα είναι αυτό που τελικά θα τα χειριστεί. Θα προωθήσει αυτά τα αιτήματα για το yourdomain.com στη θύρα 80.
Η βασική δομή της εξισορρόπησης φορτίου επιπέδου 4 μοιάζει με αυτό:
Καθώς ο χρήστης αποκτά πρόσβαση στον εξισορροπητή φορτίου, τα αιτήματά του προωθούνται στην ομάδα διακομιστών web-backend. Ο ρυθμισμένος διακομιστής backend θα απαντήσει απευθείας στο αίτημα του χρήστη. Για να αποφευχθεί η εμφάνιση ασυνεπών δεδομένων στον χρήστη, όλοι οι διακομιστές web-backend θα πρέπει να παρέχουν πανομοιότυπο περιεχόμενο. Σύμφωνα με το παραπάνω διάγραμμα, και οι δύο διακομιστές ιστού συνδέονται τελικά με τον ίδιο διακομιστή βάσης δεδομένων.
Εξισορρόπηση φορτίου (Επίπεδο 7)
Υπάρχει μια άλλη, πιο περίπλοκη μέθοδος εξισορρόπησης φορτίου της κίνησης δικτύου. Αυτή είναι η χρήση εξισορρόπησης φορτίου επιπέδου 7, ή επιπέδου εφαρμογής. Αυτή η προσέγγιση επιτρέπει την προώθηση των αιτημάτων των χρηστών σε διαφορετικούς διακομιστές backend ανάλογα με το περιεχόμενο των αιτημάτων των χρηστών. Αυτή η μέθοδος επιτρέπει την εξισορρόπηση φορτίου σε πολλαπλούς διακομιστές εφαρμογών ιστού μέσω της ίδιας θύρας και τομέα. Για περισσότερες λεπτομέρειες σχετικά με αυτό το επίπεδο, ρίξτε μια ματιά στην υποενότητα HTTP του οδηγού μας The Nitty Gritty of Networking: Learn about Terminology, Interfaces, and Protocols.
Το ακόλουθο διάγραμμα απεικονίζει την εξισορρόπηση φορτίου επιπέδου 7:
Σε αυτήν την περίπτωση, ένας χρήστης ζητά το yourdomain.com/blog και το αίτημά του προωθείται στο blog backend. Αυτό είναι ένα σύνολο διακομιστών backend που έχει εκχωρηθεί ειδικά για την εκτέλεση της εφαρμογής blog. Στο μεταξύ, άλλα αιτήματα θα προωθούνται στο web-backend. Ωστόσο, και τα δύο backends καταλήγουν στην πρόσβαση στον ίδιο διακομιστή βάσης δεδομένων.
Ένα παράδειγμα ενός μικρού τμήματος διαμόρφωσης frontend για εξισορρόπηση φορτίου επιπέδου 7 θα έμοιαζε κάπως με τις ακόλουθες εντολές. Διαμορφώνουν το http frontend για τη διαχείριση της εισερχόμενης κίνησης μέσω της θύρας 80:
|
1 2 3 4 5 6 7 8 |
frontend http bind *:80 node http acl url_blog path_beg /blog use_backend blog.backend if url_blog default_backend web.backend |
Εάν η διαδρομή του αιτήματος του χρήστη ξεκινά με /blog, το acl url_blog path_beg /blog θα ταιριάξει με το αίτημα.
use_backend blog backend if url_blog δρομολογεί την κίνηση στο blog-backend χρησιμοποιώντας ACL.
defaut_backen web_backend κατευθύνει όλες τις άλλες προωθήσεις κίνησης στο web-backend.
Αλγόριθμοι για εξισορρόπηση φορτίου
Όταν εκτελείται εξισορρόπηση φορτίου, είναι ο αλγόριθμος εξισορρόπησης φορτίου που καθορίζει ποιος διακομιστής backend θα επιλεγεί για αυτόν τον σκοπό. Υπάρχουν διάφορες επιλογές αλγορίθμων που προσφέρονται από το HAProxy. Είναι επιπλέον δυνατό να εκχωρηθεί μια παράμετρος βάρους στους διακομιστές προκειμένου να επηρεαστεί το πόσο συχνά επιλέγεται ένας διακομιστής σε αντίθεση με τους άλλους. Υπάρχουν απλώς πάρα πολλοί διαθέσιμοι αλγόριθμοι για να περιγραφούν όλοι. Επομένως, αυτός ο οδηγός θα επικεντρωθεί μόνο στους πιο συνηθισμένους. Μπορείτε να ανατρέξετε στο HAProxy Documentation Converter για να δείτε την πλήρη λίστα. Οι πιο συχνά χρησιμοποιούμενοι περιλαμβάνουν:
- roundrobin: Ο προεπιλεγμένος αλγόριθμος που επιλέγει τους διακομιστές με τη σειρά.
- leastconn: Ο διακομιστής με τις λιγότερες συνδέσεις επιλέγεται αυτόματα. Ωστόσο, αυτοί οι διακομιστές εντός του ίδιου backend θα πρέπει να εναλλάσσονται με τη μέθοδο round-robin.
- source: Ο αλγόριθμος επιλέγει τον διακομιστή με βάση τη διεύθυνση IP από την οποία προέρχεται το αίτημα του χρήστη. Είναι μια μέθοδος που διασφαλίζει ότι ο χρήστης θα συνδέεται πάντα στον ίδιο διακομιστή.
Sticky Sessions
Για ορισμένες εφαρμογές, είναι απαίτηση οι χρήστες που συνδέονται να το κάνουν συνδεόμενοι πάντα στον ίδιο διακομιστή. Μέσω των ‘sticky sessions’ και χρησιμοποιώντας την παράμετρο appsession στο backend που την απαιτεί, μπορεί να επιτευχθεί αυτή η επιμονή.
Επεξεργασία Ελέγχων Υγείας
Το HAProxy χρειάζεται μια μέθοδο με την οποία μπορεί να προσδιορίσει την ικανότητα ενός διακομιστή backend να επεξεργάζεται αιτήματα. Αυτό παίρνει τη θέση της αφαίρεσης ενός διακομιστή από το backend εάν τεθεί εκτός σύνδεσης. Υπάρχει ένας προεπιλεγμένος «έλεγχος υγείας» που εκτελείται και προσπαθεί να δημιουργήσει μια σύνδεση TCP. Αυτό το κάνει ακούγοντας στη ρυθμισμένη διεύθυνση IP και θύρα.
Εάν ο έλεγχος υγείας για τον διακομιστή δεν πετύχει, ο διακομιστής δεν είναι σε θέση να επεξεργαστεί τα απεσταλμένα αιτήματα. Σε εκείνο το σημείο, ο διακομιστής απενεργοποιείται αυτόματα στο backend, με την κίνηση να μην προωθείται πλέον σε αυτόν μέχρι να τεθεί ξανά σε λειτουργία (υγιής). Ωστόσο, σε ορισμένες περιπτώσεις, ο προσδιορισμός της υγείας του διακομιστή μέσω του προεπιλεγμένου ελέγχου υγείας αποδεικνύεται ανεπαρκής.
Εναλλακτικές Λύσεις
Το HAProxy ενδέχεται να αποδειχθεί υπερβολικά πολύπλοκο για τις συγκεκριμένες ανάγκες σας. Σε αυτήν την περίπτωση, υπάρχουν μερικές καλές εναλλακτικές λύσεις που θα μπορούσαν να αποδειχθούν πιο αποτελεσματικές:
- Nginx: Πρόκειται για έναν αξιόπιστο και γρήγορο διακομιστή ιστού που μπορεί να χρησιμοποιηθεί για σκοπούς εξισορρόπησης φορτίου και μεσολάβησης. Στην πραγματικότητα, το Nginx χρησιμοποιείται συνήθως σε συνδυασμό με το HAProxy, το οποίο αξιοποιεί τις δυνατότητες συμπίεσης και προσωρινής αποθήκευσης του.
- Linux Virtual Servers (LVS): Πρόκειται για έναν απλό εξισορροπητή φορτίου επιπέδου 4 που περιλαμβάνεται σε πολλά συστήματα Linux.
Υψηλή Διαθεσιμότητα
Μέχρι στιγμής, έχουμε μιλήσει για εξισορρόπηση φορτίου επιπέδου 4 και επιπέδου 7. Και οι δύο χρησιμοποιούν έναν εξισορροπητή φορτίου για να καθορίσουν ποιος από τους πολλούς διακομιστές backend θα αναλάβει να απαντήσει στο αίτημα του χρήστη. Είναι όμως σημαντικό να έχουμε κατά νου τους περιορισμούς ενός εξισορροπητή φορτίου. Συγκεκριμένα, ότι αποτελεί ένα μοναδικό σημείο αποτυχίας. Αυτό σημαίνει ότι εάν σταματούσε να λειτουργεί ή εάν υπερφορτωνόταν με αιτήματα χρηστών, θα οδηγούσε σε διακοπή λειτουργίας ή καθυστέρηση στην επεξεργασία των αιτημάτων, αντίστοιχα. Ωστόσο, μια εγκατάσταση HA (υψηλής διαθεσιμότητας) παρουσιάζει μια υποδομή που στερείται οποιουδήποτε μοναδικού σημείου αποτυχίας. Αυτό αποτρέπει την εμφάνιση συμβάντων διακοπής λειτουργίας λόγω αστοχίας διακομιστή, εισάγοντας πλεονασμό σε κάθε επίπεδο της αρχιτεκτονικής του συστήματος. Ενώ ο εξισορροπητής φορτίου θα βοηθήσει στη διευκόλυνση του πλεονασμού του backend, οι ίδιοι οι εξισορροπητές φορτίου πρέπει επίσης να εφαρμόζουν πλεονασμό.
Το ακόλουθο διάγραμμα παρουσιάζει μια βασική μορφή μιας εγκατάστασης υψηλής διαθεσιμότητας:

Αυτή η υποδομή διαθέτει αρκετούς εξισορροπητές φορτίου (έναν ενεργό, οι υπόλοιποι παθητικοί) συνδεδεμένους σε μια στατική διεύθυνση IP. Αυτή η διεύθυνση IP μπορεί να αντιστοιχιστεί εκ νέου σε διαφορετικό διακομιστή εάν το απαιτεί η κατάσταση. Το αίτημα του χρήστη ταξιδεύει μέσω της εξωτερικής διεύθυνσης IP στον εξισορροπητή φορτίου που είναι επί του παρόντος ενεργός. Εάν ο εξισορροπητής φορτίου είναι εκτός σύνδεσης εκείνη τη στιγμή, ο μηχανισμός ασφαλείας θα ανιχνεύσει την κατάστασή του, αναθέτοντας εκ νέου τη διεύθυνση IP στον παθητικό διακομιστή (ή διακομιστές).
Συμπέρασμα
Η θεμελιώδης κατανόηση της εξισορρόπησης φορτίου και η γνώση ορισμένων από τους τρόπους με τους οποίους το HAProxy μπορεί να καλύψει τις ανάγκες εξισορρόπησης φορτίου για το σύστημά σας θα πρέπει να σας δώσουν μια σταθερή βάση για να ξεκινήσετε τη βελτιστοποίηση της αξιοπιστίας και της απόδοσης των τρεχόντων περιβαλλόντων διακομιστή σας. Μπορείτε επίσης να δείτε τον οδηγό μας Nginx HTTP Proxying, Εξισορρόπηση Φορτίου, Buffering και Caching: Μια Επισκόπηση για να μάθετε περισσότερα σχετικά με τις ιδιότητες εξισορρόπησης φορτίου του Nginx.
Καλή συνέχεια!



Σχόλια
Δεν υπάρχουν σχόλια ακόμα. Γράψτε το πρώτο.