RabbitMQ-Autokonfiguration des Clusters

RabbitMQ-Autokonfiguration des Clusters

Das RabbitMQ-Clustering-Dokument

https://www.rabbitmq.com/clustering.html

beschreibt einen Prozess, mit dem Sie eine Konfigurationsdatei für das Clustering bereitstellen können, sodass beim Booten Ihrer RabbitMQ-Knoten automatisch ein Cluster erstellt wird.

[{rabbit,
  [{cluster_nodes, {['rabbit@rabbit1', 'rabbit@rabbit2', 'rabbit@rabbit3'], ram}}]}].

Sie wenden diese Datei auf jedem der 3 Knoten unter /etc/rabbitmq/rabbitmq.config an und starten dann rabbitmq auf jedem Knoten. Es wird sich anscheinend ein Cluster bilden.

Dies scheint nicht besonders gut zu funktionieren, z. B.

Wenn Sie rabbit2 starten und rabbit3 noch nicht gestartet ist, wird der Dienst auf rabbit2 nicht gestartet, da er versucht, einen Cluster mit rabbit3 zu erstellen.

Wenn Sie die Konfiguration nur auf rabbit1 anwenden und rabbit2 und rabbit3 vorab gestartet haben, bildet rabbit1 entsprechend der Dokumentation (ich verstehe nicht, warum) nur mit rabbit2 einen Cluster:

RabbitMQ will try to cluster to each node provided, and stop after it can cluster with one of them.

Dies scheint nur zu funktionieren, wenn Sie die Konfigurationsdatei auf allen 3 Knoten anwenden und diese beigenauzur gleichen Zeit. Ich versuche, dies mit Ansible bereitzustellen, das die Knoten sequenziell erstellt, also funktioniert das nicht.

Was übersehe ich hier?

Antwort1

Ich stelle auch RabbitMQ-Cluster mit Puppet bereit, und Sie müssen tatsächlich nicht alle Knoten gleichzeitig hochfahren.

Normalerweise mache ich Folgendes und bisher hat es bei mir funktioniert:

  • Installieren Sie RabbitMQ (RPM oder DEB).
  • Richten Sie auf jedem Knoten eine Hosts-Datei ein, die Einträge für alle drei enthält. Beispiel:

.

192.168.1.11    dev-c1n01-rabbitmq.example.com  dev-c1n01-rabbitmq
192.168.1.12    dev-c1n02-rabbitmq.example.com  dev-c1n02-rabbitmq
192.168.1.13    dev-c1n03-rabbitmq.example.com  dev-c1n03-rabbitmq

Knoten, die wir zusammenfassen (weil ich mich nicht auf die Verfügbarkeit von DNS verlassen möchte) * Bereitstellen von rabbitmq.config

.

[
  {rabbit, [
    {cluster_nodes, {['rabbit@dev-c1n01-rabbitmq', 'rabbit@dev-c1n02-rabbitmq', 'rabbit@dev-c1n03-rabbitmq'], disc}},
    {cluster_partition_handling, pause_minority},
    {disk_free_limit, 2147483648},
    {heartbeat, 0},
    {tcp_listen_options, [binary, {backlog, 1024}, {nodelay, true}, {keepalive, true} ]},
    {vm_memory_high_watermark, 0.6},
    {default_user, <<"admin">>},
    {default_pass, <<"somedefaultpass">>}
  ]},
  {kernel, [

  ]}
,
  {rabbitmq_management, [
    {listener, [
      {port, 15672}
    ]}
  ]}
].
% EOF
  • erlang.cookie bereitstellen

Um Erlang-Cookies zu erstellen, verwende ich normalerweisehttp://passwordsgenerator.net/und richten Sie es so ein, dass eine 20-stellige Zeichenfolge erstellt wird, die nur aus Großbuchstaben besteht. Fügen Sie diese Zeichenfolge dann wie folgt in /var/lib/rabbitmq/.erlang.cookie ein:

echo -n 'LCQLSHVOPZFHRUXMMAPF' > /var/lib/rabbitmq/.erlang.cookie
  • Startknoten (Reihenfolge spielt keine Rolle, solange sie dasselbe erlang.cookie und dieselbe rabbitmq.config haben)

Das sollte bei Ihnen funktionieren. Getestet mit den Versionen 3.2, 3.3 und 3.5.

Antwort2

Ich habe diesbezüglich einige Fortschritte gemacht.

Das Problem scheint mit der Wahl der Verwendung vonRAMKnoten stattRabattKnoten in der Datei rabbitmq.config. Aus der Dokumentation:

RAM-Knoten sind ein fortgeschrittener Anwendungsfall. Wenn Sie Ihren ersten Cluster einrichten, sollten Sie sie einfach nicht verwenden. Sie sollten über genügend Festplattenknoten verfügen, um Ihre Redundanzanforderungen zu erfüllen, und dann bei Bedarf zusätzliche RAM-Knoten zur Skalierung hinzufügen.

Ein Cluster, der nur RAM-Knoten enthält, ist fragil. Wenn der Cluster stoppt, können Sie ihn nicht erneut starten und verlieren alle Daten. RabbitMQ verhindert in vielen Situationen die Erstellung eines Clusters, der nur aus RAM-Knoten besteht, aber es kann dies nicht absolut verhindern.

Wenn ich die Konfigurationsdatei so ändere, dass „Disc“ statt „RAM“ verwendet wird, war die Clustererstellung viel stabiler.

[{rabbit,
    [{cluster_nodes, {['rabbit@rabbit1', 'rabbit@rabbit2', 'rabbit@rabbit3'],disc}}]}].

verwandte Informationen