Ich nutze zuhause ein RabbitMQ Server um gewisse Aufgaben in meinem Node-RED in Queues zu schreiben, damit diese asynchron verarbeitet werden können. Einige der Daten sollen dauerhaft vorgehalten werden. Heute fiel mit auf, dass in meinem RabbitMQ die Verbindung zu RabbitMQ nicht als aktiv angezeigt wurde. Ich war quasi offline.
Fehlersuche
Ein Blick auf den Server zeigte mir, dass ich keine korrekte restart policy in der docker-compose.yml eingetragen hatte.
Nach einem restart: unless-stopped
und docker compose up -d
lief der Server wieder.
Der Node-RED Server zeigte aber weiterhin keine Verbindung an. Also schnell die Logs im RabbitMQ Server aufgemacht. Und diese da, die Zugangsdaten passten nicht.
rabbitmq | 2022-04-07 14:12:20.054369+00:00 [info] <0.963.0> accepting AMQP connection <0.963.0> (192.168.1.168:45000 -> 192.168.1.175:5672)
rabbitmq | 2022-04-07 14:12:20.058424+00:00 [erro] <0.957.0> Error on AMQP connection <0.957.0> (192.168.1.168:44996 -> 192.168.1.175:5672, state: starting):
rabbitmq | 2022-04-07 14:12:20.058424+00:00 [erro] <0.957.0> PLAIN login refused: user 'nodered' - invalid credentials
rabbitmq | 2022-04-07 14:12:20.060832+00:00 [erro] <0.960.0> Error on AMQP connection <0.960.0> (192.168.1.168:44998 -> 192.168.1.175:5672, state: starting):
rabbitmq | 2022-04-07 14:12:20.060832+00:00 [erro] <0.960.0> PLAIN login refused: user 'nodered' - invalid credentials
Aber wie kann das sein?
Also in die Management Oberfläche von RabbitMQ eingeloggt. Und was sahen meine Augen da? Der Benutzer und der VHost den ich in RabbitMQ angelegt hatte, waren wieder weg.
Also schnell alles wieder in der Admin-Oberfläche angelegt. Schon konnte mein Node-RED wieder auf RabbitMQ zugreifen.
Diesmal war ich aber schlauer und habe den RabbitMQ sicherheitshalber einmal durchgestartet. Und was muss ich sehen? Die Daten waren wieder weg.
Meine docker-compose.yaml sah folgendermaßen aus:
version: "3.2"
services:
rabbitmq:
image: rabbitmq:3-management-alpine
env_file: rabbitmq.env
restart: unless-stopped
ports:
- 5672:5672
- 15672:15672
volumes:
- ./volumes/data:/var/lib/rabbitmq
Das ganze hatte ich streng nach Anleitung gemacht. Warum waren immer alle Daten weg? Das Volume wurde auch korrekt geladen.
Der Sache auf die Schliche gekommen
Doch dann wurde es mir klar. Der RabbitMQ Server erzeugt den Pfad zu seiner Datenbank immer mit dem Hostname. Das ist bei Docker, wenn man nichts angibt, immer die Container-ID.
Immer, wenn der Container neu erstellt wird, erzeugt es quasi eine neue Datenbank. Damit sind die Daten meines RabbitMQ Servers zwar noch physikalisch vorhanden, werden aber nicht mehr geladen. Und man generiert somit auch Datenschrott.
Die Lösung war für mich relativ einfach. Ich habe einfach einen festen Hostname gesetzt.
version: "3.2"
services:
rabbitmq:
# Fester Name
hostname: rabbitmq
# ...
So, passt es nun. Wenn der Container nun neu erstellt wird, bleiben die Daten aber weiterhin erhalten.
Falls jemand eine bessere Idee hat, oder es eine gute Konfigurationseinstellung gibt, lasst es mich wissen.