Verwalten Ihres RabbitMQ-Clusters

RabbitMQ ist ein großartiger verteilter Nachrichtenbroker, der jedoch nicht so einfach programmgesteuert verwaltet werden kann. In diesem Tutorial zeige ich Ihnen, wie Sie einen Cluster erstellen, Knoten hinzufügen, Knoten entfernen, starten und stoppen. Als Bonus teile ich eine Fabric-Datei, mit der Sie die totale Kontrolle übernehmen können. Der Code ist auf GitHub verfügbar.

Schnelle Einführung in RabbitMQ

RabbitMQ ist eine sehr beliebte Nachrichtenwarteschlange. Sie können mehrere Hersteller dazu veranlassen, Nachrichten zu senden, und Verbraucher können diese Nachrichten völlig entkoppelt verwenden. RabbitMQ ist aus mehreren Gründen sehr beliebt:

  1. Es ist schnell und robust.
  2. Es ist Open Source, aber es gibt kommerzielle Unterstützung, wenn Sie es wollen.
  3. Es läuft auf Ihrem Betriebssystem.
  4. Es ist aktiv entwickelt.
  5. Es ist kampferprobt.

RabbitMQ ist in Erlang implementiert, was etwas ungewöhnlich ist, aber einer der Gründe ist, dass es so zuverlässig ist.

Voraussetzungen

In diesem Tutorial verwende ich einen lokalen Vagrant-Cluster mit drei Knoten. Wenn Sie bereits über drei verfügbare Maschinen verfügen (virtuelle oder nicht), können Sie diese stattdessen verwenden. Achten Sie auf die Anschlüsse und das Netzwerk.

Installieren Sie VirtualBox

Folgen Sie den Anweisungen, um VirtualBox zu installieren.

Installieren Sie Vagrant

Folgen Sie den Anweisungen, um Vagrant zu installieren

Erstellen Sie einen RabbitMQ-Cluster

Hier ist eine Vagrant-Datei, die einen lokalen Cluster mit drei Knoten auf Ihrem Computer erstellt. Das Betriebssystem ist Ubuntu 14.04 (Trusty).

ruby # - * - Modus: ruby ​​- * - # vi: set ft = ruby: hosts = "rabbit-1" => "192.168.77.10", "rabbit-2" => "192.168.77.11", "rabbit" -3 "=>" 192.168.77.12 " Vagrant.configure (" 2 ") do | config | config.vm.box = "trusty64" hosts.each_with_index do | (name, ip), i | rmq_port = 5672 + i admin_port = 15672 + i config.vm.define name do | machine | machine.vm.network: private_network, ip: ip config.vm.hostname = "rabbit-% d"% [i + 1] config.vm.network: forwarded_port, guest: 5672, guest_ip: ip, host: rmq_port config. vm.network: forwarded_port, guest: 15672, guest_ip: ip, host: admin_port machine.vm.provider "virtualbox" do | v | v.name = Name Ende Ende Ende

Um einen leeren Cluster zu erstellen, geben Sie Folgendes ein: vagrant up.

SSH konfigurieren

Geben Sie Folgendes ein, um das Einfügen in die Clusterknoten zu vereinfachen: vagrant ssh-config >> ~ / .ssh / config.

Wenn Sie Folgendes eingeben: cat ~ / .ssh / config, Sie sollten Einträge für Kaninchen-1, Kaninchen-2 und Kaninchen-3 sehen.

Jetzt können Sie ssh in jede virtuelle Maschine nach Namen eingeben: ssh Kaninchen-1.

Stellen Sie sicher, dass die Knoten über den Namen erreichbar sind

Am einfachsten ist es, die Datei / etc / hosts zu bearbeiten. Fügen Sie beispielsweise für Kaninchen-1 die Adressen von Kaninchen-2 und Kaninchen-3 hinzu.

plain 192.168.77.11 Kaninchen-2 192.168.77.12 Kaninchen-3

Wiederholen Sie den Vorgang für alle Knoten.

Installieren Sie RabbitMQ

