GNU/Linux >> Linux の 問題 >  >> Linux

Ubuntu/Debian Linux で RabbitMQ クラスターをセットアップする方法

アプリケーションのワークロードと配信時間を削減したいですか?アプリケーション用に RabbitMQ クラスタをセットアップして、頭を悩ませる必要はありません!

このチュートリアルでは、RabbitMQ クラスターをセットアップし、高可用性をサポートする完全に機能する RabbitMQ クラスターを用意する方法を学習します。

準備?読み進めて、ワークロードの削減を始めましょう!

前提条件

このチュートリアルを進めるには、次の要件が整っていることを確認してください:

  • 同じネットワーク内の 2 つ以上の Linux サーバー – このチュートリアルでは、node01、node02、および node03 という名前の 3 つの Debian 11 サーバーを使用します。
  • Sudo root 権限または root/administrator アカウントへのアクセス

ホスト ファイルの設定

RabbitMQ クラスターは、ホスト名またはローカル ドメインで動作します。 /etc/hosts を編集して、各ホスト名がサーバーの IP アドレスに解決されるようにする必要があります。 ファイル。

/etc/hosts を開く 任意のテキスト エディターを使用してすべてのサーバーにファイルを作成し、次の行をファイルに追加します。

/etc/hosts ファイルの編集には sudo 権限が必要であることを忘れないでください。

/etc/hosts の形式 構成は IP-address hostname です .

以下の値をサーバーの IP アドレスとホスト名に置き換え、変更を保存してエディターを終了します。

# /etc/hosts file RabbitMQ Servers
172.16.1.20     node01
172.16.1.21     node02
172.16.1.22     node03

次に、ping を実行します 以下のコマンドを実行して、各ホスト名がサーバーの正しい IP アドレスに解決されることを確認します。各 -c 3 オプションは ping になります リクエストを 3 回行ってから、リクエストを終了します。

# ping node01 node02 and node03
ping -c 3 node01
ping -c 3 node02
ping -c 3 node03

構成が正しい場合、以下に示すように、各ホスト名がサーバーの正しい IP アドレスに解決されていることがわかります。

すべてのサーバーに RabbitMQ をインストールする

/etc/hosts を構成したので、 ファイルをすべてのサーバーにインストールしたら、RabbitMQ パッケージをすべてのサーバー (node01、node02、および node03) にインストールします。ほとんどの Linux ディストリビューションの公式ディストリビューション リポジトリから RabbitMQ をインストールできます。

執筆時点で、Debian および Ubuntu リポジトリは、最新の安定した RabbitMQ バージョン 3.8.9 を提供しています。

1. apt を実行します 以下のコマンドを実行して、システムのすべてのパッケージ インデックスを更新します。

sudo apt update

2. 次に、次の apt install を実行します RabbitMQ をインストールするコマンド (rabbitmq-server ) をシステムに追加します。

インストールが完了すると、rabbitmq-server サービスが自動的に開始され、システムで有効になります。

sudo apt install rabbitmq-server -y

3. 最後に、次のコマンドを実行して rabbitmq-server を確認します。 サービスの状態。

sudo systemctl status rabbitmq-server

以下では、RabbitMQ サーバー サービスがアクティブ (実行中) であることを確認できます。 そして有効 .その結果、サービスはシステムのブート/起動時に自動的に開始されます。

さらに、次のコマンドを使用して、システム上の RabbitMQ のバージョンを確認することもできます。

sudo rabbitmq-diagnostics server_version

インストールされている RabbitMQ のバージョンは 3.8.9 です 、以下に示すように、あなたのものは異なる場合があります.

RabbitMQ クラスターのセットアップ

RabbitMQ をインストールしたら、RabbitMQ クラスターをセットアップします。 RabbitMQ クラスターを使用すると、アプリケーション間のデータの損失や欠落を防ぐことができます。 RabbitMQ クラスターは、すべてのサーバーにわたってレプリケーションと高可用性を提供します。

RabbitMQ は Erlang で記述されたアプリケーションであり、デフォルトで .erlang.cookie を提供します RabbitMQ データ ディレクトリのファイル (/var/lib/rabbitmq) .

RabbitMQ クラスターを作成するには、.erlang.cookie を設定します。 同じ内容の各サーバーのファイルであり、rabbitmq が所有する必要があります。 ユーザーとグループ。

1. node01 サーバーで、次のコマンドを実行して、RabbitMQ データ ディレクトリ (/var/lib/rabbitmq) で使用可能なファイルを確認します。 )。次に、コマンドは .erlang.cookie の内容を出力します ファイル。

# List files and directories on /var/lib/rabbitmq
ls -lah /var/lib/rabbitmq

