Ubuntu 22.04
Sponsored Link

RabbitMQ : クラスターを構成する2022/09/13

 
RabbitMQ クラスターを構成し、ノード間でキューを共有し、耐障害性を高めます。
当例では RabbitMQ サーバー 2 台を使用してクラスターを構成します。
[1]
[2] いずれかのノードからクラスター参加の設定をします。
# 事前にファイルの内容を他ノードと揃えておく

root@node02:~#
ssh node01.srv.world 'cat /var/lib/rabbitmq/.erlang.cookie' > /var/lib/rabbitmq/.erlang.cookie

root@node02:~#
systemctl restart rabbitmq-server
# アプリケーションを停止してリセット

root@node02:~#
rabbitmqctl stop_app

Stopping rabbit application on node rabbit@node02 ...
root@node02:~#
rabbitmqctl reset

Resetting node rabbit@node02 ...
# クラスター参加
# FQDN 指定ではなくホスト名のみを指定

root@node02:~#
rabbitmqctl join_cluster rabbit@node01

Clustering node rabbit@node02 with rabbit@node01
# アプリケーション開始

root@node02:~#
rabbitmqctl start_app

Starting node rabbit@node02 ...
completed with 3 plugins.
# ステータス確認

root@node02:~#
rabbitmqctl cluster_status

Cluster status of node rabbit@node02 ...
Basics

Cluster name: rabbit@node02

Disk Nodes

rabbit@node01
rabbit@node02

Running Nodes

rabbit@node01
rabbit@node02

Versions

rabbit@node01: RabbitMQ 3.9.13 on Erlang 24.2.1
rabbit@node02: RabbitMQ 3.9.13 on Erlang 24.2.1

Maintenance status

Node: rabbit@node01, status: not under maintenance
Node: rabbit@node02, status: not under maintenance

Alarms

(none)

Network Partitions

(none)

Listeners

Node: rabbit@node01, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node01, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@node02, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node02, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0

Feature flags

Flag: implicit_default_bindings, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: quorum_queue, state: enabled
Flag: stream_queue, state: enabled
Flag: user_limits, state: enabled
Flag: virtual_host_metadata, state: enabled
[3] キューの同期設定を実施します。
[rabbitmqadmin] コマンドが存在しない場合はこちらを参照ください
当例ではクラスター構成ノード全てでキューを同期するよう設定しますが、ノードの数を指定したり特定のノードを指定しての同期設定も可能です。
詳細は RabbitMQ 公式ドキュメントを参照ください。
  ⇒ https://www.rabbitmq.com/ha.html
# 同期させるキューを作成

[root@node01 ~]#
rabbitmqadmin declare queue name=shared_queue

queue declared
# ポリシーを設定
# rabbitmqctl set_policy [ポリシー名(任意の名称)] [キュー] [モード]

[root@node01 ~]#
rabbitmqctl set_policy ha-policy "shared_queue" '{"ha-mode":"all"}'

Setting policy "ha-policy" for pattern "shared_queue" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...
# ステータス確認

[root@node01 ~]#
rabbitmqadmin list queues name node policy slave_nodes state synchronised_slave_nodes

+--------------+---------------+-----------+---------------+---------+--------------------------+
|     name     |     node      |  policy   |  slave_nodes  |  state  | synchronised_slave_nodes |
+--------------+---------------+-----------+---------------+---------+--------------------------+
| shared_queue | rabbit@node01 | ha-policy | rabbit@node02 | running | rabbit@node02            |
+--------------+---------------+-----------+---------------+---------+--------------------------+
[4] 全ノードでリンク先の通り管理用のプラグインを有効にすると、以下のように Web 管理画面で各ノードのステータスが確認可能となります。
関連コンテンツ