기계를 전환 한 후 rabbitmq를 어떻게 다시 시작합니까?


16

rabbitmq를 브로커로 사용하여 EC2에서 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

이런 종류의 실패에 대한 문서를 찾지 못했습니다. 어떤 제안?

답변:


16

rabbitmq-discuss 목록에서 매우 좋은 도움을 받았습니다.

RabbitMQ가 사용하는 데이터베이스는 머신의 호스트 이름에 바인딩되어 있으므로 데이터베이스 디렉토리를 다른 머신에 복사하면 작동하지 않습니다. 이 경우 이전과 동일한 호스트 이름으로 머신을 설정하고 미해결 메시지를 새 머신으로 전송해야합니다. 토끼에 중요한 것이 없다면 / 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

따라서 위의 두 디렉토리를 삭제하고 rabbitmq를 다시 시작하는 옵션이 작동합니다. rabbitmq 서버가 호스트에서 다른 호스트로 마이그레이션 된 경우 이전 호스트 이름 mnesia 데이터베이스가 제공됩니다. 내 테스트에 따르면 디렉토리를 올바른 호스트 이름으로 바꾸는 것만으로는 작동 하지 않습니다 .

따라서 RabbitMQ 서버에 대해 정의 된 대기열 구조 , 사용자 계정 및 기타 메타 데이터를 유지해야하는 경우 해당 메타 데이터의 사본을 유지해야합니다.

메타 데이터 구성을 추출하거나 가져 오는 방법에는 두 가지가 있습니다.

  • 관리 플러그인 : rabbitmq의 관리 플러그인을 활성화하고 url 서버로 이동하십시오 : 15672. 메인 페이지는 하단에 두 가지 옵션이 있습니다. 하나는 내보내고 다른 하나는 가져 오기를 정의합니다.

  • 명령 행 : rabbitmqadmin export rabbit.config (또는 export 대신 import)

결론은 다음과 같습니다.

  • 큐 구조 / 사용자 / 등의 현재 내보내기 유지
  • 서버를 마이그레이션하거나 복구를 수행 할 때 이전 디렉토리 구조 (대기중인 데이터가 관련이없는 경우)를 삭제하고 원래 구성 / 메타 데이터를 다시 가져 오려면 조치를 취하십시오.
  • 큐에 대기중인 데이터가 지속되는 경우 가장 좋은 방법은 복구 된 호스트의 호스트 이름을 원래 호스트 이름으로 바꾸고 메시지가 처리 / 대기되도록하는 것입니다. 필요한 경우 호스트 이름을 다시 조정할 수 있습니다.

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가 이전 파일과 함께 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.