ようへいの日々精進XP

よかろうもん

EC2 インスタンス上に RabbitMQ クラスタを構成する(1)

はじめに


参考


構築

環境

設定と起動

とっても簡単。

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

f:id:inokara:20140223015237p:plain

ちなみに 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 ダッシュボードを確認すると...

f:id:inokara:20140223023846p:plain

クラスタにノードが追加されている!!


まとめと次回の予定

構築にあたって

  • RabbitMQ 自体のインストールはとても簡単(yum で一発)
  • クラスタ構築も難しくは無いが rabbitmqctl コマンドの実行は rabbitmq ユーザーで行う必要がある(rabbitmq ユーザーの ${HOME} ディレクトリは /var/lib/rabbitmq となる)
  • クラスタ内のノードはホスト名での通信となるので DNSインスタンス起動時自動でクラスタ内のホスト名を登録するような仕組みが必要になる(次回、検討、検証する)

次回の予定

  • せっかく AWS 環境での構築なので Route53 を利用したクラスタ内のホスト名解決を試す
  • 同様に User Data を利用してもホスト名解決の設定が出来そうなので合わせて試す
  • 運用管理系のコマンドの使い方についてまとめる
  • Ruby からつないで動作確認も行う