CentOS 7にRabbitMQをクラスタ構成で構築する

Graylogでログ取得に使うキューイングシステムとしてKafkaをちょこちょこいじってたのだが、ちょっと用途に合ってないことが分かった(暗号化まわり)。 で、ほかに何か使えるのないかなと思って調べてたところ、GraylogはRabbitMQににも対応しているようだ。 なので、今回はRabbit MQを2台構成のクラスタで構築をする(ここでは、MasterをBS-PUB-RABBITMQ01、SlaveをBS-PUB-RABBITMQ02で表現する)。 OSにはCentOS 7を用いる。

なお、RabbitMQのクラスタ構成には互いを名前解決できる必要があるので注意。

1. RabbitMQのインストール

まず、以下のコマンドをインストールして、RappidMQのインストールをする。

yum install -y epel-release
yum install -y erlang
yum install -y https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server-3.6.6-1.el7.noarch.rpm

これで、RabbitMQのインストールができた。 以下のコマンドでサービスを起動する。

systemctl start rabbitmq-server

firewalldで必要なポートを開放する。

firewall-cmd --permanent --add-port=4369/tcp
firewall-cmd --permanent --add-port=5672/tcp
firewall-cmd --permanent --add-port=15672/tcp
firewall-cmd --permanent --add-port=25672/tcp
firewall-cmd --reload

2. クラスタの構成

次に、RabbitMQをクラスタ構成にする。 RabbitMQでクラスタ構成にするには、各ノードの「/var/lib/rabbitmq/.erlang.cookie」の内容が一致している必要がある。 とりあえず、Master側の内容をSlaveにコピーしてやればいいだろう(なお、catで見るとわかるのだが改行は含めないので注意。エディタで編集するよりは、以下のようにコマンドで書き換えてやるほうがいいだろう)。

Slave側で以下のコマンドを実行する(cookieの内容を書き換えてからサービス起動しないと後の行程でこける)。

systemctl stop rabbitmq-server
printf MasterのCookieの内容 > /var/lib/rabbitmq/.erlang.cookie
systemctl start rabbitmq-server
[root@BS-PUB-RABBITMQ02 ~]# systemctl stop rabbitmq-server
[root@BS-PUB-RABBITMQ02 ~]# printf ZGZAAPNSMLNKMGCQMRXO > /var/lib/rabbitmq/.erlang.cookie
[root@BS-PUB-RABBITMQ02 ~]# systemctl start rabbitmq-server

Master/SlaveでCookieの内容をそろえた状態でサービス起動させたら、Slave側で以下のコマンドを実行する。

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@Master
rabbitmqctl start_app
[root@BS-PUB-RABBITMQ02 ~]# rabbitmqctl stop_app
Stopping node 'rabbit@BS-PUB-RABBITMQ02' ...
[root@BS-PUB-RABBITMQ02 ~]# rabbitmqctl reset
Resetting node 'rabbit@BS-PUB-RABBITMQ02' ...
[root@BS-PUB-RABBITMQ02 ~]# rabbitmqctl join_cluster --ram rabbit@BS-PUB-RABBITMQ01
Clustering node 'rabbit@BS-PUB-RABBITMQ02' with 'rabbit@BS-PUB-RABBITMQ01' ...
[root@BS-PUB-RABBITMQ02 ~]# rabbitmqctl start_app
Starting node 'rabbit@BS-PUB-RABBITMQ02' ...

これでクラスタ化ができた。 以下のコマンドで、RabbitMQクラスタのステータス確認をしてみよう。

rabbitmqctl cluster_status
[root@BS-PUB-RABBITMQ02 ~]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@BS-PUB-RABBITMQ02' ...
[{nodes,[{disc,['rabbit@BS-PUB-RABBITMQ01']},
         {ram,['rabbit@BS-PUB-RABBITMQ02']}]},
 {running_nodes,['rabbit@BS-PUB-RABBITMQ01','rabbit@BS-PUB-RABBITMQ02']},
 {cluster_name,<<"rabbit@BS-PUB-RABBITMQ02.BLACKNON.LOCAL">>},
 {partitions,[]},
 {alarms,[{'rabbit@BS-PUB-RABBITMQ01',[]},{'rabbit@BS-PUB-RABBITMQ02',[]}]}]

