はじめに
- EC2 インスタンスに RabbitMQ をインストールする
- 2 台のノードをクラスタ化する
- 今更だけど RabbitMQ は Erlang で実装されたメッセージキューを管理するミドルウェア
- AWS の SQS と被るのかな(こんな記事もあったw)
参考
- Installing and setting up RabbitMQ Cluster in EC2 – PART1
- Clustering Guide
- Troubleshooting
- RabbitMQ 3.1の導入とCluster構成を検証する
- RabbitMQをインストールする
構築
環境
設定と起動
とっても簡単。
yum -y install erlang yum -yinstall rabbitmq-server --enablerepo=epel
そして、rabbitmq_management
等のプラグインも有効にしておく。
sudo /etc/init.d/rabbitmq-server start
以下のようにメッセージが表示される。
Starting rabbitmq-server: SUCCESS rabbitmq-server.
rabbitmq-server
が起動したら以下のようにプラグインを有効にする。
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
以下を実行してキューのミラーリングを設定する。(全てのキューをミラーリングする)
su - rabbitmq /usr/lib/rabbitmq/bin/rabbitmqctl set_policy all '^.*' '{"ha-mode": "all"}'
実行結果は下記の通り。
Setting policy "all" for pattern "^.*" to "{\"ha-mode\": \"all\"}" ... ...done.
Web ダッシュボードから確認する。
ブラウザでも管理画面にアクセスしてみる。(もちろん、Security Groups
の設定も忘れずに...デフォルトのログイン名は guest
パスワードも guest
)
ちなみに Security Groups
の設定は最低限、下記のように設定すれば Web ダッシュボードを確認することが出来る。
{ "SecurityGroups": [ { "IpPermissionsEgress": [ { "IpProtocol": "-1", "IpRanges": [ { "CidrIp": "0.0.0.0/0" } ], "UserIdGroupPairs": [] } ], "Description": "hoge-group", "IpPermissions": [ { "ToPort": 5672, "IpProtocol": "tcp", "IpRanges": [ { "CidrIp": "xxx.xxx.xxx.xxx/32" } ], "UserIdGroupPairs": [], "FromPort": 15672 }, { "ToPort": 15672, "IpProtocol": "tcp", "IpRanges": [ { "CidrIp": "xxx.xxx.xxx.xxx/32" } ], "UserIdGroupPairs": [], "FromPort": 15672 }, { "ToPort": 55672, "IpProtocol": "tcp", "IpRanges": [ { "CidrIp": "xxx.xxx.xxx.xxx/32" } ], "UserIdGroupPairs": [], "FromPort": 55672 } ], "GroupName": "hoge-group", "VpcId": "vpc-12345678", "OwnerId": "123456789012", "GroupId": "sg-12345678" } ] }
AMI を作る
とりあえずひと通りの構築が終わったら AMI
を作成する。
aws ec2 create-image --instance-id i-xxxxxx --name kappa-rabbitmq-image
この AMI
を使ってクラスタのノードを構築する。
クラスタ構成を構築する
ポイント
クラスタを構築する上でのポイントは下記の通り。
/var/lib/rabbitmq/.erlang.cookie
の内容はクラスタ内のノードで同じ値にしておく(これ重要)EC2
故のポイントとしてはノードのホスト名をどのように固定するか(とりあえず今回はノードの/etc/hosts
に記載する)
インスタンスの起動
先ほど作成した AMI
を利用してもう一台のインスタンスを起動する。
aws ec2 run-instances --image-id ami-1234567 --associate-public-ip-address
インスタンスタイプ等も合わせて指定して起動する。
/etc/hosts を設定する
/etc/hosts
に各ノードの設定を行う。
xxx.xxx.xxx.1 ip-xxx-xxx-xxx-1 xxx.xxx.xxx.2 ip-xxx-xxx-xxx-2
お互いのノードでホスト名(ip-xxx-xxx-xxx-*
) で疎通が取れることを確認しておく。
rabbitmq.config
クラスタ構成を下記のように設定して /etc/rabbitmq/rabbitmq.config
に保存する(それぞれのノードに配置する)。
[ {rabbit, [ {tcp_listeners, [5672]}, {collect_statistics_interval, 10000}, {heartbeat,30}, {cluster_partition_handling, pause_minority}, {cluster_nodes, {[ 'rabbit@ip-xxx-xxx-xxx-1', 'rabbit@ip-xxx-xxx-xxx-2'], disc}} ] }, {rabbitmq_management, [ {http_log_dir,"/tmp/rabbit-mgmt"},{listener, [{port, 15672}]} ] }, {rabbitmq_management_agent, [ {force_fine_statistics, true} ] } ].
クラスタを構築する
sudo su - su - rabbitmq rabbitmqctl stop_app
以下のように出力される。
Stopping node 'rabbit@ip-xxx-xxx-xxx-xx' ... ...done.
更に以下を実行する。
rabbitmqctl reset
以下のように出力される。
Resetting node 'rabbit@ip-xxx-xxx-xxx-xx' ... ...done.
更に以下を実行し...
rabbitmqctl stop
一旦、root
ユーザーにスイッチして rabbitmq-server
を再起動する。
/etc/init.d/rabbitmq-server restart
rabbitmq-server
を再起動した後 Web ダッシュボードを確認すると...
クラスタにノードが追加されている!!
まとめと次回の予定
構築にあたって
RabbitMQ
自体のインストールはとても簡単(yum
で一発)- クラスタ構築も難しくは無いが
rabbitmqctl
コマンドの実行はrabbitmq
ユーザーで行う必要がある(rabbitmq
ユーザーの ${HOME} ディレクトリは/var/lib/rabbitmq
となる) - クラスタ内のノードはホスト名での通信となるので
DNS
やインスタンス起動時自動でクラスタ内のホスト名を登録するような仕組みが必要になる(次回、検討、検証する)
次回の予定
- せっかく
AWS
環境での構築なのでRoute53
を利用したクラスタ内のホスト名解決を試す - 同様に
User Data
を利用してもホスト名解決の設定が出来そうなので合わせて試す - 運用管理系のコマンドの使い方についてまとめる
Ruby
からつないで動作確認も行う