RabbitMQ-Cluster unter Ubuntu 20.04 einrichten
RabbitMQ ist eine freie, quelloffene und Multiprotokoll-Messaging-Broker-Software, die in der Programmiersprache Erlang geschrieben wurde. Ein Message Broker wird verwendet, um Nachrichten für eine Anwendung zu speichern. Wenn eine Anwendung Daten an eine andere Anwendung sendet, veröffentlicht die Anwendung die Nachricht auf dem Message Broker. RabbitMQ unterstützt mehrere Messaging-Protokolle und kann leicht in verteilten Konfigurationen eingesetzt werden. Der Message Broker fungiert als Vermittler für verschiedene Webanwendungen und wird verwendet, um die Last und die Lieferzeiten von Webanwendungen zu reduzieren.
In diesem Tutorial werden wir einen RabbitMQ-Cluster mit drei Knoten auf einem Ubuntu 20.04-Server einrichten.
Voraussetzungen
- Drei Server, auf denen Ubuntu 20.04 läuft.
- Ein Root-Passwort ist auf jedem Server konfiguriert.
Erste Schritte
Bevor Sie beginnen, müssen Sie Ihre Systempakete auf die neueste Version aktualisieren. Sie können sie aktualisieren, indem Sie den folgenden Befehl auf jedem Knoten ausführen:
apt-get update -y
Sobald alle Pakete aktualisiert sind, müssen Sie auf jedem Knoten die Datei /etc/hosts einrichten. So können sie sich gegenseitig über den Hostnamen ansprechen.
Bearbeiten Sie die Datei /etc/hosts auf jedem Knoten mit dem folgenden Befehl:
nano /etc/hosts
Fügen Sie die folgenden Zeilen hinzu:
192.168.0.10 node1 192.168.0.11 node2 192.168.0.12 node3
Speichern und schließen Sie die Datei, wenn Sie fertig sind. Danach können Sie mit dem nächsten Schritt fortfahren.
RabbitMQ-Server installieren
Als nächstes müssen Sie das RabbitMQ Server-Paket auf jedem Knoten installieren. Sie können es installieren, indem Sie einfach den folgenden Befehl ausführen:
apt-get install rabbitmq-server -y
Nach der Installation starten Sie den RabbitMQ-Dienst und aktivieren ihn mit dem folgenden Befehl, damit er beim Neustart des Systems gestartet wird:
systemctl start rabbitmq-server systemctl enable rabbitmq-server
Sie können den Status des RabbitMQ-Dienstes auch mit dem folgenden Befehl überprüfen:
systemctl status rabbitmq-server
Sie sollten die folgende Ausgabe erhalten:
? rabbitmq-server.service - RabbitMQ Messaging Server Loaded: loaded (/lib/systemd/system/rabbitmq-server.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2020-07-21 06:25:07 UTC; 19min ago Main PID: 2565 (beam.smp) Status: "Initialized" Tasks: 87 (limit: 2353) Memory: 83.5M CGroup: /system.slice/rabbitmq-server.service ??2551 /bin/sh /usr/sbin/rabbitmq-server ??2565 /usr/lib/erlang/erts-10.6.4/bin/beam.smp -W w -A 64 -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1> ??2828 erl_child_setup 65536 ??2921 inet_gethost 4 ??2922 inet_gethost 4 Jul 21 06:24:58 node1 systemd[1]: Starting RabbitMQ Messaging Server... Jul 21 06:25:07 node1 systemd[1]: rabbitmq-server.service: Supervising process 2565 which is not our child. We'll most likely not notice when > Jul 21 06:25:07 node1 systemd[1]: Started RabbitMQ Messaging Server.
Zu diesem Zeitpunkt ist der RabbitMQ-Server auf jedem Knoten installiert und läuft. Sie können nun mit dem nächsten Schritt fortfahren.
Aktivieren des RabbitMQ-Management-Plugins
Das RabbitMQ-Management-Plugin stellt eine HTTP-basierte API zur Verfügung, die zur Überwachung und Verwaltung von RabbitMQ-Knoten und -Clustern über einen Webbrowser verwendet werden kann. Standardmäßig läuft es auf dem TCP-Port 15672.
Sie können das RabbitMQ-Management-Plugin aktivieren, indem Sie den folgenden Befehl auf jedem Knoten ausführen:
rabbitmq-plugins enable rabbitmq_management
Sie sollten die folgende Ausgabe sehen:
Enabling plugins on node rabbit@node1: rabbitmq_management The following plugins have been configured: rabbitmq_management rabbitmq_management_agent rabbitmq_web_dispatch Applying plugin configuration to rabbit@node3... The following plugins have been enabled: rabbitmq_management rabbitmq_management_agent rabbitmq_web_dispatch started 3 plugins.
Starten Sie anschließend den RabbitMQ-Dienst neu, um die Änderungen zu übernehmen:
systemctl restart rabbitmq-server
Sie können den lauschenden Port mit dem folgenden Befehl überprüfen:
netstat -tunelp | grep 15672
Sie sollten die folgende Ausgabe sehen:
tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN 109 23155 2565/beam.smp
RabbitMQ-Cluster einrichten
Standardmäßig ist die Datei /var/lib/rabbitmq/.erlang.cookie auf jedem Knoten gleich. Um den RabbitMQ-Cluster einzurichten, müssen Sie die Datei /var/lib/rabbitmq/.erlang.cookie von Knoten1 auf andere Knoten kopieren.
Führen Sie auf Knoten1 den folgenden Befehl aus, um die Datei /var/lib/rabbitmq/.erlang.cookie auf die anderen Knoten zu kopieren.
scp /var/lib/rabbitmq/.erlang.cookie root@192.168.0.11:/var/lib/rabbitmq/ scp /var/lib/rabbitmq/.erlang.cookie root@192.168.0.12:/var/lib/rabbitmq/
Als nächstes müssen Sie node1 und node2 einrichten, um dem Cluster node1 beizutreten.
Starten Sie zunächst den RabbitMQ-Dienst neu und stoppen Sie die App mit folgendem Befehl sowohl auf node2 als auch auf node3:
systemctl restart rabbitmq-server rabbitmqctl stop_app
Treten Sie auf node2 dem Cluster auf node1 bei, indem Sie den folgenden Befehl ausführen:
rabbitmqctl join_cluster rabbit@node1
Sie sollten die folgende Ausgabe sehen:
Clustering node rabbit@node2 with rabbit@node1
Starten Sie auf dem Knoten2 die App mit dem folgenden Befehl:
rabbitmqctl start_app
Sie sollten die folgende Ausgabe sehen:
Starting node rabbit@node2 ... completed with 3 plugins.
Treten Sie auf Knoten3 dem Cluster auf Knoten1 bei, indem Sie den folgenden Befehl ausführen:
rabbitmqctl join_cluster rabbit@node1
Sie sollten die folgende Ausgabe sehen:
Clustering node rabbit@node3 with rabbit@node1
Starten Sie auf dem Knoten3 die App mit dem folgenden Befehl:
rabbitmqctl start_app
Sie sollten die folgende Ausgabe sehen:
Starting node rabbit@node3 ... completed with 3 plugins.
Überprüfen Sie nach erfolgreichem Abschluss den Status des Clusters, indem Sie den folgenden Befehl auf Knoten1 ausführen:
rabbitmqctl cluster_status
Sie sollten die folgende Ausgabe sehen:
Cluster status of node rabbit@node1 ... Basics Cluster name: rabbit@node3 Disk Nodes rabbit@node1 rabbit@node2 rabbit@node3 Running Nodes rabbit@node1 rabbit@node2 rabbit@node3 Versions rabbit@node1: RabbitMQ 3.8.2 on Erlang 22.2.7 rabbit@node2: RabbitMQ 3.8.2 on Erlang 22.2.7 rabbit@node3: RabbitMQ 3.8.2 on Erlang 22.2.7 Alarms (none) Network Partitions (none) Listeners Node: rabbit@node1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication Node: rabbit@node1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0 Node: rabbit@node1, interface: [::], port: 15672, protocol: http, purpose: HTTP API Node: rabbit@node2, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication Node: rabbit@node2, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0 Node: rabbit@node2, interface: [::], port: 15672, protocol: http, purpose: HTTP API Node: rabbit@node3, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication Node: rabbit@node3, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0 Node: rabbit@node3, interface: [::], port: 15672, protocol: http, purpose: HTTP API Feature flags Flag: drop_unroutable_metric, state: disabled Flag: empty_basic_get_metric, state: disabled Flag: implicit_default_bindings, state: enabled Flag: quorum_queue, state: enabled Flag: virtual_host_metadata, state: enabled
Setup Administrator User
Als nächstes müssen Sie einen neuen Administrator-Benutzer für den RabbitMQ-Server anlegen und den Standard-Benutzer „guest“ löschen.
Sie können einen neuen Benutzer mit dem Namen „hitesh“ und dem Passwort „password“ erstellen, indem Sie den folgenden Befehl auf node1 ausführen:
rabbitmqctl add_user hitesh password
Sie sollten die folgende Ausgabe sehen:
Adding user "hitesh" ...
Als Nächstes konfigurieren Sie den Benutzer „hitesh“ mit dem folgenden Befehl als Administrator:
rabbitmqctl set_user_tags hitesh administrator
Sie sollten die folgende Ausgabe sehen:
Setting tags for user "hitesh" to [administrator] ...
Erteilen Sie als Nächstes dem Benutzer hitesh die Berechtigung zum Ändern, Schreiben und Lesen aller vhosts.
rabbitmqctl set_permissions -p / hitesh ".*" ".*" ".*"
Sie sollten die folgende Ausgabe sehen:
Setting permissions for user "hitesh" in vhost "/" ...
Löschen Sie als Nächstes den Gastbenutzer mit dem folgenden Befehl:
rabbitmqctl delete_user guest
Sie sollten dann den folgenden Befehl erhalten:
Deleting user "guest" ...
Alle Benutzer mit dem folgenden Befehl auflisten:
rabbitmqctl list_users
Dies ergibt die Folgende Ausgabe:
Listing users ... user tags hitesh [administrator]
Ihr Benutzer, den Sie auf Knoten1 angelegt haben, wird automatisch auf alle Knoten des Clusters repliziert.
RabbitMQ-Einrichtung Queue-Spiegelung
Standardmäßig befindet sich der Inhalt einer Warteschlange auf einem einzigen Knoten. Daher müssen Sie den ‚ha policy‘-Cluster für die Queue-Spiegelung und Replikation auf alle Cluster-Knoten einrichten.
Erstellen Sie dazu eine ha-Policy mit dem Namen ‚ha-all‘, die alle Queues auf dem RabbitMQ-Cluster auf alle Knoten des Clusters spiegeln soll.
rabbitmqctl set_policy ha-all ".*" '{"ha-mode":"all"}'
Ausgabe:
Setting policy "ha-all" for pattern ".*" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...
Als nächstes erstellen Sie eine ha-Policy mit dem Namen ‚ha-two‘, die alle Queue-Namen, die mit ‚zwei‘ beginnen, auf die beiden Knoten des Clusters spiegelt.
rabbitmqctl set_policy ha-two "^two\." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
Ausgabe:
Setting policy "ha-two" for pattern "^two\." to "{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}" with priority "0" for vhost "/" ...
Als nächstes erstellen Sie eine Hochverfügbarkeitsrichtlinie mit dem Namen „ha-nodes“, die alle Warteschlangen enthält, deren Name mit „nodes“ beginnt. Wir werden auf zwei bestimmte Knoten ’node2′ und ’node3′ im Cluster spiegeln.
rabbitmqctl set_policy ha-nodes "^nodes\." '{"ha-mode":"nodes","ha-params":["rabbit@node2", "rabbit@node3"]}'
Ausgabe:
Setting policy "ha-nodes" for pattern "^nodes\." to "{"ha-mode":"nodes","ha-params":["rabbit@node2", "rabbit@node3"]}" with priority "0" for vhost "/" ...
Sie können nun alle konfigurierten Richtlinien auflisten, indem Sie den folgenden Befehl ausführen:
rabbitmqctl list_policies;
Sie sollten die folgende Ausgabe sehen:
Listing policies for vhost "/" ... vhost name pattern apply-to definition priority / ha-all .* all {"ha-mode":"all"} 0 / ha-two ^two\. all {"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"} 0 / ha-nodes ^nodes\. all {"ha-mode":"nodes","ha-params":["rabbit@node2","rabbit@node3"]} 0
Wenn Sie fertig sind, können Sie mit dem nächsten Schritt fortfahren.
Zugriff auf RabbitMQ-Cluster
Sie können nun auf das RabbitMQ-Webinterface zugreifen, indem Sie die IP-Adresse eines beliebigen Knotens in Ihren Webbrowser mit Port 15672 wie http://192.168.0.10:15672/ eingeben. Sie sollten die RabbitMQ-Login-Seite sehen:
Geben Sie Ihren Admin-Benutzernamen und Ihr Passwort ein und klicken Sie auf die Schaltfläche Login. Sie sollten das RabbitMQ-Dashboard im folgenden Bildschirm sehen:
Klicken Sie als Nächstes auf die Registerkarte„Admin“ und dann auf das Menü„Policies„. Sie sollten alle RabbitMQ ha-Policies sehen, die wir im folgenden Bildschirm erstellt haben:
Fazit
Herzlichen Glückwunsch! Sie haben erfolgreich einen Drei-Knoten-RabbitMQ-Cluster auf einem Ubuntu20.04-Server eingerichtet. Ihr Cluster teilt nun Konfigurationsinformationen, einschließlich Topologie- und Sicherheitsinformationen über alle Knoten hinweg.