Bagaimana cara memulai kembali rabbitmq setelah berpindah mesin?

16

Saya menjalankan Django / seledri di EC2, dengan rabbitmq sebagai broker. Mesin yang saya gunakan gagal, jadi saya menyalakan contoh lain. Tapi sejak beralih ke mesin baru, saya belum bisa membuat seledri bekerja.

EDIT: Saya sudah memasukkan banyak log di bawah, kalau-kalau saya salah mendiagnosis masalah. Tapi saya 85% yakin masalahnya adalah bahwa rabbitmq-server gagal memulai dalam fase "mulai basis data".

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

Adakah ide tentang cara mendiagnosis / menyelesaikan masalah ini lebih lanjut?

Inilah yang terjadi ketika saya mencoba menjalankan seledri:

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

Menelusuri kembali, sepertinya server rabbitmq adalah masalahnya, dan database khususnya:

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

Tapi saya belum bisa menemukan cara me-restart server:

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

Juga, tidak tahu apakah itu relevan, tetapi proses ini berjalan di latar belakang.

$ 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

Saya belum dapat menemukan dokumentasi apa pun untuk kegagalan seperti ini. Ada saran?

Abe
sumber

Jawaban:

16

Saya mendapat bantuan yang sangat baik dari daftar rabbitmq-mendiskusikan:

Basis data yang digunakan RabbitMQ terikat dengan nama host mesin, jadi jika Anda menyalin dir basis data ke mesin lain, itu tidak akan berfungsi. Jika ini masalahnya, Anda harus menyiapkan mesin dengan nama host yang sama seperti sebelumnya dan mentransfer pesan yang luar biasa ke mesin baru. Jika tidak ada yang penting pada rabbit, Anda bisa menghapus semuanya dengan menghapus file RabbitMQ di / var / lib / rabbitmq.

Saya menghapus semuanya di / var / lib / rabbitmq / mnesia / rabbit / dan semuanya dimulai tanpa masalah. Hore!

Abe
sumber
8

Masalah ini terkait dengan fakta bahwa Mnesia, yang menyimpan antrian dan konfigurasi meta-data dari RabbitMQ, membuat database menggunakan nama host mesin.

Direktori basis data berbasis hostname akan berlokasi di bawah:

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

Jadi, opsi untuk menghapus 2 direktori di atas dan memulai kembali rabbitmq akan berfungsi. Jika server rabbitmq dimigrasi dari satu host ke host lain, Anda akan membawa database mnesia hostname lama. Cukup mengganti nama direktori ke nama host yang tepat tidak akan berfungsi, menurut pengujian saya.

Jadi, jika Anda perlu mempertahankan struktur antrian , akun pengguna, dan metadata lain yang ditentukan untuk server RabbitMQ Anda, Anda perlu menyimpan salinan metadata tersebut.

Ada dua cara untuk mengekstrak atau mengimpor konfigurasi metadata

  • Plugin Manajemen: aktifkan plugin manajemen rabbitmq dan buka server url: 15672. Halaman utama memiliki dua opsi terbawah, satu untuk mengekspor dan satu untuk mengimpor definisi

  • Command Line: rabbitmqadmin export rabbit.config (atau impor bukan ekspor)

Jadi, saran garis bawah:

  • pertahankan ekspor saat ini dari struktur antrian Anda / pengguna / dll
  • ketika memigrasi server, atau melalui pemulihan, mengambil tindakan untuk menghapus struktur direktori sebelumnya (jika data yang antri tidak relevan) dan mengimpor kembali konfigurasi / metadata asli.
  • Jika ada data antrian persisten yang relevan, opsi terbaik adalah mengubah nama hostname Anda yang dipulihkan menjadi yang asli dan memungkinkan pesan untuk diproses / dequeue, maka Anda dapat menyesuaikan nama host lagi jika diperlukan.
gextra
sumber
1

Hai Saya memiliki situasi yang sama ketika saya bermigrasi dari AWS EC2 Small ke Large Instance dan perlu untuk menjaga RabbitMq berjalan dan bekerja dengan file DB mnesia lama pada contoh baru karena mereka berisi banyak tugas penting yang tertunda dan info antrian. Di bawah ini adalah solusi yang saya gunakan untuk mengelola ini. Mungkin solusi saya yang memungkinkan seseorang untuk tidak menghapus folder mnesia dan menyimpan data dapat membantu seseorang.

Masalah utama adalah bahwa mesin baru Anda memiliki nama host baru - dan direktori dinamai setelah itu (hanya mengganti nama direktori seperti yang disebutkan sebelumnya, tidak membantu) sehingga kami perlu mengganti nama nama mesin Anda dan membuat RabbitMq untuk bekerja dengan file lama. Biarkan "ip-0-0-0-0" menjadi nama mesin lama (jadi harus ada folder mnesia / ver / lib / rabbitmq / mnsesia / ip-0-0-0-0 ), dan nama host mesin baru adalah sesuatu seperti "ip-1-1-1-1", tetapi nama baru tidak masalah karena kami akan menimpanya. Jalankan perintah berikut:

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

Setelah reboot mesin Anda akan memiliki nama baru dan RabbitMq akan berfungsi dengan file lama.

Dmytriy Voloshyn
sumber