Ich werde apt-get hier für Debian / Ubuntu-Betriebssysteme verwenden. Wenn Ihr Cluster auf einem anderen Betriebssystem ausgeführt wird, befolgen Sie die Anweisungen auf der RabbitMQ-Installationsseite.

Beachten Sie, dass in manchen Fällen eine veraltete Version von RabbitMQ standardmäßig verfügbar ist. Wenn Sie das neueste und beste installieren möchten, können Sie ein .deb-Paket direkt herunterladen oder das apt-Repository von RabbitMQ hinzufügen, indem Sie diese Anweisungen verwenden.

Die aktuelle Version von RabbitMQ auf Ubuntu 14.04 ist 3.2, was für unsere Zwecke gut genug ist. Bestätigen Sie sich selbst, indem Sie Folgendes eingeben: apt-cache show rabbitmq-server.

Lass uns fortfahren und es auf jedem Rechner installieren:

Einfach Sudo Apt-Get Update Sudo Apt-Get installieren RabbitMq-Server -y

Wenn Sie möchten, können Sie Ihr bevorzugtes Konfigurationsmanagement-Tool wie Chef oder Ansible verwenden.

Beachten Sie, dass Erlang zuerst als Voraussetzung installiert wird.

Aktivieren Sie das RabbitMQ Management Plugin

Das Management-Plugin ist wirklich cool. Sie erhalten eine HTTP-basierte API sowie eine Web-GUI und ein Befehlszeilenprogramm zum Verwalten des Clusters. So aktivieren Sie es:

einfache sudo rabbitmq-plugins ermöglichen rabbitmq_management

Holen Sie sich das Management Command Line Tool

Laden Sie es von http://192.168.77.10:15672/cli/rabbitmqadmin herunter. Beachten Sie, dass die RabbitMQ-Dokumentation falsch ist und Sie zum Herunterladen von http: // aufgefordert werden.: 15672 / cli /.

Dies ist ein Python-basierter HTTP-Client für die RabbitMQ-Verwaltungs-HTTP-API. Es ist sehr praktisch für das Scripting von RabbitMQ-Clustern.

Grundlegende RabbitMQ-Konzepte

RabbitMQ implementiert den AMQP 0.9.1-Standard (Advanced Message Queue Protocol). Beachten Sie, dass es bereits einen AMQP 1.0-Standard gibt und RabbitMQ über ein Plugin zur Unterstützung verfügt. Es wird jedoch als Prototyp betrachtet, da es in der Praxis nur unzureichend verwendet wird.

Im AMQP-Modell senden Publisher über einen Austausch Nachrichten an einen Nachrichtenbroker (in diesem Fall RabbitMQ ist der Nachrichtenbroker). Der Nachrichtenbroker verteilt die Nachrichten auf der Grundlage der der Nachricht zugeordneten Metadaten an Warteschlangen. Verbraucher konsumieren Nachrichten aus Warteschlangen. Nachrichten können bestätigt werden oder nicht. RabbitMQ unterstützt eine Vielzahl von Programmiermodellen zusätzlich zu diesen Konzepten wie Arbeitswarteschlangen, Publish-Subscribe und RPC.

Cluster verwalten

Es gibt drei Skripts, die zur Verwaltung des Clusters verwendet werden. Das rabbitmq-server-Skript startet einen RabbitMQ-Server (starten Sie ihn). Der rabbitmqctl wird verwendet, um den Cluster zu steuern (stoppen, zurücksetzen, Knoten zusammenfassen und Status abrufen). Der rabbitmqadmin, den Sie zuvor heruntergeladen haben, wird zum Konfigurieren und Verwalten des Clusters (Deklaration von vhosts, Benutzern, Austauschen und Warteschlangen) verwendet. Das Erstellen eines Clusters umfasst nur rabbitmq-server und rabbitmqctl.

Zunächst starten wir den rabbitmq-server als Dienst (Daemon) auf jedem unserer Hosts rabbit-1, rabbit-2 und rabbit-3.

