So richten Sie einen hochverfügbaren RabbitMQ-Cluster unter CentOS 7 ein

RabbitMQ ist ein weit verbreiteter Open-Source-Nachrichtenbroker, der AMQP, STOMP und weitere Protokolle unterstützt. In Unternehmensumgebungen und modernen Microservice-Architekturen übernimmt RabbitMQ eine zentrale Rolle als asynchrane Kommunikationsschnittstelle zwischen verschiedenen Diensten. Diese Anleitung beschreibt, wie Sie einen RabbitMQ-Cluster auf mehreren CentOS-7-Servern einrichten, um eine hohe Verfügbarkeit sicherzustellen. Dabei agiert ein Server als Hauptknoten, während zusätzliche Server als gespiegelte Knoten fungieren, um Ausfallsicherheit zu gewährleisten.

Systemvoraussetzungen

  • Mindestens zwei frisch installierte und aktualisierte CentOS 7 Instanzen im selben privaten Subnetz
  • RabbitMQ ist auf jedem Server installiert, inklusive aktivierter Webverwaltungsoberfläche (siehe Installationsanleitung für CentOS 7)
  • Ein Benutzerkonto ohne Root-Rechte, das Sudo-Befehle ausführen darf (siehe Anleitung zur Sudo-Konfiguration für CentOS, Debian und FreeBSD)

Firewall einrichten

Standardmäßig blockiert das CentOS-Firewalltool firewalld sämtliche eingehenden Verbindungen. Um den Zugriff auf RabbitMQ und die Verwaltungsoberfläche von außen zu ermöglichen, müssen bestimmte Ports freigegeben werden.

Die Verwaltungsoberfläche von RabbitMQ läuft standardmäßig auf Port 15672. Um diesen Zugang von außen verfügbar zu machen, fügen Sie folgende Regel in der Public-Zone hinzu:

sudo firewall-cmd --zone=public --add-port=15672/tcp --permanent

Damit sich die RabbitMQ-Knoten untereinander im internen Netzwerk austauschen können, müssen zusätzliche Ports ausschließlich für das Subnetz 192.168.0.100/24 geöffnet werden.

