So clustern Sie RabbitMQ in AWS

So clustern Sie RabbitMQ in AWS

Ich habe jede erdenkliche Kombination ausprobiert, um rabbitmq in einer AWS-Umgebung zu clustern. Aber um es noch einmal zusammenzufassen:

  1. Erlang- und Rabbit-Distribution auf meinem lokalen Ubuntu 14 heruntergefahren und entfernt
  2. Habe die Autokonfigurationsmodule im Web ausprobiert
  3. Die standardmäßig installierte Version von Ubuntu 14 reicht dafür nicht aus.
  4. Die Erlang-Cookies passen zusammen – dies wird unten demonstriert

Die Nichtübereinstimmung der Hostnamen ist das einzige Rätsel. Der Knoten selbst denkt, sein Hostname sei „q1“ bzw. „q2“. Wenn ich versuche, den Hostnamen des Containers auf den privaten DNS-Namen des Hosts einzustellen (damit er eine Verbindung zum anderen Knoten herstellen kann), stürzt die Rabbit-Instanz im Container ab. Wie hostnamefunktioniert das nicht q2, aber ich habe mich in einen privaten DNS von Amazon eingeloggt?

root@q2:~# hostname
q2
root@q2:~# exit
christian@q2:~$ logout
Connection to ip-10-0-3-101.us-west-2.compute.internal closed.

Ich verwende das neueste RabbitMQ-Docker-Image.

docker run -d --restart always --hostname q1 --name rabbitmq -p 4369:4369 -p 15671:15671 -p 25672:25672 -p 15672:15672 -p 5672:5672 -e RABBITMQ_HIPE_COMPILE=1 -e RABBITMQ_ERLANG_COOKIE='ilikecookies' rabbitmq:3-management

Der Dienst startet problemlos

root@q1:~# curl -I localhost:15672
HTTP/1.1 200 OK
Content-Length: 1419
Content-Type: text/html
Date: Fri, 20 Jan 2017 22:46:12 GMT
last-modified: Fri, 20 Jan 2017 22:38:45 GMT
Server: MochiWeb/1.0 (Any of you quaids got a smint?)

Und hier ist der Cookie vom Host q1

root@q1:~# docker exec -it rabbitmq /bin/bash
root@q1:/# cat /var/lib/rabbitmq/.erlang.cookie                                                                               
ilikecookies
root@q1:/# 

Jetzt versuche ich, es zu clustern (vom Host q2, wobei q1 der Master ist)

root@q2:~# docker exec -it rabbitmq /bin/bash
root@q2:/# rabbitmqctl stop_app
Stopping node rabbit@q2 ...
root@q2:/# rabbitmqctl join_cluster [email protected]
Clustering node rabbit@q2 with '[email protected]' ...
Error: unable to connect to nodes ['[email protected]']: nodedown

DIAGNOSTICS
===========

attempted to contact: ['[email protected]']

[email protected]:
  * connected to epmd (port 4369) on ip-10-0-3-56.us-west-2.compute.internal
  * epmd reports node 'rabbit' running on port 25672
  * TCP connection succeeded but Erlang distribution failed
  * suggestion: hostname mismatch?
  * suggestion: is the cookie set correctly?
  * suggestion: is the Erlang distribution using TLS?

current node details:
- node name: 'rabbitmq-cli-41@q2'
- home dir: /var/lib/rabbitmq
- cookie hash: quN0y0GUm2Zxv8VYc2eX9A==

root@q2:/# cat /var/lib/rabbitmq/.erlang.cookie
ilikecookies
root@q2:/# 

Die Frageist, WIE bekommt man diese Dinge zum Clustern? Welche Zutat fehlt? Die Fehlermeldung bedeutet im Internet nichts. Hat jemand Erfahrung damit?

AKTUALISIEREN AWS-Sicherheitsgruppe für diese Instanzen:

Custom TCP Rule
TCP
1024 - 65535
0.0.0.0/0

Antwort1

OK ich habe es!

Die Hostnamen der einzelnen Knoten müssen innerhalb des Containers übereinstimmen.

Auf dem Hostcomputer (q2) habe ich in der Hosts-Datei geprüft, welche Hosts ihm bekannt sind:

# This file was generated by OpsWorks
# any manual changes will be removed on the next update.

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

# OpsWorks Layer State
127.0.0.1 localhost.localdomain localhost
127.0.1.1 q2.localdomain q2

10.0.3.56 q1.localdomain q1
10.0.3.101 q2.localdomain q2


root@q2:/# ping q1
PING q1.local (10.0.3.56): 56 data bytes
^C--- q1.local ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss

Dann fiel mir auf, dass es überhaupt nicht darauf ankommt, was der Host-Rechner weiß, sondern was der Docker-Container weiß. Also habe ich mich in den Container eingeloggt und dasselbe gemacht:

root@q2:/# cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2  q2.local

Jetzt sind wir auf der richtigen Spur! Also habe ich einen Eintrag für den Knotenmaster hinzugefügt:

root@q2:/# echo "10.0.3.56    q1.local q1" >> /etc/hosts
root@q2:/# which ping
/bin/ping
root@q2:/# ping q1
PING q1.local (10.0.3.56): 56 data bytes

Und schlug noch einmal in den Container

root@q2:/# rabbitmqctl stop_app
Stopping node rabbit@q2 ...
root@q2:/# rabbitmqctl join_cluster rabbit@q1                                     
Clustering node rabbit@q2 with rabbit@q1 ...
root@q2:/#

Und jetzt erkennt jeder Knoten, dass er geclustert ist! Juhu!

Ich denke, für das Clustering mit Docker werde ich den Docker-Befehl so ändern, dass die Hosts- /etc/hostsDatei in das Docker-Image eingebunden wird, -v /etc/hosts:/etc/hosts:round dann sollte das wie von Zauberhand funktionieren.

Ein weiterer Schritt, den ich vergessen habe zu erwähnen: Auf der lokalen Ubuntu-Box lief eine uralte Version von Erlang, die ich entfernen musste (und sie hatte auch Rabbit).

verwandte Informationen