4

我正在使用RabbitMQ作为消息代理的Django应用程序中运行Celery 。但是,RabbitMQ 一直这样崩溃。首先是我从 Django 得到的错误。跟踪大多不重要,因为我知道导致错误的原因,正如您将看到的。

Traceback (most recent call last):

  ...

  File "/usr/local/lib/python2.6/dist-packages/amqplib/client_0_8/transport.py", line 85, in __init__
    raise socket.error, msg

error: [Errno 111] Connection refused

我知道这是由于rabbit_persister.log文件损坏所致。这是因为在我杀死与 RabbitMQ 相关的所有进程后,我运行“sudo rabbitmq-server start”来获得以下崩溃:

...

starting queue recovery                                               ...done
starting persister                                                    ...BOOT ERROR: FAILED
Reason: {{badmatch,{error,{{{badmatch,eof},
                            [{rabbit_persister,internal_load_snapshot,2},
                             {rabbit_persister,init,1},
                             {gen_server,init_it,6},
                             {proc_lib,init_p_do_apply,3}]},
                           {child,undefined,rabbit_persister,
                                  {rabbit_persister,start_link,[]},
                                  transient,100,worker,
                                  [rabbit_persister]}}}},
         [{rabbit_sup,start_child,2},
          {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}]}
Erlang has closed

我当前的修复:每次发生这种情况时,我都会将相应的 rabbit_persister.log 文件重命名为其他文件(rabbit_persister.log.bak),并且能够成功重新启动 RabbitMQ。但是问题一直在发生,我不知道为什么。有任何想法吗?

另外,作为免责声明,我没有使用 Erlang 的经验;我只使用 RabbitMQ,因为它是 Celery 偏爱的代理。

在此先感谢,这个问题真的很烦我,因为我一遍又一遍地做同样的修复。

4

2 回答 2

4

持久化器是 RabbitMQ 的内部消息数据库。该“日志”可能类似于数据库日志,删除它会导致您丢失消息。我猜它被不干净的代理关闭损坏了,但这有点离题了。

有趣的是,您在rabbit_persister模块中遇到了错误。具有该文件的最新版本的 RabbitMQ 是 2.2.0,因此我强烈建议您升级。最好的版本始终是最新的,您可以使用 RabbitMQ APT 存储库获得。特别是,persister 在 2.2.0 之后的版本中看到了大量的修复,所以你的问题很可能已经解决了。

如果您在升级后仍然看到问题,您应该在RabbitMQ 讨论邮件列表中报告它。开发人员(Celery 和 RabbitMQ 的)强调修复那里报告的任何问题。

于 2011-12-04T13:56:44.133 回答
0

A. 因为您运行的是早于 2.7.1 的旧版本 RabbitMQ B. 因为 RabbitMQ 没有足够的 RAM。您需要在服务器上单独运行 RabbitMQ,并为该服务器提供足够的 RAM,以便 RAM 是持久消息日志的最大可能大小的 2.5 倍。

您可以通过添加更多 RAM 并终止盒子上的其他服务来解决此问题,而无需进行任何软件更改。

另一种方法是从源代码构建您自己的 RabbitMQ,并包含使用 Tokyo Cabinet 持久化消息的令牌扩展。确保您使用的是本地硬盘驱动器而不是 NFS 分区,因为 Tokyo Cabinet 存在 NFS 损坏问题。当然,为此使用版本 2.7.1。根据您的消息内容,您还可以从 Tokyo Cabinets 压缩设置中受益,以减少持久消息的读/写活动。

于 2012-01-29T06:27:13.840 回答