Help us understand the problem. What is going on with this article?

RabbitMQでクラスタリング・ミラーリングをする

More than 5 years have passed since last update.

クラスタリングとは?

  • 複数のホスト(ノード)間で、connection, vhost, queue(メッセージ)を共有すること
    • 片方のホストでユーザ追加・vhost追加・メッセージ登録すると、もう片方のホストにも反映される(参照も同じ)
  • 2台の内、1台のRabbitMQがダウンしても、メッセージは消失しない
  • 詳しくはRabbitMQ Clustering Guide参照

ミラーリングとは?

  • queue(+メッセージ)を同期すること
  • クラスタリングだけでも、メッセージは同期するが、メッセージ本体はmasterのホストにしか存在しない。その為、masterのホストがダウンすると、そのメッセージは消失する
  • どのホストにもメッセージ本体を持つにはミラーリングが必要

クラスタリングの条件

  • クラスタリングするホスト同士のRabbitMQバージョンが同じであること(3桁目だけ違うのはOK)
    • NG: 2.x.x <=> 3.x.x
    • NG: 3.1.x <=> 3.2.x
    • OK: 3.2.x <=> 3.2.y
  • クラスタリングするホスト同士の/var/lib/rabbitmq/.erlang.cookieの値が同一であること
  • /var/lib/rabbitmq/.erlang.cookieの権限が400、所有者・グループがrabbitmqであること
  ll -la /var/lib/rabbitmq | grep erlang.cookie
  -r--------   1 rabbitmq rabbitmq   20 Sep 19 07:40 .erlang.cookie
  • クラスタリング用のポートが開いていること
    • デフォルトでは25672
    • 正確にはRABBITMQ_NODE_PORT + 20000。RABBITMQ_NODE_PORTがデフォルトで5672なので、25672となる
    • クライアントが使用するのはRABBITMQ_NODE_PORT=5672なので、異なることに注意
  • ホスト名が名前解決できること(IPアドレスではできない)

クラスタリング方法

  • サーバー停止
$ sudo /usr/sbin/rabbitmqctl stop_app
  • リセット(エラーになったらresetforce_resetで実行)
$ sudo /usr/sbin/rabbitmqctl reset
  • クラスタ設定
$ sudo /usr/sbin/rabbitmqctl join_cluster rabbit@<host_name>
  • サーバー起動
$ sudo /usr/sbin/rabbitmqctl start_app

クラスタリング設定確認

  • クラスタリング確認コマンド
$ sudo /usr/sbin/rabbitmqctl cluster_status
  • 実行結果(クラスタリング設定されている場合)
Cluster status of node 'rabbit@host-001' ...
[{nodes,[{disc,['rabbit@host-001','rabbit@host-002']}]},
 {running_nodes,['rabbit@host-002','rabbit@host-001']},
 {cluster_name,<<"rabbit@host-001">>},
 {partitions,[]}]
...done.

running_nodesにrabbit@host-001,rabbit@host-002がある

  • 実行結果(クラスタリング設定されているが、host-002が落ちている場合)
Cluster status of node 'rabbit@host-001' ...
[{nodes,[{disc,['rabbit@host-001','rabbit@host-002']}]},
 {running_nodes,['rabbit@host-001']},
 {cluster_name,<<"rabbit@host-001">>},
 {partitions,[]}]
...done.

running_nodesにrabbit@host-002が無い

クラスタリング解除

$ sudo /usr/sbin/rabbitmqctl stop_app
$ sudo /usr/sbin/rabbitmqctl reset
$ sudo /usr/sbin/rabbitmqctl start_app

ただし、resetにより、vhost・permission・queueも削除されるので、別途再作成が必要

ミラーリング方法

$ sudo /usr/sbin/rabbitmqctl set_policy all '^.*' '{"ha-mode": "all"}' -p <vhost>

"ha-mode": "all"とすることで、クラスタのすべてのホストでキューを同期する(個別のホストも指定可能)

vhost=/productionの場合
$ sudo /usr/sbin/rabbitmqctl set_policy all '^.*' '{"ha-mode": "all"}' -p /production
実行結果
Setting policy "all" for pattern "^.*" to "{\"ha-mode\": \"all\"}" with priority "0" ...
...done.

ミラーリング確認

  • rabbitmqctl list_policiesの場合
$ sudo /usr/sbin/rabbitmqctl list_policies -p <vhost>
vhost=/productionの場合
$ sudo /usr/sbin/rabbitmqctl list_policies -p /production
実行結果
Listing policies ...
/production     all     all     ^.*     {"ha-mode":"all"}       0
...done.
  • rabbitmqctl list_queuesの場合
$ sudo /usr/sbin/rabbitmqctl list_queues -p <vhost> name slave_pids
vhost=/productionの場合
$ sudo /usr/sbin/rabbitmqctl list_queues -p /production name slave_pids
実行結果
Listing queues ...
queue1   [<rabbit@host-001.2.19604.890>]
...done.

<rabbit@xxxx.x.xxxx.xxx>みたいに値が入っていればOK(ミラーリングされていないとブランク)

ミラーリングの注意点

  • ミラーリングされていないキューに対して、set_policyでミラーリング設定することは可能。ただし、set_policyの前に登録されているメッセージはミラーリングされない
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした