пятница, 12 апреля 2013 г.

Что в имени тебе моём? "Erlang machine stopped instantly ... (Code 7023)" при запуске RabbitMQ

English version is at the end of post.

Итак, вы решили использовать брокер сообщений. Почитали отзывы, поговорили с гуру, и выбор пал на RabbitMQ. Определились с компьютером, на котором будет работать брокер, и устанавливаете на него RabbitMQ Server. Сначала ставите Erlang (установщик сервера сам предложит перейти на сайт Erlang-а, если последний ещё не установлен), а затем и сам сервер.

Ничто не предвещало беды, но... брокер не работает! Смотрим на установленные сервисы и видим, что RabbitMQ Server есть, но не запущен. Запускаем и... наблюдаем, как на наших глазах от тут же останавливается. Идём в журнал событий и видим уведомление от Service Control Manager, с кодом 7023 и параметрами "RabbitMQ" и "%%1067". <sarcasm>Ну, теперь то всё ясно!</sarcasm> Посмотрев внимательно на события замечаем, что есть ещё одно, от компонента ErlSrv, с параметрами "RabbitMQ" и причиной: "Erlang machine stopped instantly (distribution name conflict?). The service is not restarted as OnFail is set to ignore." Всё это, конечно, замечательно, но решению проблемы не особо помогает.

Поиск в интернете по этой ошибке ничего не дал. Проблема появлялась у разных людей на протяжении последней пары лет, при этом какого-то решения не указано. Переустановка RabbitMQ Server-а и Erlang-а ничего не даёт. Более того, можно заметить, что на одних компьютерах сервер работает, а на других нет - при этом на всех машинах установлены одинаковые версии Erlang-а и сервера.

Одна из возможных причин проблемы, как это ни странно - имя пользователя, включающее "локализованные символы" - например, имя пользователя из русских букв (в частности, пользователь "Администратор"). Другой возможной причиной является имя машины с "локализованными символами". Как это можно увидеть:

  1. переходим в командную строку - например, запускаем cmd (Win+R, cmd)
  2. переходим в каталог, откуда запускается сервис Erlang-а (см. свойства сервиса ErlSrv)
  3. выполняем команду "erlsrv list rabbitmq"
Вы должны увидеть строку запуска сервиса RabbitMQ, и в этой строке будут нечитаемые символы - там, где должно быть имя пользователя.

Решение с использованием переменной окружения RABBITMQ_BASE выглядит так:
  1. прописываем в RABBITMQ_BASE путь к каталогу, не содержащий "локализованных символов" (например, каталог, куда установлен сам сервер)
  2. деинсталлируем RabbitMQ сервер
  3. инсталлируем RabbitMQ сервер заново
ВАЖНО: если повторная установка RabbitMQ сервера запускается из браузера или другого окна, которое было УЖЕ открыто ДО прописывания значения переменной - будет тот же результат, что и раньше (новая переменная окружения не появляется "автоматически" в уже запущенных программах). Откройте новый проводник (или перезапустите файл-менеджер, из которого запускался установщик). Если установка производится из браузера, выберите для загруженного установочного файла "Показать в папке", или откройте новое окно браузера, и уже оттуда запускайте установщик сервера заново. Программа, откуда запускается установщик, подхватит новую переменную окружения, после чего переменная будет обнаружена и применена установщиком RabbitMQ сервера.

После данных операций, если в момент установки переменная была задана, можно заметить, что в строке запуска в "erlsrv list rabbitmq" теперь присутствует путь, указанный в RABBITMQ_BASE. Благодаря этому, в этот раз RabbitMQ Server теперь запущен и работает.

В случае, если проблема в имени машины - переименуйте её, если есть такая возможность.

For English-speaking guys
When I faced that problem, I haven't found the solution over the forums and different mail threads, so once found the cause, I decided to publish it - may be it might help someone.

Problem: RabbitMQ Server service is not running
Indication: in the Event Manager you see the error with source "Service Control Manager" and Code 7023, with EventData: param1: RabbitMQ, param2: %%1067. Also, there is another event on ErlSrv service, almost right before that one, with EventData: RabbitMQ and "Erlang machine stopped instantly (distribution name conflict?). The service is not restarted as OnFail is set to ignore".
Cause: in my case the issue was caused by international symbols in the name of Windows account or the name of the host where the service is running.
Analysis:
  • go to Services, select ErlSrv service and write down the path to the .exe file
  • run "cmd.exe" and go to that path
  • run "erlsrv list rabbitmq": if you see international characters in the command line, which starts the RabbitMQ service - congratulations, likely your issue is the same as mine.
Solution:
  • set environment variable RABBITMQ_BASE to the path without international characters (for example, installation path of RabbitMQ server)
  • uninstall RabbitMQ Server
  • install RabbitMQ Server again
NOTE: if the installation of the RabbitMQ Server is made from the browser / Explorer / file manager, which was ALREADY running BEFORE the environment variable was set - you will get the same result (stopped server). To solve the issue, start the new Explorer or file manager. If you run installer from browser - select there "Show in folder" for downloaded installer program, or open the new browser window, and only then start the installation. In this case the environment variable will be "noticed" by the program that starts the installer, and variable will be applied by the installer itself.

Now, check the "erlsrv list rabbitmq" as mentioned in the Analysis above - you shouldn't have internaltional characters now, and you should have RabbitMQ Server service running in your system.

If you have international symbols in the host name, I could only suggest to rename the host.

Have fun!

9 комментариев:

  1. Спасибо за совет, сработало! Правда, у меня переменная называлась RABBITMQ_BASE. Кролик версии 3.0.4

    ОтветитьУдалить
    Ответы
    1. Спасибо за комментарий. Название переменной поправил - именно RABBITMQ_BASE и имелась ввиду (как минимум, она так называется в последних версиях, с 3.0.4 по 3.1.1 включительно).

      Удалить
  2. Огромное спасибо за статью, очень выручила!

    ОтветитьУдалить
  3. Так же эту проблему можно решить переместив "..AppData\Roaming..", так что бы путь к ней не имел локализованных символов

    ОтветитьУдалить
    Ответы
    1. Мне кажется, этого будет недостаточно. После установки сервера, путь для его запуска уже содержит путь к ..AppData\Roaming.., так что этот путь тоже надо где-то поменять.
      С переменной RABBITMQ_BASE вроде проще. К тому же, она как раз и служит для того, чтобы указать путь напрямую, без "танцев" с перемещением.

      Удалить
  4. Спасибо огромное!
    Заработало

    ОтветитьУдалить
  5. Позвольте снести свою лепту.
    У меня были все перечисленные симптомы, но никаких локализованных символов не использовалось. Команда "erlsrv list rabbitmq" возвращала целиком адекватный текст, без нечитаемых символов.
    После долгих поисков и переустановок решил проблему путем очистки папок db и log, расположенных в RABBITMQ_BASE.

    ОтветитьУдалить
  6. Спасибо огромное. Сработало После длительных хождений по просторам интернета. Никакие советы не помогали: чистка реестра, удаление в %APPDATA% папки Roaming\RabbitMQ.

    ОтветитьУдалить