我在EC2上运行django / celery,以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
我一直无法find这种失败的任何文件。 有什么build议么?
我从rabbitmq-discuss列表中得到了一些非常好的帮助:
RabbitMQ使用的数据库绑定到机器的主机名,所以如果你将数据库目录拷贝到另一台机器上,它将不起作用。 如果是这种情况,则必须使用与以前相同的主机名来设置机器,并将所有未完成的消息传送到新机器。 如果没有什么重要的兔子,你可以通过删除/ var / lib / rabbitmq中的RabbitMQ文件来清除所有的东西。
我删除了/ var / lib / rabbitmq / mnesia / rabbit /中的所有内容,并且没有任何问题。 万岁!
这个问题与存储RabbitMQ的队列和元数据configuration的Mnesia使用机器的主机名创build数据库有关。
这种基于主机名的数据库目录将位于:
<rabbitmq_installdir>/var/lib/rabbitmq/mnesia/rabbit@<yourhostname> <rabbitmq_installdir>/var/lib/rabbitmq/mnesia/rabbit@<yourhostname>-plugins-expanded
因此,删除上述2个目录并重新启动rabbitmq的选项将起作用。 如果您将rabbitmq服务器从主机迁移到另一个主机,则您将携带以前的主机名mnesia数据库。 根据我的testing,把目录重命名为正确的主机名是行不通的。
因此, 如果您需要保留为您的RabbitMQ服务器定义的队列结构 ,用户帐户和任何其他元数据,则需要保留这些元数据的副本。
有两种方法可以提取或导入元数据configuration
pipe理插件:激活rabbitmq的pipe理插件并转到url服务器:15672。 主页面有两个选项,一个导出,一个导入定义
命令行:rabbitmqadmin导出rabbit.config(或导入而不是导出)
所以,底线build议:
您好我有一个类似的情况,当我从AWS EC2小型迁移到大型实例,需要保持RabbitMq运行和旧的mnesia DB文件在新实例上的工作,因为他们包含了很多重要的延迟任务和队列信息。 以下是我用来pipe理这个的解决方法。 也许我的解决方法,使一个不删除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应该可以和旧的文件一起工作。