EC2上のRabbitMQをMulti-AZで冗長化

公開日: : EC2, サーバ, 手順 , ,

うーん。。。ハマった。
多分、もっとErlangのこと把握できていればよかったのだろうけど。

今回の構成だけど、、、
VPCでAZの違う2台のEC2上に構築したRabbitMQサーバでクラスターを組む際の話。
ハマったのでメモがてら諸々書いておく。
ちなみにAmazon Linux (Amazon Linux AMI release 2014.09)での話だけど、他のDistributionでもほぼ同じだと思う。

RabbitMQのインストール

お手軽にパッケージからインストールした。
自分の場合はChefのレシピ書いて2台に一気にインストールしたけど、手動でインストールするなら以下のように。

依存関係のerlangで結構な数のパッケージがインストールされると思う。
で、インストール後に直ぐにでも起動したいが、クラスター組むために色々と仕込む必要があるので、一旦起動は後回し。
またパッケージでインストールすると、rabbitmqというユーザが追加され、rabbitmqユーザでデーモン起動されるようだ。
rabbitmqユーザを確認すると以下のようになっていた。

上記のようにRabbitMQをインストールしたサーバをAZを変えて2台用意しておく。
もちろん、もっと大量にホスト設定してもよいけど、その場合、以降の設定は読み替えてね。

cookieの設定

クラスターを組むには、クラスター内のサーバで同じcookieを設定する必要がある。
cookieはrabbitmqサーバの実行ユーザのホームディレクトリ配下の「.erlang.cookie」というファイルにて設定する。
なので、対象のサーバにて以下のようにcookieを設定する。

上記の「MDGGEXXXXXXXXWVDHVKK」が設定値。
全てのクラスターメンバのホストにて適当な文字列で同一の設定をする。

RabbitMQの設定

設定ファイルは「/etc/rabbitmq/rabbitmq.config」で、JSON形式で諸々設定をする。

今回は全ての説明は省略するが、以下のように設定した。

実はココがハマったポイントの一つ目。
上記で、クラスター組む際に通信するポートを「inet_dist_listen_min」と「inet_dist_listen_max」で固定する。
EC2の場合、Security Groupで他のホストと通信する際に必要なポートを設定する必要があるが、上記設定を入れておかないと共有するべきポートが固定されず、設定が面倒になる(特定ホストは全部OKとか設定したくないし)。
上記のように設定したら、Security Groupの設定でポート「5672」と「5678」を適切な範囲(例えばVPC内全部とか)で公開設定しておく。
また、起動時の設定ではあるが、一応クラスターのノードも列挙しておいた。(あとで手動で追加するけど。)

この状態で、まずはRabbitMQが正常に起動することを確認しておく。

起動の確認。

これを全てのクラスターメンバのホストで設定しておく。
ここまでで一旦の準備は完了と思ったが、ここから先でもハマった・・・w

ノードの名前にFQDNが使えない

ここがハマったポイントその2。
RabbitMQはデフォルトでノード名が「hostname -s」になっているのだけど、このノード名を変更するには /etc/rabbitmq/rabbitmq-env.conf でNODENAMEを指定すれば良い。(このあたりはココに書いてある)
でも何故かFQDNは使えない…
折角、以前のエントリでも書いたようなAWSでインターナル向けのRoute 53の設定で名前解決させようとしても、このままだと利用できない。
クラスターメンバを追加したり、操作する際に結構面倒なことになる。。。(クラスターメンバが増えた際に全てのメンバで/etc/hostsを設定するとか考えたくないし、そもそもそんな設定は美しくないw)
ちなみに、これはRabbitMQの呼び出し部分を変えると一応対応できる。
具体的にはrabbitmq-serverコマンドの実体やrabbitmqctlコマンドの実体はShell Scriptなんだけど、erlの呼び出しの際のオプションを変える必要がある。
erlコマンドのオプションの詳細については、この辺りを参照してもらうとして、上記のスクリプトの中で自身のノードを「-sname」ってオプションで指定している。
これ、簡単に説明すると、同一ホスト内での分散Erlangの場合は「-sname」というオプションを利用するんだけど、 ホスト間での分散Erlangを利用する際には「-name」というオプションを利用する。
なので、諸々のスクリプトを変更した。

あっ、書き換える前にRabbitMQは停止しておくこと。