3. キューのミラーリング

次に、各クラスタでキューのミラーリング設定(Mirrored Queue)を行う。 ミラーリング設定ではポリシーの設定が必要のようだ。 基本は「all(全ノードでキューの同期をする)」でいいだろう。

  • all … 全ノードでキューの同期を行う
  • exactly … 指定した数のノードでキューの同期を行う
  • nodes … 指定したノードでキューの同期を行う

以下のコマンドをMasterで実行し、ミラーリングの設定を行う。

rabbitmqctl set_policy "ポリシー名" "キュー名" '{"ha-mode":"all"}'
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqctl set_policy "mirror-test" "test.queue" '{"ha-mode":"all"}'
Setting policy "mirror-test" for pattern "test.queue" to "{\"ha-mode\":\"all\"}" with priority "0" ...

コマンド実行後、実際にキューを作成してミラーリングされることを確認しよう。 ただ、デフォルトでインストールされてるコマンドだけだとキューを作成できないので、以下のコマンドを実行して「rabbitmqadmin」をインストールしよう。 (インストールについては、Master/Slaveどちらでも行っておこう)

rabbitmq-plugins enable rabbitmq_management
wget http://127.0.0.1:15672/cli/rabbitmqadmin -O /usr/lib/rabbitmq/bin/rabbitmqadmin
chmod +x /usr/lib/rabbitmq/bin/rabbitmqadmin
ln -s /usr/lib/rabbitmq/bin/rabbitmqadmin /usr/sbin/rabbitmqadmin

「rabbitmqadmin」をインストール後、以下のコマンドを実行してテスト用のキューを作成する。

rabbitmqadmin list queues name slave_nodes synchronised_slave_nodes
rabbitmqadmin declare queue name=test.queue
rabbitmqadmin list queues name slave_nodes synchronised_slave_nodes
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqadmin list queues name slave_nodes synchronised_slave_nodes
No items
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqadmin declare queue name=test.queue
queue declared
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqadmin list queues name slave_nodes synchronised_slave_nodes
+------------+------------------------------+------------------------------+
|    name    |         slave_nodes          |   synchronised_slave_nodes   |
+------------+------------------------------+------------------------------+
| test.queue | ["rabbit@BS-PUB-RABBITMQ02"] | ["rabbit@BS-PUB-RABBITMQ02"] |
+------------+------------------------------+------------------------------+

これで、無事RabbitMQをクラスタ構成で構築できた。

4. 管理画面へのログイン・設定

さて、とりあえずこれでクラスタの構築は終わったのだが、ルーティングキーの設定もできてないので、このままだと利用できない。 ルーティングキー設定などは管理画面から行えるので、管理画面にログインするためのユーザを作成する。

rabbitmqctl add_user ユーザ名 パスワード
rabbitmqctl set_permissions -p / ユーザ名 ".*" ".*" ".*"
rabbitmqctl set_user_tags ユーザ名 administrator
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqctl add_user test P@ssw0rd
Creating user "test" ...
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqctl set_permissions -p / test ".*" ".*" ".*"
Setting permissions for user "test" in vhost "/" ...
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqctl list_users
Listing users ...
test    []
guest   [administrator]
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqctl set_user_tags test administrator
Setting tags for user "test" to [administrator] ...
[root@BS-PUB-RABBITMQ01 ~]# rabbitmqctl list_users
Listing users ...
test    [administrator]
guest   [administrator]

ユーザができたら、あとはブラウザから「http://サーバのIPアドレスorホスト名:15672」へ接続する。

ログイン後は、「Exchanges」タブもしくは「Queues」タブから対象のQueueを選択し、Routing Keyの設定をしてやるとよいだろう。


参考