SystemdDoctor
rabbitmq-server.service очереди

RabbitMQ в systemd: почему брокер не поднимается

RabbitMQ построен на Erlang, и его отказы часто выглядят непривычно: длинные сообщения о состоянии узла вместо обычной ошибки. Самые частые причины — несовпадение имени узла с именем машины и права на файл cookie, по которому узлы опознают друг друга.

О службе

Имя узла RabbitMQ включает имя машины. Если имя хоста меняется (например при переносе виртуальной машины), брокер не находит свои данные: они лежат в каталоге, названном по прежнему имени узла. Служба при этом стартует «с чистого листа» или не стартует вовсе.

Второй частый случай — файл cookie для взаимодействия узлов. Он должен принадлежать пользователю rabbitmq и иметь права 0600. При ручном запуске команд под root файл иногда пересоздаётся с неверным владельцем, после чего служба перестаёт запускаться.

Третья особенность — время запуска. Брокер с большими очередями поднимается долго, а unit-файл дистрибутива может иметь умеренный таймаут. Обрыв запуска по таймауту приводит к необходимости восстановления, что делает следующий запуск ещё длиннее.

Как устроена

Проверка состоянияrabbitmqctl status и rabbitmq-diagnostics status
Каталог данных/var/lib/rabbitmq/mnesia/ИМЯ-УЗЛА — зависит от имени машины
Файл cookie/var/lib/rabbitmq/.erlang.cookie, права 0600, владелец rabbitmq
Порты5672 для протокола, 15672 для панели, 4369 для обнаружения узлов
Таймаут запускапри больших очередях требует увеличения

Частые ошибки

10 записей базы отмечены за этой службой.

Коды выхода

  • status=1/FAILURE в systemdКод 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.

Сообщения журнала

Состояния результата

  • Failed with result 'timeout'Состояние timeout: служба не уложилась в отведённое время при запуске, остановке или перезагрузке настроек.

Ресурсы и ограничения

Ошибки служб

Коды выхода этой службы

Числа в status=N ниже 200 назначает сама программа, 200 и выше — systemd, когда не смог подготовить запуск.

statusЧто означает у этой службыКуда смотреть
1/FAILURE узел не смог запуститься: имя узла, права на cookie или повреждённые данные. разбор
таймаут при запуске долгое восстановление очередей. разбор

Диагностика

Состояние узла: версия, порты, память, очереди.

sudo rabbitmq-diagnostics status

Код завершения и последние строки журнала.

systemctl status rabbitmq-server --no-pager -l

Права на cookie и имя каталога данных: оно должно совпадать с именем узла.

sudo ls -l /var/lib/rabbitmq/.erlang.cookie && sudo ls -ld /var/lib/rabbitmq/mnesia/*

Имя машины и имя узла рядом: расхождение объясняет «потерянные» данные.

hostname -f && sudo rabbitmqctl eval "node()." 2>/dev/null

Параметры unit, которые тут важны

  • TimeoutStartSec=брокеру с большими очередями нужен запас
  • LimitNOFILE=каждое соединение и очередь расходуют дескрипторы
  • User=работа от rabbitmq; данные и cookie должны принадлежать ему
  • Restart=on-failure с паузой: брокер не стоит перезапускать в цикле

Источники