# Print content of the file .erlang.cookie
cat /var/lib/rabbitmq/.erlang.cookie

出力をコピーします (UXPBSDKHLRMGJSOJVEAN ) をメモに追加します。これは、次の手順でこの出力を node02 および node03 サーバーに追加するためです。 .erlang.cookie. の出力が異なる場合があることに注意してください。 以下に示すものよりもファイル。

2. 次に node02 サーバーに移動し、次のコマンドを stop に実行します rabbitmq サービス。

sudo systemctl stop rabbitmq-server

3. /var/lib/rabbitmq/.erlang.cookie を編集します 好みのテキスト エディターでファイルします。元のコンテンツを手順 1 で書き留めたものに置き換え、変更を保存してエディターを終了します。

# content of .erlang.cookie from node01
UXPBSDKHLRMGJSOJVEAN

4. 次に、以下のコマンドを実行して rabbitmq-server を開始します。 サービス。

sudo systemctl start rabbitmq-server

5. node03 サーバーに切り替え、手順 (2 ~ 4) を繰り返して /var/lib/rabbitmq/.erlang.cookie を編集します。 ファイル。

6. 次の rabbitmqctl を実行します node02 および node03 サーバーでコマンドを実行して、RabbitMQ クラスター (node01) に追加します。

# Stop RabbitMQ application
sudo rabbitmqctl stop_app

# Join the RabbitMQ node01
sudo rabbitmqctl join_cluster [email protected]

# Start the RabbitMQ application again
sudo rabbitmqctl start_app

以下では、node02 サーバーが RabbitMQ クラスター (node01) とクラスター化されていることがわかります。node03 サーバーについても同じことが言えます。

7. 最後に、rabbitmqctl を実行します。 以下のコマンドを実行して、RabbitMQ クラスターのステータスを確認します。これは任意のサーバー (node01、node02、または node03) から実行できます。

sudo rabbitmqctl cluster_status

クラスタ名 ([email protected]) の下の出力で確認できます。 ) および実行中のノード。

RabbitMQ の管理者ユーザーの設定

RabbitMQ クラスターをセットアップしたら、RabbitMQ の新しい管理者ユーザーを作成し、デフォルトのゲスト ユーザーを削除します。 RabbitMQ 管理者ユーザーには、RabbitMQ クラスターで利用可能なエンティティを構成、読み取り、書き込みする権限があります。

1. node01 サーバーに切り替えて、rabbitmqctl を実行します。 以下のコマンドで admin という名前の新しいユーザーを作成します パスワードを AdminPassRabbitMQ に設定 .好みのユーザー名とパスワードを設定できますが、必ず強力なパスワードを設定してください。

sudo rabbitmqctl add_user admin AdminPassRabbitMQ

2. 次に、次のコマンドを実行して (set_user_tags を設定します) ) 新しいユーザー (admin ) administrator として RabbitMQ クラスター用。

sudo rabbitmqctl set_user_tags admin administrator

3. 以下のコマンドを set_permissions に対して実行します。 admin に 以下を持つユーザー:

  • 許可 (-p / ) admin ユーザーは、RabbitMQ クラスター上のすべての vhost にアクセスできます。
  • 最初の ".*" – ユーザーがすべてのエンティティと vhosts のアクセス許可を構成できるようにします。
  • 2 番目の ".*" – すべてのエンティティと仮想ホストに対するユーザーの書き込み権限を有効にします。
  • 3 番目の ".*" – すべてのエンティティと仮想ホストに対するユーザーの読み取り許可を有効にします。
sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

4. 次に、次のコマンドを実行して削除します (delete_user ) デフォルトのユーザー (guest ) RabbitMQ クラスターから。

sudo rabbitmqctl delete_user guest

5. 最後に、以下のコマンドを実行して、使用可能なすべてのユーザーを一覧表示します (list_users ) RabbitMQ クラスター上。

sudo rabbitmqctl list_users

以下には、1 人のユーザー (admin) のみが表示されます。 .他のサーバー (node02 および node03) からのユーザーを確認することもでき、同じ出力が得られます。

RabbitMQ で仮想ホストと新しい管理者ユーザーを作成する

RabbitMQ クラスターをセットアップし、RabbitMQ で管理者ユーザーを作成しました。ここでは、RabbitMQ で仮想ホスト (vhost) とユーザーを作成して、アプリケーションが RabbitMQ に接続できるようにします。

RabbitMQ の仮想ホスト (vhost) の基本的な概念は、Apache の概念や NGINX のサーバー ブロックの概念と似ています。各 vhost には、交換、キュー、バインディング、ユーザー権限、認証などのエンティティがあります。