epmd-Erkennung aktivieren (Port 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'

 

Kommunikation zwischen RabbitMQ-Knoten aktivieren (Port 25672)

Damit sich die RabbitMQ-Instanzen untereinander synchronisieren können, muss der Port 25672 innerhalb des internen Netzwerks geöffnet werden:

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-Kommunikation erlauben (Ports 35672–35682)

Die Kommandozeilen-Tools von RabbitMQ nutzen Ports im Bereich 35672 bis 35682. Diese Ports sollten ebenfalls für das interne Subnetz freigegeben werden:

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-Ports freigeben (5671 und 5672)

Wenn Ihre Anwendungen das AMQP-Protokoll verwenden, müssen Sie die folgenden Ports für interne Verbindungen öffnen:

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'

Weitere Informationen zu den Netzwerkanforderungen von RabbitMQ – insbesondere wenn Sie zusätzliche Protokolle verwenden – finden Sie in der offiziellen Dokumentation.

Firewall-Regeln neu laden

Nachdem alle notwendigen Ports freigegeben wurden, müssen Sie firewalld neu laden, um die Änderungen zu übernehmen:

sudo firewall-cmd --reload

Führen Sie diese Konfiguration auf allen Servern durch, die Teil des RabbitMQ-Clusters sein sollen.

 

 

Installation des CLI-Tools rabbitmqadmin

Die Verwaltungsoberfläche von RabbitMQ stellt ein Python-basiertes Tool namens rabbitmqadmin bereit, das verfügbar ist, sobald das Management-Plugin aktiviert wurde. Die Installation erfolgt mit den folgenden Befehlen:

sudo wget http://localhost:15672/cli/rabbitmqadmin
sudo mv rabbitmqadmin /usr/local/bin/
sudo chmod +x /usr/local/bin/rabbitmqadmin

DNS für Hostnamenauflösung konfigurieren

Für den Aufbau eines RabbitMQ-Clusters ist es erforderlich, dass die Server sich gegenseitig über Hostnamen erkennen. Da in der Regel keine DNS-Einträge vorhanden sind, müssen Sie die Datei /etc/hosts auf jedem Server bearbeiten und IP-Adressen entsprechenden Hostnamen zuordnen.

Nachfolgend ein Beispiel für die /etc/hosts-Datei eines Master-Servers. Passen Sie die IP-Adressen und Hostnamen an Ihre Umgebung an:

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

RabbitMQ-Server zu einem Cluster verbinden

Damit mehrere RabbitMQ-Server einem gemeinsamen Cluster beitreten können, müssen alle denselben Erlang-Cookie verwenden. Standardmäßig erstellt jede Instanz einen eigenen Cookie, daher muss dieser manuell auf allen Systemen gesetzt werden.

Der Cookie lässt sich mit folgendem Befehl setzen (Sie können einen beliebigen Wert verwenden):

sudo sh -c "echo 'WE<3COOKIES' > /var/lib/rabbitmq/.erlang.cookie"

Starten Sie anschließend den RabbitMQ-Dienst neu, damit die Änderung übernommen wird:

sudo systemctl restart rabbitmq-server.service

Führen Sie die folgenden Befehle auf allen Knoten außer dem Master aus, um sie dem Cluster hinzuzufügen:

sudo rabbitmqctl stop_app
sudo rabbitmqctl join_cluster "rabbit@<YOUR_MASTER_SERVER_HOST_NAME>"
sudo rabbitmqctl start_app

Prüfen Sie den Clusterstatus anschließend mit diesem Befehl:

sudo rabbitmqctl cluster_status

Alle verbundenen Knoten werden im Abschnitt nodes und running_nodes aufgelistet. Ab diesem Moment werden alle Konfigurationen automatisch an die weiteren Knoten im Cluster übertragen.

 

 

Hochverfügbarkeit für Queues und Exchanges aktivieren

Erstellen Sie eine Hochverfügbarkeitsrichtlinie über die Verwaltungsoberfläche oder die Kommandozeile, um eine hohe Ausfallsicherheit und Datenbeständigkeit sicherzustellen. Das folgende Beispiel definiert eine Richtlinie für die Spiegelung von Daten auf zwei Knoten:

sudo rabbitmqctl set_policy -p "/" --priority 1 --apply-to "all" ha ".*" '{ "ha-mode": "exactly", "ha-params": 2, "ha-sync-mode": "automatic"}'

Erklärung der Parameter:

  • -p "/": Gilt für den Standard-Virtual-Host
  • --priority 1: Bestimmt die Priorität der Regel
  • --apply-to "all": Gilt für Queues und Exchanges
  • ha: Name der Richtlinie
  • ".*": Regulärer Ausdruck für alle Ressourcen
  • JSON-Objekt: Gibt an, dass exakt 2 Knoten synchronisiert werden und die Synchronisation automatisch erfolgt

Sie können den Wert von ha-params erhöhen, um weitere Replikate zu erzeugen. Für maximale Ausfallsicherheit empfiehlt sich eine Konfiguration mit Quorum (N/2 + 1). Bedenken Sie jedoch, dass eine größere Anzahl an Kopien die Performance durch erhöhten Netzwerk-, Speicher- und IO-Bedarf beeinträchtigen kann.

Alternative Strategien zur Spiegelung

Daten auf alle Cluster-Knoten spiegeln:

'{ "ha-mode": "all", "ha-sync-mode": "automatic"}'

Daten gezielt nur auf bestimmte Knoten spiegeln (z. B. node-1 und node-2):

'{ "ha-mode": "nodes", "ha-params" :["rabbit@node-1", "rabbit@node-2"], "ha-sync-mode": "automatic"}'

Es ist außerdem möglich, Richtlinien für bestimmte Queue-Namen zu definieren. Angenommen, Sie haben folgende Knoten:

  • rabbit@master
  • rabbit@client-ha
  • rabbit@product-ha

Sie können dann separate Richtlinien für Queues mit dem Präfix client bzw. product erstellen:

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"}'

Hinweis: Exklusive Queues, die automatisch gelöscht werden, sobald der Client die Verbindung trennt, können nicht gespiegelt werden. Auch wenn eine entsprechende Richtlinie existiert, werden solche Queues nicht repliziert – da ihre Kurzlebigkeit eine Spiegelung überflüssig macht.

 

 

Den RabbitMQ-Cluster testen

Um die Clusterkonfiguration zu überprüfen, legen Sie über die Kommandozeile mit Hilfe des Management-Plugins eine neue Queue an:

sudo rabbitmqadmin declare queue --vhost "/" name=my-ha-queue durable=true

Dieser Befehl erstellt eine dauerhafte Queue mit dem Namen my-ha-queue im Standard-Virtual-Host /.

Überprüfen Sie anschließend, ob diese Queue der Hochverfügbarkeitsrichtlinie zugeordnet ist und auf mehrere Knoten gespiegelt wurde:

sudo rabbitmqctl list_queues name policy state pid slave_pids

Senden Sie nun von Ihrem Master-Knoten eine Testnachricht an die Queue:

sudo rabbitmqadmin -u user_name -p password publish routing_key=my-ha-queue payload="hello world"

Fahren Sie anschließend RabbitMQ auf dem Master-Knoten herunter, um ein Failover-Szenario zu simulieren:

sudo systemctl rabbitmqctl shutdown

Rufen Sie die Nachricht nun über den Spiegelknoten ab, indem Sie dessen IP-Adresse oder DNS-Namen verwenden:

sudo rabbitmqadmin -H MIRROR_NODE_IP_OR_DNS -u user_name -p password get queue=my-ha-queue

Zum Schluss starten Sie den Master-Knoten wieder:

sudo systemctl start rabbitmq-server.service

Standardbenutzer „guest“ entfernen

RabbitMQ wird mit einem vordefinierten Benutzerkonto guest ausgeliefert. Dieses Konto sollte auf öffentlich erreichbaren Systemen aus Sicherheitsgründen entfernt werden.

Nutzen Sie folgenden Befehl, um den Gastbenutzer zu löschen:

sudo rabbitmqctl delete_user guest

Fazit

Mit dieser umfassenden Anleitung haben Sie erfolgreich einen stabilen und hochverfügbaren RabbitMQ-Cluster unter CentOS 7 eingerichtet. Durch die Kombination mehrerer Knoten, das Spiegeln von Queues und Exchanges sowie die Einrichtung automatischer Failover-Mechanismen ist Ihr Messaging-System gegen Ausfälle abgesichert. Die Konfiguration von Firewallregeln, DNS-Zuweisungen, Clustereinstellungen und Replikationsrichtlinien trägt zur Robustheit Ihrer Infrastruktur bei.

Überwachen Sie regelmäßig den Zustand Ihres Clusters, analysieren Sie Leistungskennzahlen und passen Sie Richtlinien an wachsende Anforderungen an. Bei korrekter Pflege stellt Ihr RabbitMQ-Cluster eine zuverlässige und sichere Nachrichtenübertragung für Ihre gesamte Microservice-Landschaft sicher.

Quelle: vultr.com

Jetzt 200€ Guthaben sichern

Registrieren Sie sich jetzt in unserer ccloud³ und erhalten Sie 200€ Startguthaben für Ihr Projekt.

Das könnte Sie auch interessieren: