RabbitMQ: узел не находит свои данные после смены имени машины
Имя узла RabbitMQ складывается из имени приложения и имени машины. Каталог данных называется по имени узла, поэтому смена имени хоста приводит к тому, что брокер стартует «с чистого листа» или не стартует вовсе.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Имя машины изменилось
После переноса виртуальной машины или правки имени хоста прежний каталог данных перестаёт соответствовать новому имени узла.
-
Короткое и полное имя машины не совпадают
RabbitMQ по умолчанию использует короткое имя. Если в системе настроено полное имя, узел может искать другой каталог.
-
Права на файл cookie сбиты
Файл, по которому узлы опознают друг друга, должен принадлежать пользователю службы с правами 0600. Запуск команд под root пересоздаёт его неверно.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Имена каталогов данных — по ним видно прежние имена узлов.
sudo ls -1 /var/lib/rabbitmq/mnesia/Имя машины и состояние узла.
hostname -s && sudo rabbitmq-diagnostics status 2>&1 | head -12Сообщения брокера при запуске.
journalctl -u rabbitmq-server -n 40 --no-pagerРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- После переноса виртуальной машины или правки имени хоста прежний каталог данных перестаёт соответствовать новому имени узла.
- Как проверить
-
Сравните имя машины и имена каталогов данных.
hostname -s sudo ls -1 /var/lib/rabbitmq/mnesia/
- Как исправить
-
Либо верните прежнее имя машины, либо задайте имя узла явно через переменную окружения в переопределении unit-файла — тогда оно не будет зависеть от имени хоста.
sudo systemctl edit rabbitmq-server # [Service]\nEnvironment=RABBITMQ_NODENAME=rabbit@stable-name
- Почему происходит
- RabbitMQ по умолчанию использует короткое имя. Если в системе настроено полное имя, узел может искать другой каталог.
- Как проверить
-
Посмотрите оба имени.
hostname -s; hostname -f sudo rabbitmqctl eval "node()." 2>/dev/null
- Как исправить
- Приведите настройку в соответствие: либо короткое имя везде, либо полное с параметром использования полных имён.
- Почему происходит
- Файл, по которому узлы опознают друг друга, должен принадлежать пользователю службы с правами 0600. Запуск команд под root пересоздаёт его неверно.
- Как проверить
-
Посмотрите права на файл.
sudo ls -l /var/lib/rabbitmq/.erlang.cookie
- Как исправить
-
Верните владельца и права 0600: файл cookie читают только процессы брокера, и посторонний доступ к нему недопустим.
sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie && sudo chmod 600 /var/lib/rabbitmq/.erlang.cookie
Пример вывода
Каталог данных от прежнего имени машины. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ sudo ls -1 /var/lib/rabbitmq/mnesia/
rabbit@old-hostname
rabbit@old-hostname-plugins-expand
$ hostname -s
new-hostname
rabbitmq[4900]: Starting RabbitMQ on node rabbit@new-hostname
rabbitmq[4900]: Database directory at /var/lib/rabbitmq/mnesia/rabbit@new-hostname is empty. Initialising from scratch...
Связанные ошибки
- status=1/FAILURE в systemd Код 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- MongoDB: Unable to lock file mongod.lock mongod не запускается: остался файл блокировки после аварийного завершения или каталог принадлежит не тому пользователю.
- MySQL: InnoDB не запускается после аварийного завершения Ошибки InnoDB при старте: повреждение страниц, несовпадение журнала, режим принудительного восстановления.
- Prometheus: каталог данных занят другим экземпляром Служба не запускается: блокировка каталога данных после аварийного завершения или второй экземпляр.
- RabbitMQ: тревога по свободному месту блокирует отправителей Брокер перестаёт принимать сообщения: сработала тревога по диску или памяти. Как снять и что настроить.
- Redis: MISCONF Errors writing to the RDB snapshot Redis отказывается принимать запись: не удалось сохранить снимок на диск. Место, права, настройка overcommit.
- Данные теряются при перезапуске службы Служба не успевает сохранить состояние при остановке: короткий таймаут, неверный сигнал, отсутствие обработки завершения.
Где встречается чаще всего
Источники
- Документация RabbitMQ: имена узлов
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено сменой имени машины на тестовом узле.