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.
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:
RabbitMQ ist in Erlang implementiert, was etwas ungewöhnlich ist, aber einer der Gründe ist, dass es so zuverlässig ist.
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.
Folgen Sie den Anweisungen, um VirtualBox zu installieren.
Folgen Sie den Anweisungen, um Vagrant zu installieren
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
.
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
.
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.
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.
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
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.
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.
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.
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.
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.
Um diese separaten Knoten in einem zusammenhängenden Cluster zu gruppieren, ist einige Arbeit erforderlich. Hier ist das Verfahren:
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.
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.
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:
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
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..
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.