切换机器后如何重新启动Rabbitmq?


16

我在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

我没有找到任何有关此类失败的文档。有什么建议么?

Answers:


16

我从rabbitmq-discuss列表中得到了一些很好的帮助:

RabbitMQ使用的数据库绑定到机器的主机名,因此,如果您将数据库目录复制到另一台机器,它将无法正常工作。在这种情况下,您必须使用与以前相同的主机名设置一台计算机,并将所有未完成的消息传输到新计算机。如果Rabbit中没有什么重要的东西,您可以通过删除/ var / lib / rabbitmq中的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 export Rabbit.config(或使用import代替export)

因此,底线建议:

  • 保持当前导出队列结构/用户/等
  • 在迁移服务器或进行恢复时,请采取措施删除以前的目录结构(如果排队的数据不相关),然后重新导入原始配置/元数据。
  • 如果有任何持久队列数据相关,最好的选择是将已恢复主机的主机名重命名为原始主机,并允许消息进行处理/出队,然后可以根据需要再次调整主机名。

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应该可以处理旧文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.