Einfacher sudo-Dienst rabbitmq-server start

Dies startet sowohl die Erlang-VM als auch die RabbitMQ-Anwendung, wenn der Knoten inaktiv ist. Um zu überprüfen, ob es ordnungsgemäß läuft, geben Sie Folgendes ein:

einfaches sudo rabbitmqctl cluster_status

Die Ausgabe sollte (für Kaninchen-1) sein:

plain Cluster-Status des Knotens 'rabbit @ rabbit-1'… [Knoten, [Disk, ['rabbit @ rabbit-1' Laufknoten '[rabbit @ rabbit-1] Partitionen ,[]]… erledigt.

Dies bedeutet, dass der Knoten noch nicht mit anderen Knoten gruppiert ist und es sich um einen Disc-Knoten handelt. Es wird auch ausgeführt, wie Sie sehen, dass es in der Liste running_nodes angezeigt wird.

Geben Sie den folgenden Befehl aus, um den Server zu stoppen:

einfaches sudo rabbitmqctl stop_app

Wenn Sie dann den Clusterstatus überprüfen:

einfaches sudo rabbitmqctl cluster_status

Die Ausgabe sollte sein:

plain Cluster-Status des Knotens 'rabbit @ rabbit-1'… [node, [disc, ['rabbit @ rabbit-1']] ... fertig.

Keine laufenden Knoten mehr.

Sie können den Vorgang für die anderen Knoten (Kaninchen-2 und Kaninchen-3) wiederholen und sehen, dass sie nur sich selbst kennen.

Das Erlang-Plätzchen

Bevor Sie einen Cluster erstellen können, müssen alle Knoten im Cluster das gleiche Cookie haben. Das Cookie ist eine Datei, die von der Erlang-Laufzeitumgebung verwendet wird, um Knoten zu identifizieren. Es befindet sich in /var/lib/rabbitmq/.erlang.cookie. Kopieren Sie einfach den Inhalt von Kaninchen-1 zu Kaninchen-2 und Kaninchen-3.

Knoten zusammen gruppieren

Um diese separaten Knoten in einem zusammenhängenden Cluster zu gruppieren, ist einige Arbeit erforderlich. Hier ist das Verfahren:

  • Einen einzelnen Knoten ausführen (z. B. Kaninchen-1).
  • Stoppen Sie einen anderen Knoten (z. B. Kaninchen-2)..
  • Zurücksetzen des gestoppten Knotens (Kaninchen-2).
  • Gruppieren Sie den anderen Knoten mit dem Stammknoten.
  • Starten Sie den gestoppten Knoten.

Lass uns das machen. ssh in rabbit-2 und führen Sie die folgenden Befehle aus:

einfaches sudo rabbitmqctl stop_app sudo rabbitmqctl reset sudo rabbitmqctl join_cluster rabbit @ rabbit-1

Jetzt tippen: sudo rabbitmqctl cluster_status.

Die Ausgabe sollte sein:

"einfacher Clusterstatus des Knotens 'rabbit @ rabbit-2'… [Knoten, [Scheibe, ['rabbit @ rabbit-1' ',' rabbit @ rabbit-2 ']]… fertig. Wie Sie sehen können Beide Knoten sind jetzt gruppiert. Wenn Sie dies für Kaninchen-1 wiederholen, erhalten Sie folgende Ausgabe:

Clusterstatus des Knotens 'rabbit @ rabbit-1'… [Knoten, [Scheibe, ['rabbit @ rabbit-1', 'rabbit @ rabbit-2']], running_nodes, ['rabbit @ rabbit- 1 '], Partitionen, []]… fertig. "

Jetzt können Sie Kaninchen-2 starten.

einfaches sudo rabbitmqctl start_app

Wenn Sie den Status erneut überprüfen, werden beide Knoten ausgeführt:

plain Clusterstatus des Knotens 'rabbit @ rabbit-2'… [Knoten, [Scheibe, ['rabbit @ rabbit-1', 'rabbit @ rabbit-2']], running_nodes, ['rabbit @ rabbit -1 ',' rabbit @ rabbit-2 '], Partitionen, []]… fertig.

Beachten Sie, dass beide Knoten Disc-Knoten sind, dh, sie speichern ihre Metadaten auf Disc. Fügen wir rabbit-3 als RAM-Knoten hinzu. ssh an rabbit-3 und geben Sie die folgenden Befehle aus:

einfaches sudo rabbitmqctl stop_app sudo rabbitmqctl zurücksetzen sudo rabbitmqctl join_cluster --ram rabbit @ rabbit-2 sudo rabbitmqctl start_app

Überprüfen des Status zeigt:

plain Cluster-Status des Knotens 'rabbit @ rabbit-3'… [Knoten, [Scheibe, ['rabbit @ rabbit-2' ',' rabbit @ rabbit-1 '], ram, [' rabbit @ rabbit-3 ']], running_nodes, [' rabbit @ rabbit-1 '', 'rabbit @ rabbit-2', 'rabbit @ rabbit-3'], Partitionen, []] ... fertig.

Alle Clusterknoten werden ausgeführt. Die Disc-Knoten sind Kaninchen-1 und Kaninchen-2, und der RAM-Knoten ist Kaninchen-3.

Herzliche Glückwünsche! Sie haben einen funktionierenden RabbitMQ-Cluster.

Komplikationen in der realen Welt

Was passiert, wenn Sie Ihre Clusterkonfiguration ändern möchten? Beim Hinzufügen und Entfernen von Knoten aus dem Cluster müssen Sie chirurgische Präzision verwenden.

Was passiert, wenn ein Knoten noch nicht neu gestartet wurde, Sie aber versuchen, mit dem Knoten fortzufahren? stop_app, zurücksetzen und start_app? Nun, der stop_app-Befehl wird scheinbar erfolgreich sein und "done" zurückgeben, auch wenn der Zielknoten ausgefallen ist. Der nachfolgende Reset-Befehl schlägt jedoch mit einer bösen Nachricht fehl. Ich habe viel Zeit damit verbracht, mir den Kopf zu kratzen, um es herauszufinden, weil ich davon ausging, dass das Problem eine Konfigurationsoption war, die nur das Zurücksetzen betraf.

Ein anderes Problem ist, wenn Sie den letzten Disc-Knoten zurücksetzen möchten, müssen Sie verwenden force_reset. Der Versuch, im allgemeinen Fall herauszufinden, welcher Knoten der letzte Scheibenknoten war, ist nicht trivial.

RabbitMQ unterstützt auch das Clustering über Konfigurationsdateien. Dies ist ideal, wenn Ihre Disc-Knoten aktiv sind, da neu gestartete RAM-Knoten nur auf der Konfigurationsdatei basierend gruppiert werden, ohne dass Sie sie explizit zusammenfassen müssen. Wieder fliegt es nicht, wenn Sie versuchen, einen beschädigten Cluster wiederherzustellen.

Zuverlässiges RabbitMQ-Clustering

Es kommt darauf an: Sie wissen nicht, welcher der letzte Diskknoten der Fall war. Sie kennen die Clustering-Metadaten der einzelnen Knoten nicht (möglicherweise wurden sie beim Zurücksetzen nicht ausgeführt). Um alle Knoten zu starten, verwende ich den folgenden Algorithmus:

  • Alle Knoten starten (zumindest der letzte Disc-Knoten sollte starten können).
  • Wenn nicht einmal ein einzelner Knoten starten kann, sind Sie abgespritzt. Einfach rauskommen.
  • Verfolgen Sie alle Knoten, deren Start fehlgeschlagen ist.
  • Versuchen Sie, alle ausgefallenen Knoten zu starten.
  • Wenn einige Knoten beim zweiten Mal nicht gestartet wurden, werden Sie abgespritzt. Einfach rauskommen.

Dieser Algorithmus funktioniert, solange der letzte Disc-Knoten physisch in Ordnung ist.

Sobald alle Cluster-Knoten aktiv sind, können Sie sie neu konfigurieren (denken Sie daran, dass Sie nicht sicher sind, welche Cluster-Metadaten die einzelnen Knoten enthalten). Der Schlüssel ist force_reset jeden Knoten. Dadurch wird sichergestellt, dass alle Spuren der vorherigen Clusterkonfiguration von allen Knoten gelöscht werden. Zuerst machen Sie es für einen Disc-Knoten:

plain stop_app force_reset start_app

Dann für jeden anderen Knoten (entweder Disc oder RAM):

plain stop_app force_reset join_cluster [Liste der Disc-Knoten] start_app

Fernsteuerung eines Clusters

Sie können SSH in jede Box einfügen und die oben genannten Schritte für jede Box manuell ausführen. Das funktioniert, aber es wird sehr schnell alt. Es ist auch unpraktisch, wenn Sie einen Cluster als Teil eines automatisierten Tests erstellen und abbauen möchten.

Eine Lösung ist die Verwendung von Fabric. Ein ernstes Problem, auf das ich gestoßen bin, ist, dass es beim Ausführen des Build-Cluster-Algorithmus einwandfrei funktionierte, aber bei der Verwendung von Fabric ein Fehler auftrat, der auf mysteriöse Weise fehlschlug. Nach einigem Debugging bemerkte ich, dass die Knoten erfolgreich gestartet wurden. Als ich jedoch stop_app versuchte, waren die Knoten inaktiv. Es stellte sich heraus, dass es sich bei mir um einen Stoffneuling-Fehler handelte. Wenn Sie einen Remote-Befehl mit Fabric ausgeben, wird auf dem Remote-Computer eine neue Shell gestartet. Wenn der Befehl abgeschlossen ist, wird die Shell geschlossen und sendet ein SIGHUP-Signal (Auflegen) an alle Unterprozesse, einschließlich des Erlang-Knotens. Dafür sorgt nohup. Eine weitere robuste Option ist, RabbitMQ als Dienst (Daemon) auszuführen..

Programmgesteuertes Verwalten eines Clusters

Verwaltung bedeutet, virtuelle Hosts, Benutzer, Austausche und Warteschlangen zu erstellen, Berechtigungen festzulegen und Warteschlangen an den Austausch zu binden. Wenn Sie dies noch nicht getan haben, sollten Sie zunächst die Management-Plug-Ins installieren. Ich bin nicht sicher, warum Sie es selbst aktivieren müssen. Es sollte standardmäßig aktiviert sein.

Die Web-Benutzeroberfläche ist fantastisch und Sie sollten sich unbedingt damit vertraut machen. Für die Remote-Verwaltung eines Clusters steht jedoch eine RESTful-Verwaltungs-API zur Verfügung, die Sie verwenden können. Es gibt auch ein Python-Befehlszeilentool namens rabbitmqadmin, für das Python 2.6+ erforderlich ist. Rabbitmqadmin zu benutzen ist ziemlich einfach. Das einzige Problem, das ich gefunden habe, ist, dass ich nur das Standard-Gastkonto zur Verwaltung des Clusters verwenden konnte. Ich habe einen weiteren Administratorbenutzer mit dem Namen 'admin' erstellt, seine Berechtigungen auf alle festgelegt (Konfigurieren / Lesen / Schreiben) und ihm ein Tag mit dem Namen 'administrator' (zusätzliche Anforderung der Verwaltungs-API) zugewiesen. Ich erhielt jedoch weiterhin Berechtigungsfehler.

Mit dem Elmer-Projekt können Sie eine Clusterkonfiguration als Python-Datenstruktur angeben (siehe sample_config.py) und alles für Sie einrichten.

Take-Home-Punkte

  1. RabbitMQ ist cool.
  2. Die Cluster-Admin-Story ist nicht luftdicht.
  3. Programmatische Administration ist der Schlüssel.
  4. Fabric ist ein hervorragendes Werkzeug zur Fernsteuerung mehrerer Unix-Boxen.