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の設定をしてやるとよいだろう。
参考
- RabbitMQ - Management Plugin
- RabbitMQ - Management Command Line Tool
- RabbitMQを使ってみる〜クラスタリング編〜 | Tech-Sketch
- RabbitMQ管理コマンド(rabbitmqctl)使い方 - Qiita