RabbitMQ運維


これは比較的に苦しい運維で、全く熟知していないシステムで、環境が分からない、配置が分からない、両目が黒くなっている.どうして?元の担当者が撤退し、引き継ぎ人が休暇を取ったり、再引き継ぎ人も休暇を取ったりしたため、再引き継ぎ人は不完全な文書しかない.私は再び、再び、再び人を引き継いで、ドキュメントさえありません.さらに大変なことに、これは生産環境であり、生産環境は問題を起こすことができず、「危険の間に命じられた」と自任していることはよく知られているだろう.
文句を言って、やはり簡単に今回の運維を言いましょう.運維はRabbitMQクラスタで、3つのノードA、B、Cで、各ノードに2つのインスタンスa 1/a 2、b 1/b 2、c 1/c 2が起動し、そのうちa 1、b 1、c 1はクラスタ環境rabbit cluster 1を構成し、a 1はディスクノードです.a 2、b 2、c 2はクラスタ環境rabbit cluster 2を構成し、c 2はディスクノードである.
RabbitMQクラスタに全く慣れていないので、基本的には穴をたくさん歩いて、現れるべきではない間違いにぶつかって、初心者の村長の経験になりました.やり方に従って、ここではまず正しい起動方法を話して、それから出会った異常を話します.
1.正しく起動
1.1各ノードの起動
自分が起動した歴史が見つからないので、公式サイトの一部を抜粋してここに置いておきます.3つのサーバノードがあり、hostnameはそれぞれrabbit 1、rabbit 2、rabbit 3です.
Rabbit MQは、3つのノードでそれぞれ起動します.
rabbit1$ rabbitmq-server -detached

rabbit2$ rabbitmq-server -detached

rabbit3$ rabbitmq-server -detached

コマンドrabbitmq-server -detachedでrabbitサービスを開始できます.
各ノードでクラスタのステータスを表示します.
rabbit1$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit1 ...
[{nodes,[{disc,[rabbit@rabbit1]}]},{running_nodes,[rabbit@rabbit1]}]
...done.

rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit2]}]},{running_nodes,[rabbit@rabbit2]}]
...done.

rabbit3$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit3 ...
[{nodes,[{disc,[rabbit@rabbit3]}]},{running_nodes,[rabbit@rabbit3]}]
...done.

RabbitMQサービスノードの名前はrabbit@shorthostnameということで、上の3つのノードはそれぞれrabbit@rabbit1、rabbit@rabbit2、rabbit@rabbit3.rabbitmq-serverを使用して基本的に実行される名前は小文字ですが、Windowsでrabbitmq-server.batを使用する場合は、ノード名は大文字になります.たとえばrabbit@RABBIT1.
1.2クラスタの作成
ここにrabbit@rabbit2およびrabbit@rabbit3に参加rabbit@rabbit1で、つまりrabbit@rabbit1ディスクノードで、他の2つはメモリノードです.
先把rabbit@rabbit2に参加rabbit@rabbit1で、次の操作を行います.
rabbit2$ rabbitmqctl stop_app
Stopping node rabbit@rabbit2 ...done.

rabbit2$ rabbitmqctl join_cluster rabbit@rabbit1
Clustering node rabbit@rabbit2 with [rabbit@rabbit1] ...done.

rabbit2$ rabbitmqctl start_app
Starting node rabbit@rabbit2 ...done.

間違いがなければ、rabbit@rabbit2すでに加入していますrabbit@rabbit1コマンドrabbitmqctl cluster_statusを使用して、クラスタのステータスを表示できます.
rabbit1$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit1 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]},
 {running_nodes,[rabbit@rabbit2,rabbit@rabbit1]}]
...done.

rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]},
 {running_nodes,[rabbit@rabbit1,rabbit@rabbit2]}]
...done.
join_cluster --ramによって、ノードがメモリノードとしてクラスタに参加することを指定することができる.そしてrabbit@rabbit3上では同じ操作を行えばよいが,ここでは省略する.
1.3クラスタの分割
クラスタを分割することは、実際にはクラスタから削除したいノードでresetを実行すればよく、クラスタ内のすべてのノードにこのノードを無視しないように通知します.
rabbit3$ rabbitmqctl stop_app
Stopping node rabbit@rabbit3 ...done.

rabbit3$ rabbitmqctl reset
Resetting node rabbit@rabbit3 ...done.

rabbit3$ rabbitmqctl start_app
Starting node rabbit@rabbit3 ...done.

各ノードでクラスタのステータスを表示するには、次の手順に従います.
rabbit1$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit1 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]},
 {running_nodes,[rabbit@rabbit2,rabbit@rabbit1]}]
...done.

rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]},
 {running_nodes,[rabbit@rabbit1,rabbit@rabbit2]}]
...done.

rabbit3$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit3 ...
[{nodes,[{disc,[rabbit@rabbit3]}]},{running_nodes,[rabbit@rabbit3]}]
...done.

