Як перезапустити rabbitmq після комутації машин?


16

Я запускаю джанго / селеру на EC2, з кроликом в якості брокера. Не вдалося використати машину, яку я використовував, тому я запустив інший екземпляр. Але після переходу на нову машину я не зміг змусити селеру працювати.

EDIT: Я долучив багато журналів нижче, на всякий випадок, якщо я неправильно визначив проблему. Але я на 85% впевнений, що проблема полягає в тому, що rabbitmq-сервер не вдається запуститися у фазі "стартової бази даних".

node          : rabbit@ip-10-212-66-181
app descriptor: /usr/lib/rabbitmq/lib/rabbitmq_server-1.7.2/sbin/../ebin/rabbit.app
home dir      : /var/lib/rabbitmq
cookie hash   : 5+uQ077En5bpvle3HJCQMg==
log           : /var/log/rabbitmq/rabbit.log
sasl log      : /var/log/rabbitmq/rabbit-sasl.log
database dir  : /var/lib/rabbitmq/mnesia/rabbit

starting internal event notification system                           ...done
starting logging server                                               ...done
starting database                                                     ...Erlang has closed

Будь-які ідеї щодо подальшої діагностики / вирішення цієї проблеми?

Ось що відбувається, коли я намагаюся запустити селеру:

$ python manage.py celeryd -l info
/opt/bitnami/python/lib/python2.6/site-packages/django_celery-2.4.2-py2.6.egg/djcelery/loaders.py:86: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments!
  warnings.warn("Using settings.DEBUG leads to a memory leak, never "
[2011-12-05 19:40:13,545: WARNING/MainProcess]  

 -------------- celery@ip-10-212-66-181 v2.4.3
---- **** -----
--- * ***  * -- [Configuration]
-- * - **** ---   . broker:      amqp://guest@localhost:5672//
- ** ----------   . loader:      djcelery.loaders.DjangoLoader
- ** ----------   . logfile:     [stderr]@INFO
- ** ----------   . concurrency: 1
- ** ----------   . events:      OFF
- *** --- * ---   . beat:        OFF
-- ******* ----
--- ***** ----- [Queues]
 --------------   . celery:      exchange:celery (direct) binding:celery


[Tasks]
  . tbAnalytics.models.processAnalysis
  . tbCollections.models.processCollection

[2011-12-05 19:40:13,558: INFO/PoolWorker-1] child process calling self.run()
[2011-12-05 19:40:13,562: WARNING/MainProcess] celery@ip-10-212-66-181 has started.
[2011-12-05 19:40:13,564: ERROR/MainProcess] Consumer: Connection Error: [Errno 111] Connection refused. Trying again in 2 seconds...
[2011-12-05 19:40:15,574: ERROR/MainProcess] Consumer: Connection Error: [Errno 111] Connection refused. Trying again in 4 seconds...

Відстежуючи це, схоже, що проблема у сервері rabbitmq, зокрема в базі даних:

$ sudo rabbitmqctl status
Status of node 'rabbit@ip-10-212-66-181' ...
Error: unable to connect to node 'rabbit@ip-10-212-66-181': nodedown
diagnostics:
- nodes and their ports on ip-10-212-66-181: [{rabbitmqctl14448,38289}]
- current node: 'rabbitmqctl14448@ip-10-212-66-181'
- current node home dir: /var/lib/rabbitmq
- current node cookie hash: 5+uQ077En5bpvle3HJCQMg==

Але я не зміг зрозуміти, як перезапустити сервер:

bitnami@ip-10-212-66-181:/var/log/rabbitmq$ sudo rabbitmq-server start_app

+---+   +---+
|   |   |   |
|   |   |   |
|   |   |   |
|   +---+   +-------+
|                   |
| RabbitMQ  +---+   |
|           |   |   |
|   v1.7.2  +---+   |
|                   |
+-------------------+
AMQP 8-0
Copyright (C) 2007-2010 LShift Ltd., Cohesive Financial Technologies LLC., and Rabbit Technologies Ltd.
Licensed under the MPL.  See http://www.rabbitmq.com/

node          : rabbit@ip-10-212-66-181
app descriptor: /usr/lib/rabbitmq/lib/rabbitmq_server-1.7.2/sbin/../ebin/rabbit.app
home dir      : /var/lib/rabbitmq
cookie hash   : 5+uQ077En5bpvle3HJCQMg==
log           : /var/log/rabbitmq/rabbit.log
sasl log      : /var/log/rabbitmq/rabbit-sasl.log
database dir  : /var/lib/rabbitmq/mnesia/rabbit

starting internal event notification system                           ...done
starting logging server                                               ...done
starting database                                                     ...Erlang has closed
{"init terminating in do_boot",{{nocatch,{error,{cannot_start_application,rabbit,{bad_return,{{rabbit,start,[normal,[]]},{'EXIT',{{case_clause,{error,{timeout_waiting_for_tables,[rabbit_user,rabbit_user_permission,rabbit_vhost,rabbit_config,rabbit_listener,rabbit_durable_route,rabbit_route,rabbit_reverse_route,rabbit_durable_exchange,rabbit_exchange,rabbit_durable_queue,rabbit_queue]}}},[{rabbit,'-run_boot_step/1-lc$^1/1-1-',1},{rabbit,run_boot_step,1},{rabbit,'-start/2-lc$^0/1-0-',1},{rabbit,start,2},{application_master,start_it_old,4}]}}}}}}},[{init,start_it,1},{init,start_em,1}]}}

Crash dump was written to: erl_crash.dump
init terminating in do_boot ()

Крім того, не знайте, чи це актуально, але цей процес працює у фоновому режимі.

$ ps aux | grep rabbit
rabbitmq   714  0.0  0.0   1980   408 ?        S    Dec04   0:00 /usr/lib/erlang/erts-5.7.4/bin/epmd -daemon

Мені не вдалося знайти жодної документації для такого роду відмов. Будь-які пропозиції?

Відповіді:


16

Я отримав дуже гарну допомогу зі списку обговорень rabbitmq:

База даних, яку RabbitMQ використовує, прив’язана до імені хоста машини, тому якщо ви скопіювали dir бази даних на іншу машину, вона не працюватиме. Якщо це так, вам доведеться налаштувати машину з тим самим іменем хоста, що і раніше, і перенести будь-які непогашені повідомлення на нову машину. Якщо в кролиці нічого важливого, ви можете просто очистити все, видаливши файли RabbitMQ в / var / lib / rabbitmq.

Я видалив усе в / var / lib / rabbitmq / mnesia / rabbit /, і це почалося без проблем. Ура!


8

Проблема пов'язана з тим, що Mnesia, яка зберігає чергу і конфігурацію метаданих RabbitMQ, створює базу даних, використовуючи ім'я хоста машини.

Такі каталоги баз даних на базі імені хоста розташовуватимуться під:

<rabbitmq_installdir>/var/lib/rabbitmq/mnesia/rabbit@<yourhostname>
<rabbitmq_installdir>/var/lib/rabbitmq/mnesia/rabbit@<yourhostname>-plugins-expanded

Отже, можливість видалити вищевказані 2 каталоги та перезапустити rabbitmq буде працювати. Якщо ви перенесли сервер rabbitmq з хоста на інший, ви будете переносити колишню базу даних mnesia імені хоста. За моїми тестами, просто перейменувати каталог на потрібне ім’я хоста не вийде .

Отже, якщо вам потрібно зберегти структуру черги , облікові записи користувачів та будь-які інші метадані, визначені для вашого сервера RabbitMQ, вам потрібно зберегти копію таких метаданих.

Існує два способи вилучення або імпорту конфігурації метаданих

  • Плагін управління: активуйте плагін управління rabbitmq та перейдіть на URL-сервер: 15672. На головній сторінці внизу є два варіанти, один для експорту та один для імпорту визначення

  • Командний рядок: rabbitmqadmin експортувати rabbit.config (або імпортувати замість експорту)

Отже, підсумкові пропозиції:

  • зберегти поточний експорт вашої структури черги / користувачів / тощо
  • під час міграції серверів або під час відновлення виконайте дії, щоб видалити колишню структуру каталогів (якщо дані черги не мають значення) та повторно імпортуйте оригінальну конфігурацію / метадані.
  • Якщо будь-які стійкі дані в черзі є релевантними, найкращим варіантом є перейменування імені хоста відновленого хоста на оригінальне та дозволити повідомленням обробляти / видаляти черги, тоді ви можете знову відрегулювати ім'я хоста за потреби.

1

Привіт: У мене була подібна ситуація, коли я перейшов з AWS EC2 Small до Large Instance і мені потрібно було підтримувати RabbitMq працює та працювати зі старими файлами DB mnesia в новому екземплярі, оскільки вони містили багато важливих затримок завдань та інформації про чергу. Нижче наведено вирішення, яким я керував цим. Можливо, мій спосіб вирішення, який дозволяє не видаляти папку mnesia і зберігати дані, може комусь допомогти.

Основна проблема полягає в тому, що ваша нова машина має нове ім'я хоста - і каталог має ім'я після цього (просто перейменування каталогу, як згадувалося раніше, не допомагає), тому нам потрібно перейменувати ім'я хоста машини і змусити RabbitMq працювати зі старими файлами. Нехай "ip-0-0-0-0" - це стара назва машини (тому має бути папка mnesia / ver / lib / rabbitmq / mnsesia / ip-0-0-0-0 ), а нове ім'я хоста машини - щось на кшталт "ip-1-1-1-1", але нове ім'я не має значення, оскільки ми перезапишемо його. Виконайте такі команди:

sudo -s
echo "127.0.0.1 ip-0-0-0-0" >> /etc/hosts 
echo "ip-0-0-0-0" > /etc/hostname
reboot

Після перезавантаження ваша машина отримає нове ім'я, і ​​RabbitMq повинен працювати зі старими файлами.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.