share facebook facebook2 twitter menu hatena pocket slack

2014.12.02 TUE

RabbitMQ インストールや操作メモ、ちょっと濃い話

川原 洋平

WRITTEN BY川原 洋平

ども、cloudpackかっぱ (@inokara) です。

CentOS にインストール

環境

  • CentOS 6.5
  • iptables を止めておく
  • selinuxdisabled
  • Security GroupVPC 内のサブネット通信はすべて許可した(必要に応じてポートは絞りましょう)

インストール

epel パッケージリポジトリの登録からのインストール

デフォルトの状態だと epel のリポジトリは非登録なのでひとまず。

sudo rpm -i http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

からの…

sudo yum -y install erlang rabbitmq-server --enablerepo=epel

でとりあえず…。

sudo /etc/init.d/rabbitmq-server start

を実行して上がることを確認する。

動作確認

確認としては…

su - rabbitmq

してからの…

rabbitmqctl status

を実行すると以下のような結果が表示されればひとまず起動はおけ。

Status of node 'rabbit@ip-xxx-xxx-xxx-xxx' ...
[{pid,1214},
 {running_applications,[{rabbit,"RabbitMQ","3.1.5"},
                        {mnesia,"MNESIA  CXC 138 12","4.5"},
                        {os_mon,"CPO  CXC 138 46","2.2.7"},
                        {xmerl,"XML parser","1.2.10"},
                        {sasl,"SASL  CXC 138 11","2.1.10"},
                        {stdlib,"ERTS  CXC 138 10","1.17.5"},
                        {kernel,"ERTS  CXC 138 10","2.14.5"}]},
 {os,{unix,linux}},
 {erlang_version,"Erlang R14B04 (erts-5.8.5)  [64-bit] [rq:1] [async-threads:30] [kernel-poll:true]n"},
 {memory,[{total,27164024},
          {connection_procs,2648},
          {queue_procs,5296},
          {plugins,0},
          {other_proc,9244360},
          {mnesia,57504},
          {mgmt_db,0},
          {msg_index,22040},
          {other_ets,765840},
          {binary,2928},
          {code,14419185},
          {atom,1354457},
          {other_system,1289766}]},
 {vm_memory_high_watermark,0.4},
 {vm_memory_limit,247676928},
 {disk_free_limit,1000000000},
 {disk_free,7098818560},
 {file_descriptors,[{total_limit,924},
                    {total_used,3},
                    {sockets_limit,829},
                    {sockets_used,1}]},
 {processes,[{limit,1048576},{used,122}]},
 {run_queue,0},
 {uptime,32}]
...done.
プラグインのインストール
sudo /usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_shovel
sudo /usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management
sudo /usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_shovel_management
AMI 化

出来たインスタンスを AMI 化。AMI 化することで erlang.cookie を揃える手間を省く。

2 分で解った気になる RabbitMQ

RabbitMQ の簡単なイメージ

「百聞は一見に如かず」以下のイメージで RabbitMQ って何をやってるんだというのが掴める(かも)。
2分で解った気になる RabbitMQ: イメージ図

RabbitMQ – AMQP 0-9-1 Model Explained より引用

上のイメージが掲載されているページの What is AMQP?Brokers and Their Role も読んでおきたい。

登場人物としては…

  • Publishers
  • Message brokers
  • Consumers

が出てくる。Message brokers がその名の通り仲介役の RabbitMQ になる。そして、PublishersRabbitMQ にキューを放り込むアプリケーション、そして Consumers がそれを受け取るアプリケーションとなる。そのメッセージのやりとりを AMQP というプロトコルに乗っけて行っている。(AMQP については下記のセクションでちょっとだけ触れる)

クラスタ化の基礎

ポイント

  1. クラスタ化するノード間で erlang.cookie を同じにしておく
  2. ドキュメント等で Name と呼ばれているのは rabbit@${hostname} なので注意する
  3. 2. のことからノード間での名前解決は必須となる

ざっくり言うと erlang.cookie が同じでノード間の名前解決がちゃんとされていれば難しくない。

クラスタ化する前のとあるノード

2分で解った気になる RabbitMQ: クラスタ化する前のとあるノード
シンプル。

クラスタ化

スレーブになるノード上で以下を実行していく。

rabbitmqctl stop_app
su - rabbitmq
rabbitmqctl stop_app
rabbitmqctl reset
su - rabbitmq
rabbitmqctl reset
rabbitmqctl join_cluster
su - rabbitmq
rabbitmqctl join_cluster rabbit@ip-xxx-xxx-xxx-xx1

以下のようなメッセージが表示される。

$ rabbitmqctl join_cluster rabbit@ip-xxx-xxx-xxx-xx1
Clustering node 'rabbit@ip-xxx-xxx-xxx-xx2' with 'rabbit@ip-xxx-xxx-xxx-xx1' ...
...done.
rabbitmqctl start_app
su - rabbitmq
rabbitmqctl start_app

クラスタ化 done

2分で解った気になる RabbitMQ: クラスタ化完了

クラスタからの切り離し

マスターノードからスレーブノードを切り離す
rabbitmqctl forget_cluster rabbit@ip-xxx-xxx-xxx-xx2
動作イメージ

クラスタ構成の確認。

-bash-4.1$ rabbitmqctl cluster_status
Cluster status of node 'rabbit@ip-xxx-xxx-xxx-xx1' ...
[{nodes,[{disc,['rabbit@ip-xxx-xxx-xxx-xx2','rabbit@ip-xxx-xxx-xxx-xx1']}]},
 {running_nodes,['rabbit@ip-xxx-xxx-xxx-xx1']},
 {partitions,[]}]
...done.

切り離し。

-bash-4.1$ rabbitmqctl forget_cluster_node rabbit@ip-xxx-xxx-xxx-xx2
Removing node 'rabbit@ip-xxx-xxx-xxx-xx2' from cluster ...
...done.

切り離した後。

-bash-4.1$ rabbitmqctl cluster_status
Cluster status of node 'rabbit@ip-xxx-xxx-xxx-xx1' ...
[{nodes,[{disc,['rabbit@ip-xxx-xxx-xxx-xx1']}]},
 {running_nodes,['rabbit@ip-xxx-xxx-xxx-xx1']},
 {partitions,[]}]
...done.

コマンド

rabbitmqctl

RabbitMQ サービスのスタート
rabbitmqctl start_app
RabbitMQ サービスのストップ
rabbitmqctl stop_app

クラスタ関連

クラスタにジョイン
rabbitmqctl join_cluster rabbit@ip-xxx-xxx-xxx-xx1
クラスタから抜ける
rabbitmqctl stop_app
rabbitmqctl reset

プロトコルレベルの話(小難しい話)

RabbitMQ を実装している AMQP というプロトコルについて少しだけ…

資料

コネクションとチャンネルの関係

  • プロトコル仕様書では 23 ページあたり
  • AMQP ではパブリッシャーやコンシューマーとの接続をコネクションと呼ぶ
  • コネクション内で複数のチャンネル(またはセッション)を利用して MQ(ブローカー)とキューのやりとりを行う

元記事はこちらです。
RabbitMQ インストールや操作メモ、ちょっと濃い話