あるノード上で別のノードを削除することもでき、forget_cluster_nodeを使用して行うことができ、ここでは後述せず、後述する異常でこのコマンドが使用される.
2.いくつかの異常
2.1 1台のマシンで複数のインスタンスを起動する
RabbitMQは1台のマシンで複数のインスタンスを起動することを許可し、自分が今回のメンテナンスで最も時間を費やしたのは、この3つのノードに2つのクラスタが配置されていることを知らなかったことであり、ps -ef|grep rabbit命令で2つのインスタンスがあることを見て、無邪気に1つが正常に閉鎖されていないと思っていたので、直接2つをkillにした.ここでは、1台のマシンで複数のインスタンスを起動した場合を記録します.
$ RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=hare rabbitmq-server -detached
$ rabbitmqctl -n hare stop_app
$ rabbitmqctl -n hare join_cluster rabbit@rabbit1
$ rabbitmqctl -n hare start_app

実行コマンドは、-nを使用して実行コマンドのインスタンスを指定する必要があります.これは覚えておいてください.
2.2 Bad cookie in table definition rabbit_durable_queue
これはもう間違いの具体的な説明が見つからないので、Googleから1つ探しました.基本的に似ています.
rabbitmqctl cluster rabbit@vmrabbita
Clustering node rabbit@vmrabbitb with [rabbit@vmrabbita] ...
Error: {unable_to_join_cluster,
          [rabbit@vmrabbita],
          {merge_schema_failed,
              "Bad cookie in table definition rabbit_durable_queue: rabbit@vmrabbitb = {cstruct,rabbit_durable_queue,set,[],[rabbit@vmrabbitb],[],0,read_write,[],[],false,amqqueue,[name,durable,auto_delete,arguments,pid],[],[],{{1266,16863,365586},rabbit@vmrabbitb},{{2,0},[]}}, rabbit@vmrabbita = {cstruct,rabbit_durable_queue,set,[],[rabbit@vmrabbitc,rabbit@vmrabbita],[],0,read_write,[],[],false,amqqueue,[name,durable,auto_delete,arguments,pid],[],[],{{1266,14484,94839},rabbit@vmrabbita},{{4,0},{rabbit@vmrabbitc,{1266,16151,144423}}}}
"
}}

主にBad cookie in table definition rabbit_durable_queueというのは、ノード間が「the Erlang Cookie」によって互いに識別する、$HOME/に格納されているためである.erlang.クッキーの中.何らかの理由でクラスタ内のいくつかのノードサーバ上のクッキーが一致しないと,互いに認識できず,そのようなエラーが発生する.もっと多いのは上のこれ「Bad cookie...」「Connection attempt from disallowed node」、「Could not auto-cluster」もあります.
2.3 already_member
この問題は比較2の1つの問題で、自分で掘った穴は、自分で埋めるしかありません.クラスタのいくつかのノード間で通信できないので、メモリノードのvar/lib/rabbitmq/mnesiaのフォルダを削除し、resetを実行します.join_clusterのコマンドを実行すると、エラーが表示されます.
Error: {ok,already_member}

解析すると,現在のノードにはクラスタに参加する情報はないが,参加するクラスタには既にそのノードの情報があるが,2つの情報が一致していないことが分かった.だから、現在のノードがクラスタに参加することを望んでいるとき、安全を考慮して、クラスタはあなたの子がクラスタの一員だと言って、これ以上追加しないでください.ログを取り出してみると:
=INFO REPORT==== 25-Jul-2016::20:11:10 ===
Error description:
   {could_not_start,rabbitmq_management,
       {{shutdown,
            {failed_to_start_child,rabbit_mgmt_sup,
                {'EXIT',
                    {{shutdown,
                         [{{already_started,<23251.1658.0>},
                           {child,undefined,rabbit_mgmt_db,
                               {rabbit_mgmt_db,start_link,[]},
                               permanent,4294967295,worker,
                               [rabbit_mgmt_db]}}]},
                     {gen_server2,call,
                         [<0.618.0>,{init,<0.616.0>},infinity]}}}}},
        {rabbit_mgmt_app,start,[normal,[]]}}}

Log files (may contain more information):
   ./../var/log/rabbitmq/hare.log
   ./../var/log/rabbitmq/hare-sasl.log

クラスタにすでにノード情報がある以上、ノードを繰り返し追加しないでください.クラスタ内のノード情報を削除してクラスタに参加するのは、新しいノードがクラスタに参加するのと同じではないでしょうか.
rabbitmqctl -n hare forget_cluster_node hare@rabbit1

これによりクラスタにはhare@rabbit1のメッセージが表示されたら、join_clusterコマンドを再実行すればよい.
2.4 var/lib/rabbitmq/mnesiaのファイルをディスクノードから削除しないでください.
このフォルダの内容は、ディスクノードがクラスタ情報を記録するためのファイルで、削除すると様々な異常が発生します.
  • ディスクノードの場合、クラスタに構成するExchanges、Queues、Userなどの情報はすべて
  • 失われる.
  • メモリノードの場合、接続クラスタの情報が失われ、クラスタへの再加入は
  • に失敗する.
    2つのクラスタなので、この2つの問題に遭遇しました.生产环境ですね、私が正常に集团を起动して得意になった时、突然すべてのExchanges、Queuesの情报がなくなったことに気づいた时の気持ちを想像できますか?幸いなことに、予備生産環境があり、直接予備生産環境の内容を導出し、生産環境に導入した.
    ああ、余生を奪った感動がある...
    個人用ページ:http://www.howardliu.cn
    個人ブログ:RabbitMQ運維
    CSDNホームページ:http://blog.csdn.net/liuxinghao
    CSDN博文:RabbitMQ運維