Προαπαιτούμενα
Διαμορφώστε το τείχος προστασίας
Εγκαταστήστε το rabbitmqadmin
Διαμόρφωση DNS
Συγκεντρώστε τους κόμβους
Δημιουργήστε μια πολιτική υψηλής διαθεσιμότητας
Δοκιμή της ρύθμισης
Διαγράψτε τον επισκέπτη χρήστη
Το RabbitMQ είναι ένας μεσίτης μηνυμάτων ανοιχτού κώδικα που υποστηρίζει AMQP, STOMP και άλλες τεχνολογίες επικοινωνίας. Χρησιμοποιείται ευρέως σε εταιρικές εφαρμογές και σύγχρονες αρχιτεκτονικές μικροϋπηρεσιών όπου λειτουργεί ως ασύγχρονο κανάλι μηνυμάτων μεταξύ διαφορετικών μικροϋπηρεσιών. Αυτός ο οδηγός θα περιγράψει πώς μπορείτε να ομαδοποιήσετε το RabbitMQ σε πολλούς διακομιστές CentOS 7 για να σχηματίσετε έναν μεσίτη μηνυμάτων υψηλής διαθεσιμότητας. Σε αυτό το σεμινάριο, ένας διακομιστής θα λειτουργεί ως κύριος διακομιστής και οι άλλοι διακομιστές θα λειτουργούν ως διακομιστές κατοπτρισμού σε περίπτωση που ο κύριος διακομιστής καταστεί μη διαθέσιμος.
Προαπαιτούμενα
Το τείχος προστασίας CentOS, ( firewalld), δεν επιτρέπει καμία εισερχόμενη κίνηση από προεπιλογή. Για να διαθέσουμε το RabbitMQ για άλλα συστήματα εντός και εκτός του δικτύου και για να μας επιτραπεί η πρόσβαση στην κονσόλα διαχείρισης, πρέπει πρώτα να ανοίξουμε ορισμένες θύρες.
Η κονσόλα διαχείρισης διεπαφής web του RabbitMQ ακούει από προεπιλογή στη θύρα 15672. Θα θέλαμε να κάνουμε την κονσόλα διαχείρισης δημόσια διαθέσιμη, ώστε να έχουμε πρόσβαση σε αυτήν από τον υπολογιστή μας. Επομένως, θα σας ζητήσουμε firewalldνα ανοίξετε μόνιμα τη θύρα 15672στη δημόσια ζώνη (η οποία είναι η προεπιλεγμένη και ενεργή ζώνη σε μια παρουσία Vultr).
sudo firewall-cmd --zone=public --add-port=15672/tcp --permanent
Οι κόμβοι RabbitMQ πρέπει να μπορούν να επικοινωνούν μεταξύ τους. Θα θέλαμε να ανοίξουμε τις απαραίτητες θύρες, αλλά μόνο μέσω του εσωτερικού δικτύου. Δεν θέλουμε κανένας στο Διαδίκτυο να μπορεί να διαχειρίζεται ή να επικοινωνεί απευθείας με τους διακομιστές μας. Οι ακόλουθες εντολές υποθέτουν ότι οι διακομιστές μας βρίσκονται στο 192.168.0.100/24υποδίκτυο.
Η πρώτη υπηρεσία είναι η epmdυπηρεσία εντοπισμού ομοτίμων που ακούει από προεπιλογή στη θύρα 4369.
sudo firewall-cmd --permanent --zone=public --add-rich-rule='
rule family="ipv4"
source address="192.168.0.100/24"
port protocol="tcp" port="4369" accept'
Για επικοινωνία μεταξύ κόμβων και CLI, το RabbitMQ πρέπει να μπορεί να επικοινωνεί μέσω θύρας 25672.
sudo firewall-cmd --permanent --zone=public --add-rich-rule='
rule family="ipv4"
source address="192.168.0.100/24"
port protocol="tcp" port="25672" accept'
Τα εργαλεία CLI επικοινωνούν στην περιοχή των θυρών 35672-35682.
sudo firewall-cmd --permanent --zone=public --add-rich-rule='
rule family="ipv4"
source address="192.168.0.100/24"
port protocol="tcp" port="35672-35682" accept'
Εάν οι εφαρμογές σας χρειάζονται το πρωτόκολλο AMQP, θα χρειαστεί επίσης να ανοίξετε θύρες 5671και 5672. Εάν χρειάζεται να μπορείτε να επικοινωνείτε μέσω άλλου πρωτοκόλλου, μπορείτε να βρείτε τις απαραίτητες πληροφορίες σχετικά με τις απαιτήσεις δικτύωσης του RabbitMQ στην επίσημη τεκμηρίωση του RabbitMQ .
sudo firewall-cmd --permanent --zone=public --add-rich-rule='
rule family="ipv4"
source address="192.168.0.100/24"
port protocol="tcp" port="5672" accept'
sudo firewall-cmd --permanent --zone=public --add-rich-rule='
rule family="ipv4"
source address="192.168.0.100/24"
port protocol="tcp" port="5671" accept'
Τώρα που firewalldέχει ρυθμιστεί, πρέπει να του δώσουμε εντολή να φορτώσει ξανά τη διαμόρφωση.
sudo firewall-cmd --reload
Επαναλάβετε τα βήματα από αυτήν την ενότητα σε όλους τους διακομιστές.
Εγκαθιστώ rabbitmqadmin
Το πρόσθετο διαχείρισης συνοδεύεται από ένα εργαλείο Python που ονομάζεται και το rabbitmqadminοποίο μπορεί εύκολα να εγκατασταθεί στο σύστημα μόλις ενεργοποιηθεί το πρόσθετο διαχείρισης.
sudo wget http://localhost:15672/cli/rabbitmqadmin
sudo mv rabbitmqadmin /usr/local/bin/
sudo chmod +x /usr/local/bin/rabbitmqadmin
Πρέπει να χρησιμοποιήσετε τα ονόματα κεντρικών υπολογιστών του διακομιστή για να προσδιορίσετε τους διακομιστές κατά την ομαδοποίηση. Από προεπιλογή, στους διακομιστές δεν έχει εκχωρηθεί εγγραφή DNS και η σύνδεση θα αποτύχει. Για να το ξεπεράσετε γρήγορα, προσθέστε το όνομα του κύριου και του κατοπτρικού κεντρικού υπολογιστή στο /etc/hostsαρχείο χρησιμοποιώντας τον αγαπημένο σας επεξεργαστή.
Για παράδειγμα, το αρχείο hosts του πλοιάρχου σας μπορεί να μοιάζει με το ακόλουθο. Παρατηρήστε τις δύο τελευταίες εγγραφές, οι οποίες επιτρέπουν στους διακομιστές να αναγνωρίζουν ο ένας τον άλλον με το όνομα κεντρικού υπολογιστή τους. Φροντίστε να αλλάξετε τις διευθύνσεις IP στις δικές σας.
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 guest
::1 guest
127.0.0.1 YOUR_MASTER_SERVER_HOST_NAME
::1 YOUR_MASTER_SERVER_HOST_NAME
192.168.0.101 YOUR_MASTER_SERVER_HOST_NAME
192.168.0.102 YOUR_MIRROR_SERVER_HOST_NAME
Συγκεντρώστε τους κόμβους
Προϋπόθεση εισαγωγής για να επιτραπεί στους κόμβους να ενωθούν μεταξύ τους είναι τα cookie Erlang όλων των κόμβων να είναι πανομοιότυπα. Από προεπιλογή, σε κάθε κόμβο θα εκχωρηθεί ένα μοναδικό cookie Erlang, επομένως πρέπει να το ρυθμίσετε εκ νέου σε όλους τους κόμβους.
Η ακόλουθη εντολή θα ορίσει το cookie Erlang σε " WE<3COOKIES", αλλά μη διστάσετε να το αλλάξετε σύμφωνα με τις προτιμήσεις σας. Κάντε αυτό σε όλους τους διακομιστές.
sudo sh -c "echo 'WE<3COOKIES' > /var/lib/rabbitmq/.erlang.cookie"
Επανεκκινήστε το RabbitMQ σε όλους τους διακομιστές για να βεβαιωθείτε ότι το cookie Erlang έχει επαναφορτωθεί σωστά.
sudo systemctl restart rabbitmq-server.service
Εκτελέστε τις ακόλουθες εντολές σε όλους τους διακομιστές εκτός από τον κύριο διακομιστή. Αυτό θα αφήσει τους κόμβους να ενωθούν στον κύριο διακομιστή και να σχηματίσουν ένα σύμπλεγμα.
sudo rabbitmqctl stop_app
sudo rabbitmqctl join_cluster "rabbit@<YOUR_MASTER_SERVER_HOST_NAME>"
sudo rabbitmqctl start_app
Επαληθεύστε ότι οι κόμβοι έχουν ενταχθεί στο σύμπλεγμα εκτελώντας την ακόλουθη εντολή.
sudo rabbitmqctl cluster_status
Όλοι οι κόμβοι σας θα εμφανιστούν στην ενότητα nodesκαι running_nodesτης εξόδου. Από εδώ και στο εξής, δεν χρειάζεται πλέον να επαναλαμβάνετε τα βήματα σε κάθε διακομιστή, η διαμόρφωση θα αντικατοπτρίζεται αυτόματα στους άλλους κόμβους.
Δημιουργήστε μια πολιτική υψηλής διαθεσιμότητας
Τώρα που έχουμε ένα σύμπλεγμα κόμβων RabbitMQ, μπορούμε να το χρησιμοποιήσουμε για να δημιουργήσουμε ουρές και ανταλλαγές υψηλής διαθεσιμότητας δημιουργώντας μια νέα πολιτική. Αυτή η πολιτική μπορεί να προστεθεί μέσω της κονσόλας διαχείρισης RabbitMQ ή χρησιμοποιώντας τη διεπαφή της γραμμής εντολών.
sudo rabbitmqctl set_policy -p "/" --priority 1 --apply-to "all" ha ".*" '{ "ha-mode": "exactly", "ha-params": 2, "ha-sync-mode": "automatic"}'
Η παρακάτω λίστα θα εξηγήσει τι σημαίνει κάθε μέρος της εντολής.
-p "/": Χρησιμοποιήστε αυτήν την πολιτική στο "/"vhost (η προεπιλογή μετά την εγκατάσταση)
--priority 1: Η σειρά με την οποία εφαρμόζονται οι πολιτικές
--apply-to "all": Μπορεί να είναι "queues", "exchanges"ή"all"
ha: Το όνομα που δίνουμε στην πολιτική μας
".*": Η τυπική έκφραση που χρησιμοποιείται για να αποφασίσει σε ποιες ουρές ή ανταλλαγές εφαρμόζεται αυτή η πολιτική. ".*"θα ταιριάζει με οτιδήποτε
'{ "ha-mode": "exactly", "ha-params": 2, "ha-sync-mode": "automatic"}': Η αναπαράσταση JSON της πολιτικής. Αυτό το έγγραφο περιγράφει ότι θέλουμε - ακριβώς 2 κόμβους στους οποίους τα δεδομένα συγχρονίζονται αυτόματα
Εν ολίγοις, αυτή η πολιτική θα διασφαλίσει ότι θα έχουμε πάντα 2 αντίγραφα των δεδομένων σε μια ουρά ή ανταλλαγή, εφόσον έχουμε τουλάχιστον 2 κόμβους σε λειτουργία. Εάν έχετε περισσότερους κόμβους, μπορείτε να αυξήσετε την τιμή του ha-params. Συνιστάται απαρτία, ( N/2 + 1), κόμβων. Η κατοχή περισσότερων αντιγράφων των δεδομένων σας θα είχε ως αποτέλεσμα υψηλότερη χρήση δίσκου, εισόδου/εξόδου και δικτύου που θα μπορούσε να οδηγήσει σε υποβαθμισμένη απόδοση.
Εάν θέλετε να αντικατοπτρίσετε τα δεδομένα σε όλους τους κόμβους του συμπλέγματος, μπορείτε να χρησιμοποιήσετε το ακόλουθο έγγραφο JSON.
'{ "ha-mode": "all", "ha-sync-mode": "automatic"}'
Εάν θέλετε να αντικατοπτρίσετε τα δεδομένα μόνο σε συγκεκριμένους κόμβους, (για παράδειγμα: node-1και node-2), μπορείτε να χρησιμοποιήσετε τα ακόλουθα.
'{ "ha-mode": "nodes", "ha-params" :["rabbit@node-1", "rabbit@node-2"], "ha-sync-mode": "automatic"}'
Μπορείτε να αλλάξετε την τυπική έκφραση για να εκχωρήσετε διαφορετικές πολιτικές σε διαφορετικές ουρές. Ας υποθέσουμε ότι έχουμε τους ακόλουθους τρεις κόμβους:
- κουνέλι@μάστορα
- rabbit@client-ha
- κουνέλι@προϊόν-χα
Στη συνέχεια, μπορούμε να δημιουργήσουμε δύο πολιτικές που θα έχουν ως αποτέλεσμα οι ουρές να έχουν ένα όνομα που ξεκινά με "πελάτης" για να αντικατοπτρίζεται στον rabbit@client-haκόμβο και όλες οι ουρές που έχουν ένα όνομα που ξεκινά με "προϊόν" να αντικατοπτρίζονται στον rabbit@product-haκόμβο.
sudo rabbitmqctl set_policy -p "/" --priority 1 --apply-to "queues" ha-client "client.*" '{ "ha-mode": "nodes", "ha-params": ["rabbit@master", "rabbit@client-ha"], "ha-sync-mode": "automatic"}
sudo rabbitmqctl set_policy -p "/" --priority 1 --apply-to "queues" ha-product "product.*" '{ "ha-mode": "nodes", "ha-params": ["rabbit@master", "rabbit@product-ha"], "ha-sync-mode": "automatic"}
Μια μικρή παρατήρηση εδώ: οι αποκλειστικές ουρές δεν αντικατοπτρίζονται ποτέ ή είναι ανθεκτικές στο RabbitMQ, ακόμα κι αν αυτή η πολιτική ταιριάζει με τέτοιες ουρές. Οι αποκλειστικές ουρές καταστρέφονται αυτόματα μόλις αποσυνδεθεί ένας πελάτης και, ως εκ τούτου, δεν θα ήταν χρήσιμο να αναπαραχθεί σε άλλο διακομιστή. Εάν ο διακομιστής αποτύγχανε, ο πελάτης θα αποσυνδεόταν από αυτόν και η ουρά θα καταστρεφόταν αυτόματα. Θα καταστρέφονταν και οι αντικατοπτρισμένες περιπτώσεις.
Δοκιμή της ρύθμισης
Προκειμένου να δοκιμάσουμε την εγκατάσταση σε συμπλέγματα, μπορούμε να δημιουργήσουμε μια νέα ουρά χρησιμοποιώντας τη διεπαφή γραμμής εντολών μέσω της κονσόλας διαχείρισης.
sudo rabbitmqadmin declare queue --vhost "/" name=my-ha-queue durable=true
Αυτό θα δημιουργήσει μια ανθεκτική ουρά στον προεπιλεγμένο /vhost με το όνομα my-ha-queue.
Εκτελέστε την ακόλουθη εντολή και επαληθεύστε στην έξοδο ότι η ουρά έχει εκχωρηθεί η πολιτική μας "ha" και έχει pid στην κύρια και σε έναν κόμβο καθρέφτη.
sudo rabbitmqctl list_queues name policy state pid slave_pids
Μπορούμε τώρα να δημοσιεύσουμε ένα μήνυμα στην ουρά από τον κύριο κόμβο και να σταματήσουμε το RabbitMQ στον κύριο κόμβο.
sudo rabbitmqadmin -u user_name -p password publish routing_key=my-ha-queue payload="hello world"
sudo systemctl rabbitmqctl shutdown
Τώρα πάρτε το πίσω συνδέοντας τον κόμβο καθρέφτη.
sudo rabbitmqadmin -H MIRROR_NODE_IP_OR_DNS -u user_name -p password get queue=my-ha-queue
Τέλος, μπορούμε να επανεκκινήσουμε τον κύριο κόμβο μας.
sudo systemctl start rabbitmq-server.service
Διαγράψτε τον επισκέπτη χρήστη
Όπως αναφέρθηκε προηγουμένως, το RabbitMQ δημιουργεί αυτόματα έναν επισκέπτη χρήστη με έναν προεπιλεγμένο κωδικό πρόσβασης επισκέπτη. Θα ήταν κακή πρακτική να αφήσετε αυτόν τον προεπιλεγμένο χρήστη σε ένα δημόσια εκτεθειμένο σύστημα.
sudo rabbitmqctl delete_user guest