Jak zrestartować rabbitmq po zmianie komputera?

16

Używam django / selera na EC2, z brokerem jako rabbitmq. Komputer, którego używałem, zawiódł, więc uruchomiłem inną instancję. Ale od czasu przejścia na nową maszynę nie byłem w stanie zmusić selera do pracy.

EDYCJA: Poniżej zamieściłem wiele dzienników, na wypadek, gdyby błędnie zdiagnozowałem problem. Ale jestem 85% pewien, że problem polega na tym, że serwer królikmq nie uruchamia się w fazie „początkowej bazy danych”.

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

Wszelkie pomysły na dalszą diagnozę / rozwiązanie tego problemu?

Oto, co się dzieje, gdy próbuję uruchomić seler:

$ 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...

Śledząc to z powrotem, wygląda na to, że problem stanowi serwer królikmq, aw szczególności baza danych:

$ 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==

Ale nie byłem w stanie dowiedzieć się, jak zrestartować serwer:

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 ()

Nie wiem też, czy jest to istotne, ale ten proces działa w tle.

$ 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

Nie udało mi się znaleźć żadnej dokumentacji dotyczącej tego rodzaju awarii. Jakieś sugestie?

Abe
źródło

Odpowiedzi:

16

Otrzymałem bardzo dobrą pomoc z listy omawiających króliki:

Baza danych, z której korzysta RabbitMQ, jest powiązana z nazwą hosta komputera, więc jeśli skopiujesz katalog bazy danych na inny komputer, nie będzie działać. W takim przypadku musisz skonfigurować komputer o tej samej nazwie hosta co poprzednio i przenieść wszelkie zaległe wiadomości na nowy komputer. Jeśli w króliku nie ma nic ważnego, możesz wszystko wyczyścić, usuwając pliki RabbitMQ z katalogu / var / lib / rabbitmq.

Usunąłem wszystko z katalogu / var / lib / rabbitmq / mnesia / rabbit / i wszystko zaczęło się bez problemów. Brawo!

Abe
źródło
8

Problem związany jest z faktem, że Mnesia, która przechowuje konfigurację kolejki i metadanych RabbitMQ, tworzy bazę danych przy użyciu nazwy hosta komputera.

Takie katalogi baz danych oparte na nazwie hosta będą znajdować się w:

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

Tak więc opcja usunięcia powyższych 2 katalogów i zrestartowania rabbitmq będzie działać. Jeśli migrowałeś serwer rabbitmq z hosta na inny, przeniesiesz poprzednią bazę danych nazw hostów mnesia. Według moich testów po prostu zmiana nazwy katalogu na prawidłową nazwę hosta nie będzie działać.

Jeśli więc chcesz zachować strukturę kolejki , konta użytkowników i wszelkie inne metadane zdefiniowane dla serwera RabbitMQ, musisz zachować kopię takich metadanych.

Istnieją dwa sposoby wyodrębnienia lub zaimportowania konfiguracji metadanych

  • Wtyczka zarządzająca: aktywuj wtyczkę zarządzającą rabbitmq i przejdź do serwera url: 15672. Strona główna ma w dolnych dwóch opcjach, jedną do wyeksportowania, a drugą do zaimportowania definicji

  • Wiersz polecenia: rabbitmqadmin export rabbit.config (lub import zamiast eksportu)

Sugestie:

  • zachowaj bieżący eksport struktury kolejki / użytkowników / itd
  • podczas migracji serwerów lub odzyskiwania, podejmij działanie, aby usunąć poprzednią strukturę katalogów (jeśli kolejkowane dane nie mają znaczenia) i ponownie zaimportuj oryginalną konfigurację / metadane.
  • Jeśli jakieś stałe dane w kolejce są istotne, najlepszą opcją jest zmiana nazwy hosta odzyskanego hosta na oryginalny i zezwolenie na przetwarzanie / usuwanie kolejki wiadomości, w razie potrzeby możesz ponownie zmienić nazwę hosta.
gextra
źródło
1

Cześć. Miałem podobną sytuację, gdy przeprowadziłem migrację z AWS EC2 Small do Large Instance i potrzebowałem, aby RabbitMq działał i pracował ze starymi plikami DB Mnesia w nowej instancji, ponieważ zawierały one wiele ważnych opóźnionych zadań i informacji o kolejce. Poniżej znajduje się sposób obejścia tego problemu. Być może moje obejście, które pozwala nie usuwać folderu Mnesia i zachować dane, może komuś pomóc.

Głównym problemem jest to, że twoja nowa maszyna ma nową nazwę hosta - a katalog jest nazwany po niej (zmiana nazwy katalogu, jak wspomniano wcześniej, nie pomaga), więc musimy zmienić nazwę twojej nazwy hosta komputera i sprawić, aby RabbitMq działał ze starymi plikami. Niech „ip-0-0-0-0” to stara nazwa komputera (więc powinien istnieć folder mnesia / ver / lib / rabbitmq / mnsesia / ip-0-0-0-0 ), a nazwa hosta nowej maszyny to coś w stylu „ip-1-1-1-1”, ale nowa nazwa nie ma znaczenia, ponieważ ją zastąpimy. Wykonaj następujące polecenia:

sudo -s
echo "127.0.0.1 ip-0-0-0-0" >> /etc/hosts 
echo "ip-0-0-0-0" > /etc/hostname
reboot

Po ponownym uruchomieniu komputer będzie miał nową nazwę, a RabbitMq powinien działać ze starymi plikami.

Dmytriy Voloshyn
źródło