マシンを切り替えた後にrabbitmqを再起動するにはどうすればよいですか?


15

EC2でrabbitmqをブローカーとしてdjango / celeryを実行しています。使用していたマシンが故障したため、別のインスタンスを起動しました。しかし、新しいマシンに切り替えて以来、私はセロリを動作させることができませんでした。

編集:問題を誤診している場合に備えて、以下に多くのログを含めました。しかし、私は問題が「データベースの起動」フェーズで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

私はこの種の失敗に関するドキュメントを見つけることができませんでした。助言がありますか?

回答:


15

rabbitmq-discussリストから非常に良い助けを得ました。

RabbitMQが使用するデータベースはマシンのホスト名にバインドされているため、データベースdirを別のマシンにコピーした場合、機能しません。この場合、以前と同じホスト名でマシンを設定し、未処理のメッセージを新しいマシンに転送する必要があります。ウサギに重要なものがない場合は、/ var / lib / rabbitmq内のRabbitMQファイルを削除するだけですべてをクリアできます。

/ var / lib / rabbitmq / mnesia / rabbit /のすべてを削除しましたが、問題なく起動しました。やった!


8

この問題は、RabbitMQのキューとメタデータ設定を保存するMnesiaがマシンのホスト名を使用してデータベースを作成するという事実に関連しています。

このようなホスト名ベースのデータベースディレクトリは次の場所にあります。

<rabbitmq_installdir>/var/lib/rabbitmq/mnesia/rabbit@<yourhostname>
<rabbitmq_installdir>/var/lib/rabbitmq/mnesia/rabbit@<yourhostname>-plugins-expanded

したがって、上記の2つのディレクトリを削除してrabbitmqを再起動するオプションは機能します。rabbitmqサーバーをホストから別のホストに移行した場合、以前のホスト名mnesiaデータベースを保持します。私のテストによれば、ディレクトリの名前を正しいホスト名に変更するだけでは機能しません

したがって、キュー構造、ユーザーアカウント、およびRabbitMQサーバー用に定義されたその他のメタデータを保持する必要がある場合、そのようなメタデータのコピーを保持する必要があります。

メタデータ構成を抽出またはインポートするには2つの方法があります

  • 管理プラグイン:rabbitmqの管理プラグインをアクティブにし、url server:15672に移動します。メインページの下部には、定義をエクスポートするオプションとインポートするオプションの2つのオプションがあります

  • コマンドライン:rabbitmqadmin export rabbit.config(またはexportの代わりにimport)

したがって、最終的な提案:

  • キュー構造/ユーザー/などの現在のエクスポートを保持する
  • サーバーを移行するとき、またはリカバリを実行するとき、前のディレクトリ構造を削除するアクションを実行し(キューに入れられたデータが無関係である場合)、元の構成/メタデータを再インポートします。
  • 永続的なキューデータが関連する場合、最適なオプションは、回復したホストのホスト名を元のホスト名に変更し、メッセージの処理/デキューを許可することです。その後、必要に応じてホスト名を再度調整できます。

1

こんにちは、AWS EC2 SmallからLarge Instanceに移行したとき、RabbitMqを実行し続け、新しいインスタンスで古いmnesia DBファイルを操作する必要があるときに、多くの重要な遅延タスクとキュー情報が含まれていたため、同様の状況がありました。以下は、これを管理するために使用した回避策です。おそらく、mnesiaフォルダーを削除せず、データを保持できないようにする私の回避策は、誰かを助けることができるでしょう。

主な問題は、新しいマシンに新しいホスト名が付けられていることです-そして、ディレクトリの名前はその名前になっています(前述のようにディレクトリの名前を変更するだけで、役に立たないため)。「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は古いファイルで動作するはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.