1. rabbitmqctl を実行します 以下のコマンドで新しい vhost を作成します (add_vhost ) app-qa1 という名前 .

sudo rabbitmqctl add_vhost app-qa1

2. 次に、次のコマンドを実行して新しいユーザーを作成します (add_user ) alice という名前 パスワード AlicePassRabbitMQ で ユーザーを administrator としてタグ付けします .ユーザー名とパスワードはお好みで設定できます。

# create new user alice
sudo rabbitmqctl add_user alice AlicePassRabbitMQ

# set a tag administrator for user alice
sudo rabbitmqctl set_user_tags alice administrator

3. 以下のコマンドを実行して、ユーザー alice に権限を設定します。 仮想ホスト app-qa1 を管理する .これらの権限は、ユーザー alice を許可します 仮想ホスト app-qa1 の下にあるすべてのエンティティの構成、読み取り、および書き込み .

# set up permission for user alice
sudo rabbitmqctl set_permissions alice --vhost app-qa1 ".*" ".*" ".*"

4. 最後に、以下の各コマンドを実行して、利用可能な仮想ホストを一覧表示します (list_vhosts ) RabbitMQ クラスタとアクセス許可 (list_user_permissions ) 新しい管理者ユーザー (alice )。

# check available vhosts on RabbitMQ
sudo rabbitmqctl list_vhosts

# check permissions for user alice
sudo rabbitmqctl list_user_permissions alice

RabbitMQ での交換、キュー、バインディングの作成

仮想ホストと管理者ユーザーがセットアップされましたが、アプリケーションが機能するために必要なのはそれだけですか? RabbitMQ で交換、キュー、バインディングなどのエンティティを作成する必要があります。これらのエンティティは、アプリケーションを RabbitMQ で動作させるために必要です。

1. 次の rabbitmqadmin を実行します test_exchange と呼ばれる RabbitMQ で新しい交換を作成するコマンド app-qa1 の下 vhost とユーザー alice . type で交換の種類を指定できます オプション、direct このデモのために。

# Create new exchange test_exchange
sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 declare exchange name=test_exchange type=direct

2. 次に、以下の各コマンドを実行して、RabbitMQ に新しいキューを作成します。このデモでは、デフォルトの classic を作成します (test_classic ) と quorum test_quorum という名前のキュー .

# create quorum queue with option queue_type=quorum
sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 declare queue name=test_quorum durable=true queue_type=quorum

# create default classic queue
sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 declare queue name=test_classic durable=true

3. 以下のコマンドを実行して、両方の test_classic のバインドを作成します。 と test_quorum キュー。各バインディングには異なる routing_key があります ただし、同じ取引所で実行されます (test_exchange )。

# create binding for test_quorum
sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 declare binding source="test_exchange" destination_type="queue" destination="test_quorum" routing_key="test_routing_key_quorum"

# create binding for test_classic
sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 declare binding source="test_exchange" destination_type="queue" destination="test_classic" routing_key="test_routing_key_classic"

4. 次に、次のコマンドを publish に対して実行します。 hello, world test_exchange へのメッセージ .正しい routing_key. を設定してください

# publish message for the test_quorum queue
sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 publish exchange=test_exchange routing_key=test_routing_key_quorum payload="hello world, Quorum Queue"

# publish message for the test_classic queue
sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 publish exchange=test_exchange routing_key=test_routing_key_classic payload="hello world, Classic Queue"

5. 最後に、次のコマンドを get に対して実行します。 hello, world test_quorum からのメッセージ と test_classic キュー。

# retrieve the message from test_quorum queue
sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 get queue=test_quorum

# retrieve the message from test_classic queue
sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 get queue=test_classic

以下に示すように、hello, world を受け取った場合、キューが機能していることがわかります。 test_quorum からのメッセージ と test_classic キュー。

RabbitMQ 管理プラグインの有効化

これまでのところ、コマンドライン環境を介して RabbitMQ で作業することができました。しかし、おそらく、RabbitMQ サーバーおよびクラスターと対話するために GUI を好むでしょう。その場合、RabbitMQ 管理プラグインを有効にする必要があります。

RabbitMQ 管理プラグインは、デフォルト ポート 15672 で実行される Web ベースの管理 UI を提供します。 コマンドライン管理ツール [rabbitmqadmin]

rabbitmq-plugins を実行します 以下のコマンドをすべてのサーバー (node01、node02、および node03) で使用して、rabbitmq_management を有効にします。 プラグイン。このコマンドは、 rabbitmq_management_agent などの他の必要なプラグインを自動的に有効にします と rabbitmq_web_dispatch .

