我在 EC2 上运行 django/celery,使用 rabbitmq 作为代理。我使用的机器出现故障,因此我启动了另一个实例。但自从切换到新机器后,我就无法让 celery 正常工作。
编辑:我在下面附上了很多日志,以防我误诊问题。但我有 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
关于如何进一步诊断/解决这个问题有什么想法吗?
以下是我尝试运行 celery 时发生的情况:
$ 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
我找不到任何有关此类故障的文档。有什么建议吗?
答案1
我从 rabbitmq-discuss 列表获得了一些非常好的帮助:
RabbitMQ 使用的数据库与计算机的主机名绑定,因此如果您将数据库目录复制到另一台计算机,它将无法工作。如果是这种情况,您必须设置一台与之前主机名相同的计算机,并将所有未完成的消息传输到新计算机。如果 rabbit 中没有重要内容,您可以通过删除 /var/lib/rabbitmq 中的 RabbitMQ 文件来清除所有内容。
我删除了 /var/lib/rabbitmq/mnesia/rabbit/ 中的所有内容,它启动起来没有问题。好极了!
答案2
该问题与 Mnesia 有关,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 server:15672。主页底部有两个选项,一个是导出,一个是导入定义
命令行:rabbitmqadmin export rabbit.config (或者 import 而不是 export )
因此,底线建议:
- 保持队列结构/用户/等的当前导出
- 当迁移服务器或进行恢复时,采取措施删除以前的目录结构(如果排队数据不相关)并重新导入原始配置/元数据。
- 如果任何持久排队数据相关,最好的选择是将恢复主机的主机名重命名为原始主机名并允许消息处理/出队,然后您可以根据需要再次调整主机名。
答案3
嗨,当我从 AWS EC2 小型实例迁移到大型实例时,我遇到了类似的情况,需要保持 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 应该可以使用旧文件。