Я использую django / celery на EC2 с rabbitmq в качестве брокера. Машина, которую я использовал, вышла из строя, поэтому я запустил еще один экземпляр. Но после перехода на новую машину я не смог заставить сельдерей работать.
РЕДАКТИРОВАТЬ: Я включил много журналов ниже, на всякий случай, если я неправильно диагностирую проблему. Но я на 85% уверен, что проблема в том, что rabbitmq-server не запускается на этапе "запуска базы данных".
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
Мне не удалось найти никакой документации для такого рода сбоев. Какие-либо предложения?
Я получил очень хорошую помощь из списка rabbitmq-Disc:
База данных, которую использует RabbitMQ, привязана к имени хоста машины, поэтому, если вы скопировали каталог базы данных на другой компьютер, это не сработает. В этом случае вам необходимо настроить машину с тем же именем хоста, что и раньше, и передать все незавершенные сообщения на новую машину. Если в rabbit нет ничего важного, вы можете просто очистить все, удалив файлы RabbitMQ в / var / lib / rabbitmq.
Я удалил все в / var / lib / rabbitmq / mnesia / rabbit /, и он без проблем запустился. Ура!
Проблема связана с тем, что 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 (или import вместо экспорта)
Итак, итоговые предложения:
Привет, у меня была аналогичная ситуация, когда я перешел с малого экземпляра AWS EC2 на большой, и мне нужно было, чтобы RabbitMq работал и работал со старыми файлами БД mnesia на новом экземпляре, поскольку они содержали много важных отложенных задач и информацию об очередях. Ниже я использовал обходной путь, чтобы справиться с этим. Возможно, мой обходной путь, который позволяет не удалять папку mnesia и сохранять данные, может кому-то помочь.
Основная проблема заключается в том, что у вашего нового компьютера новое имя хоста - и каталог назван в его честь (просто переименование каталога, как упоминалось ранее, не помогает), поэтому нам нужно переименовать имя хоста вашего компьютера и заставить RabbitMq работать со старыми файлами. Пусть "ip-0-0-0-0" будет старым именем машины (так что должна быть папка mnesia / вер / библиотека / rabbitmq / мнезиа / 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 должен работать со старыми файлами.