Как мне перезапустить rabbitmq после переключения машин?

16

Я использую django / celery на EC2 с rabbitmq в качестве брокера. Машина, которую я использовал, вышла из строя, поэтому я запустил другой экземпляр. Но после перехода на новую машину я не смог заставить сельдерей работать.

РЕДАКТИРОВАТЬ: я включил много журналов ниже, на случай, если я неправильно диагностирую проблему. Но я на 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

Я не смог найти никакой документации для такого рода ошибок. Какие-либо предложения?

Abe
источник

Ответы:

16

Я получил очень хорошую помощь из списка rabbitmq-обсуждения:

База данных, которую использует RabbitMQ, привязана к имени хоста компьютера, поэтому, если вы скопировали каталог базы данных на другой компьютер, он не будет работать. В этом случае вам необходимо настроить компьютер с тем же именем хоста, что и раньше, и перенести все ожидающие сообщения на новый компьютер. Если в кролике нет ничего важного, вы можете просто очистить все, удалив файлы RabbitMQ в / var / lib / rabbitmq.

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

Abe
источник
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 export rabbit.config (или импорт вместо экспорта)

Итак, суть предложения:

  • сохранить текущий экспорт вашей структуры очереди / пользователи / и т. д.
  • при миграции серверов или восстановлении выполните действие по удалению прежней структуры каталогов (если данные в очереди не имеют значения) и повторно импортируйте исходную конфигурацию / метаданные.
  • Если какие-либо постоянные данные в очереди актуальны, лучше всего переименовать имя хоста вашего восстановленного хоста в исходное и разрешить сообщениям обрабатывать / удалять из очереди, тогда вы можете при необходимости снова настроить имя хоста.
gextra
источник
1

Привет, у меня была похожая ситуация, когда я перешел с AWS EC2 Small на Large Instance, и мне нужно было поддерживать RabbitMq в рабочем состоянии и работать со старыми файлами mnesia DB в новом экземпляре, поскольку они содержали много важных отложенных задач и информацию об очереди. Ниже представлен обходной путь, который я использовал для управления этим. Возможно, мой обходной путь, который позволяет не удалять папку 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 должен работать со старыми файлами.

Дмитрий Волошин
источник