ども、cloudpack の かっぱ (@inokara) です。
CentOS にインストール
環境
CentOS 6.5
iptables
を止めておくselinux
もdisabled
Security Group
でVPC
内のサブネット通信はすべて許可した(必要に応じてポートは絞りましょう)
インストール
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
って何をやってるんだというのが掴める(かも)。
RabbitMQ – AMQP 0-9-1 Model Explained より引用
上のイメージが掲載されているページの What is AMQP?
と Brokers and Their Role
も読んでおきたい。
登場人物としては…
-
Publishers
-
Message brokers
-
Consumers
が出てくる。Message brokers
がその名の通り仲介役の RabbitMQ
になる。そして、Publishers
が RabbitMQ
にキューを放り込むアプリケーション、そして Consumers
がそれを受け取るアプリケーションとなる。そのメッセージのやりとりを AMQP というプロトコルに乗っけて行っている。(AMQP
については下記のセクションでちょっとだけ触れる)
クラスタ化の基礎
ポイント
- クラスタ化するノード間で
erlang.cookie
を同じにしておく - ドキュメント等で
Name
と呼ばれているのはrabbit@${hostname}
なので注意する - 2. のことからノード間での名前解決は必須となる
ざっくり言うと erlang.cookie
が同じでノード間の名前解決がちゃんとされていれば難しくない。
クラスタ化する前のとあるノード
クラスタ化
スレーブになるノード上で以下を実行していく。
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
クラスタからの切り離し
マスターノードからスレーブノードを切り離す
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 インストールや操作メモ、ちょっと濃い話」