sudo rabbitmq-plugins enable rabbitmq_management

以下は、端末画面に表示される同様の出力です。

次に、Web ブラウザーを開き、サーバーの IP アドレスに続いてポート 15672 に移動します。 (http://172.16.1.20:15672/) を使用して、RabbitMQ Web ベースの管理インターフェイスにアクセスします。ポート 15672 RabbitMQ 管理プラグインを有効にすると、自動的に開かれます。

ユーザー alice で RabbitMQ 管理 UI ログイン ページにログインします。 とパスワード AlicePassRabbitMQ .

RabbitMQ ダッシュボードに、RabbitMQ クラスターで使用可能なすべてのノードが表示されます。

以下では、RabbitMQ クラスター上のすべてのノードが問題なく実行されていることがわかります。

クォーラム キューの高可用性の検証

RabbitMQ クラスター内のノードが実行中であり、キューが機能していることを以前に確認しました。これは素晴らしいことです。しかし、ノードの 1 つがシャットダウンまたは失敗した場合はどうなるでしょうか。 test_quorum キューがサーバー間で高可用性とレプリケーションを提供することを確認してください。

1. RabbitMQ ダッシュボードで、[キュー] をクリックします。 タブをクリックして、RabbitMQ クラスターで使用可能なキューにアクセスします。

以下に、test_classic を示します。 キューと test_quorum 列。

2. 次に、test_classic をクリックします。 詳細情報を取得するためにキューに入れます。

以下に示すように、test_classic キューは [email protected] で実行されています ミラー/レプリケーションなし。ノード [email protected] test_classic がダウンしています キューが使用できなくなります。

3. Queue に戻ります メニューですが、test_quorum をクリックします。 今度は行列。

以下に、test_quorum を示します。 キューは [email protected] で利用できます また、クラスター上の他のノードへのミラーも提供します。このセットアップでは、test_quorum が維持されます node01 がダウンしてもキューは実行されます。

4. 次のコマンドを実行して、node01 をオフ/シャットダウンします。 サーバ。 node01 サーバーがダウンした状態で.

# turnoff node01
sudo poweroff

5. node02 サーバーに移動し、以下のコマンドを実行して RabbitMQ cluster_status を確認します。

# checking RabbitMQ cluster status
sudo rabbitmqctl cluster_status

現在の実行中のノードが表示されます RabbitMQ クラスタの node02 は と node03 .

6. 次に、次のコマンドを実行して、test_classic から「hello world」メッセージを取得します。 列。このコマンドは、test_classic に 5 つのリクエストを送信します。 Bash ループを使用してキューに入れます。

# setup temporary environment variable CLASSIC
export CLASSIC="sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 get queue=test_classic"

# retrieve message from `test_classic` queue 5 times using bash loop
for i in {1..5}; do $CLASSIC; done

見つかりませんというメッセージが表示されます node01 サーバーがダウンしているため、次のように出力されます。

7. 最後に、次のコマンドを実行して、test_quorum から「hello world」メッセージを取得します。 列。

test_classic キューのテストと同様に、このコマンドは test_quorum に対して 5 つのリクエストを行います。 キューですが、今回は node01 でも「hello world」メッセージが表示されます ダウンしています。なんで? test_quorum キューは node02 または node03 サーバーに自動的に複製/ミラーリングされます。

# setup temporary environment variable QUORUM
export QUORUM="sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 get queue=test_quorum"

# retrieve message from `test_quorum` queue 5 times using bash loop
for i in {1..5}; do $QUORUM; done

結論

このチュートリアルは、Debian/Ubuntu Linux システムで RabbitMQ クラスターをセットアップするプロセスを支援することを目的としています。また、RabbitMQ サーバーの基本的な管理と、RabbitMQ で高可用性をサポートするキューを作成する方法も学びました。

この時点で、完全な RabbitMQ クラスターをセットアップしました。次は何ですか?おそらく、RabbitMQ をアプリケーションに実装する方法を学ぶでしょうか?


Linux
  1. Linux – Linuxでプロセスのプロセッサ親和性を設定するにはどうすればよいですか?

  2. UbuntuでMySQLクラスターを設定する方法

  3. Linux pthreads でスレッドの名前を設定するには?

  1. Ubuntu /DebianLAMPサーバーをセットアップする方法

  2. Ubuntu、Linux Mint、DebianでIpv6を無効にする方法

  3. Linux で優先ネットワーク インターフェイスを設定する方法

  1. Ubuntu /DebianLinuxでモジュールをブラックリストに登録する方法

  2. Linuxでタイムゾーンを設定または変更する方法

  3. LinuxでCからIPアドレスを設定する方法