今回、修正を入れたのは以下の3つ。

  • /usr/lib/rabbitmq/lib/rabbitmq_server-3.1.5/sbin/rabbitmq-server
  • /usr/lib/rabbitmq/lib/rabbitmq_server-3.1.5/sbin/rabbitmqctl
  • /usr/lib/rabbitmq/lib/rabbitmq_server-3.1.5/sbin/rabbitmq-plugins

上記をそれぞれ以下のように修正した。

  • /usr/lib/rabbitmq/lib/rabbitmq_server-3.1.5/sbin/rabbitmq-server

  • /usr/lib/rabbitmq/lib/rabbitmq_server-3.1.5/sbin/rabbitmqctl

  • /usr/lib/rabbitmq/lib/rabbitmq_server-3.1.5/sbin/rabbitmq-plugins

修正後、今度はノード名をFQDN指定で以下のようにして設定する。

上記「hoge01.fuga.internal」の部分は各環境にあわせて変更すること。

これでRabbitMQが起動できればOK。

これでクラスタ組んでホスト追加するときにも困ることはほぼ無い。
もちろん、この変更を全てのクラスターメンバのホストで実施しておく。

クラスター化

上記手順までの変更をしていれば、直ぐにでもMulti-AZでクラスターを組むことが可能。
クラスター化するためにpluginも特に追加する必要はない。
試しに、クラスター化する際のpluginの状態を確認しておく。

何のpluginも入っていない。

さて、肝心のクラスター化だが、クラスターに参加するために2台目以降のホストで以下のように実行する。

上記のように停止してリセットして、「join_cluster」で1台目のFQDNを指定してクラスターに参加させ、再スタートさせて何のエラーも出なければOK。
この状態で、クラスター内のサーバで、それぞれクラスターのステータスを確認すると以下のように表示される。
まずは一台目。

もう一台側でも確認。

無事、クラスターをMulti-AZで組むことが出来た。

Adレクタングル[忍者ADMAX]

関連記事

no image

dstat+td-agent+ElasticSearch+Graphite+Grafana on Amazon Linux

タイトルが異様に長いけど、業務でタイトルのようなパフォーマンス監視環境を作った。 難易度はそんなに

記事を読む

aws_logo._V400518270_

AWSでRoute 53をPrivate DNSとしてVPC内で使ってみた

Amazon Web Services(AWS)のRoute 53がVPC内でのPrivate Ho

記事を読む

nginx_logo

NginxでのSSL設定(もうちょっと詳しく)

単に、 とするだけではなくて…というエントリ。 ちなみにRHEL系を想定して書いている。 ngin

記事を読む

nginx_logo

NginxでのOCSP Stapling対応設定

意外にハマったのでメモ。 OCSPとは OCSP(Online Certificate Stat

記事を読む

nginx_logo

ngx_pagespeed対応版nginxパッケージの作成(RHEL系)

インストールされているミドルウェアやアプリケーションはパッケージ化されていると、管理上において非常に

記事を読む

Comment

  1. シュリ より:

    RabbitMQクラスタはWAN環境での使用を推奨してなかったと記憶してますが、安定性は大丈夫そうでしょうか?

    • hiro より:

      当時を思い出すと・・・確かにクラスタのドキュメントではWAN利用は推奨されていなかったと僕も記憶しています(たしか別ソリューションを推奨していた)が、かれこれ設定から一年以上運用していますが、これまで何も問題が起きていないです。
      この設定をしたのは、AWSのVPC内であったのでセキュリティ的にも一定のレベルが担保されていることと、ネットワーク速度もそんなに遅くないし、リクエスト数もそんなに多くはない環境でしたので、チャレンジした次第です〜。
      ちなみにこの構成のRabbitMQを利用したのは、稼働監視のサーバを構成するときにsensuを利用して、そのときの裏側で利用したはずです。

コメントを残す

Adレクタングル[忍者ADMAX]

RabbitMQ.sh-600x600
EC2上のRabbitMQをMulti-AZで冗長化

うーん。。。ハマった。 多分、もっとErlangのこと把握できていれ

aws_logo._V400518270_
AWSでRoute 53をPrivate DNSとしてVPC内で使ってみた

Amazon Web Services(AWS)のRoute 53がV

nginx_logo
NginxでのSSL設定(もうちょっと詳しく)

単に、 とするだけではなくて…というエントリ。 ちなみにRHEL系を

→もっと見る

  • Author:
    hiro
    Work:
    インフラエンジニア
    Brief History:
    新卒後、ソフトハウスにて受託開発を中心に開発エンジニアを始める。
    数年前から現在はITインフラが専門。
PAGE TOP ↑