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 означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
Сообщения журнала
- Permission denied в журнале службыОтказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- Address already in use при запуске службыПорт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Смена имени машины ломает работу службПосле переименования часть служб отказывает: имя запомнено в настройках, сертификатах и кластерах.
Состояния результата
- Failed with result 'timeout'Состояние timeout: служба не уложилась в отведённое время при запуске, остановке или перезагрузке настроек.
Ресурсы и ограничения
- No space left on device в журнале службыНет места на устройстве: разбор по свободным блокам, по inode, по журналу systemd и по удалённым, но открытым файлам.
Ошибки служб
- Celery: обработчик работает, но задачи не берутсяСлужба обработчика активна, очередь растёт: не та очередь, недоступный брокер, префикс имён.
- RabbitMQ: тревога по свободному месту блокирует отправителейБрокер перестаёт принимать сообщения: сработала тревога по диску или памяти. Как снять и что настроить.
- RabbitMQ: узел не находит свои данные после смены имени машиныИмя узла RabbitMQ включает имя хоста. После его смены брокер не видит прежние очереди.
- Узлы очередей не соединяются: не совпадает файл общего секретаУзлы не видят друг друга, а команды управления отказывают: файл общего секрета различается или недоступен.
Коды выхода этой службы
Числа в status=N ниже 200 назначает сама программа, 200 и выше — systemd, когда не смог подготовить запуск.
Диагностика
Состояние узла: версия, порты, память, очереди.
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 с паузой: брокер не стоит перезапускать в цикле
Источники
- Документация RabbitMQ: устранение неполадок запуска
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)