Debian 12 bookworm
Sponsored Link

RabbitMQ : クラスターを構成する2023/07/20

 
RabbitMQ クラスターを構成し、ノード間でキューを共有し、耐障害性を高めます。
当例では RabbitMQ サーバー 2 台を使用してクラスターを構成します。
[1]
[2] 全ノードで、一意なノード名を設定しておきます。
root@node01:~#
vi /etc/rabbitmq/rabbitmq-env.conf
# 5行目 : コメント解除して任意の一意なノード名に変更

NODENAME=
rabbit01
root@node01:~#
systemctl restart rabbitmq-server
root@node01:~#
rabbitmqctl eval "node()."

rabbit01@node01
[3] いずれかのノードからクラスター参加の設定をします。
# 事前にファイルの内容を他ノードと揃えておく

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 rabbit02@node02 ...
root@node02:~#
rabbitmqctl reset

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

root@node02:~#
rabbitmqctl join_cluster rabbit01@node01

# アプリケーション開始

root@node02:~#
rabbitmqctl start_app

# ステータス確認

root@node02:~#
rabbitmqctl cluster_status

Cluster status of node rabbit02@node02 ...
Basics

Cluster name: rabbit02@node02.srv.world

Disk Nodes

rabbit01@node01
rabbit02@node02

Running Nodes

rabbit01@node01
rabbit02@node02

Versions

rabbit01@node01: RabbitMQ 3.10.8 on Erlang 25.2.3
rabbit02@node02: RabbitMQ 3.10.8 on Erlang 25.2.3

Maintenance status

Node: rabbit01@node01, status: not under maintenance
Node: rabbit02@node02, status: not under maintenance

Alarms

(none)

Network Partitions

(none)

Listeners

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

Feature flags

Flag: classic_mirrored_queue_version, state: enabled
Flag: drop_unroutable_metric, state: enabled
Flag: empty_basic_get_metric, state: enabled
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
[4] キューの同期設定を実施します。
[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 | rabbit01@node01 | ha-policy | rabbit02@node02 | running | rabbit02@node02          |
+--------------+-----------------+-----------+-----------------+---------+--------------------------+
[5] 全ノードでリンク先の通り管理用のプラグインを有効にすると、以下のように Web 管理画面で各ノードのステータスが確認可能となります。
関連コンテンツ