序文
スタンドアロン展開のみの場合、パフォーマンスには常に上限RabbitMQ
がありますが、例外ではありません。RabbitMQ
メッセージを処理する単一のサービスがボトルネックに達した場合、高可用性と負荷分散クラスターによって実現できます。
RabbitMQクラスターについてどのくらい知っていますか
通常、各クラスターには、クラスター内にノードと呼ばれるサービスRabbitMQ
があり、ノードタイプは次の2つのタイプに分けることができます。
- メモリノード:メタデータはメモリに保存されます。再起動後にデータを同期するために、メモリノードはディスクノードのアドレスをディスクに保存します。さらに、メッセージが持続する場合、メモリノードは読み取りと書き込みが高速であるため、メッセージもディスクに保存されます。および一般顧客エンドはメモリノードに接続します。
- ディスクノード:メタデータはディスクに保存され(デフォルトのノードタイプ)、少なくとも1つのディスクノードを保証する必要があります。そうしないと、一度ダウンするとデータを復元できず、クラスターの高可用性の目的を達成できません。 。
PS:メタデータは、キュー名属性、スイッチタイプ名属性、バインディング情報、vhostなどの基本情報を指します。キュー内のメッセージデータは含まれません。
RabbitMQ
クラスターには、通常のクラスターモードとミラーキューモードの2つの主要なモードがあります。
通常のクラスターモード
通常のクラスターモードでは、クラスター内の各ノードはメタデータを相互に同期するだけです。つまり、メッセージデータは同期されません。したがって、問題は、A
ノードに接続されているB
かどうかということですが、メッセージはノードに保存されており、それをどのように行うのですか?
プロデューサーであるかコンシューマーであるかに関係なく、接続されたノードがキューデータを格納しない場合、ストレージ用のキューデータを格納しているノードに内部的に転送されます。内部で転送することはできますが、メッセージは1つのノードにしか保存されないため、ノードがダウンした場合、メッセージは消えますか?この問題は存在するため、この共通クラスターモードでは高可用性の目的は達成されません。
ミラーキューモード
ミラーキューモードでは、メタデータがノード間で同期されるだけでなく、メッセージコンテンツもミラーノード間で同期され、可用性が高くなります。このソリューションは可用性を向上させますが、同期されたデータ間のネットワークオーバーヘッドももたらし、パフォーマンスにある程度影響します。
RabbitMQクラスターの構築
一緒にRabbitMQ
クラスターを構築してみましょう。
-
スタンドアロンバージョンより前に起動する必要がある場合は、古いデータを
rm -rf /var/lib/rabbitmq/mnesia
削除するか、ディレクトリ内のインストールを削除しますvar/lib/rabbitmq/mnesia
。私のマシンはインストールディレクトリにインストールされ、コマンドが実行されrm -rf /usr/local/rabbitmq_server-3.8.4/var/lib/rabbitmq/mnesia/
ます。 -
次に、次の3つのコマンドを開始して、3つの異なるポート番号の
RabbitMQ
サービスを開始RabbitMQ
する必要があります。また、サービスポートで追加のポートバックオフィスシステムを指定する必要がある場合を指定する必要があります。またnode
、クラスターノードの名前であるため、プレフィックス名を指定する必要があります。は通信するため、ノード名は一意である必要があります。デフォルトのノード名はですrabbit@hostname
。次のコマンドは、プレフィックスが指定されていることを示します。
RABBITMQ_NODE_PORT=5672 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15672}]" RABBITMQ_NODENAME=rabbit1 rabbitmq-server -detached
RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached
RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit3 rabbitmq-server -detached
/usr/local/rabbitmq_server-3.8.4/var/lib/rabbitmq/mnesia/
カタログの入力を開始したら、3
ノード情報の作成を見つけます。
また、ps -ef | grep rabbit
3つのサービスプロセスが開始されていることもわかります。
- 開始された3つのサービスは相互に接続されていません。次に、ノードの1つをマスターノードとして使用し、他の2つのノードをマスターノードに参加させてクラスターサービスを形成する必要があります。クラスターに参加するには、リセットする必要があります。ノード情報、つまりデータのあるノードはクラスターに参加できません。
//rabbit2 节点重置后加入集群
rabbitmqctl -n rabbit2 stop_app
rabbitmqctl -n rabbit2 reset
rabbitmqctl -n rabbit2 join_cluster --ram rabbit1@`hostname -s` //--ram 表示这是一个内存节点
rabbitmqctl -n rabbit2 start_app
rabbitmqctl -n rabbit3 stop_app
rabbitmqctl -n rabbit3 reset
rabbitmqctl -n rabbit3 join_cluster --disc rabbit1@`hostname -s` //--disc表示磁盘节点(默认也是磁盘节点)
rabbitmqctl -n rabbit3 start_app
- 成功した後、コマンド
rabbitmqctl cluster_status
クエリノードrabbit1
ステータスを実行すると、次の図が表示されます。2つのディスクノードがメモリノードです。
- ここで開始されたクラスターは、デフォルトの通常のクラスターにすぎないことに注意してください。ミラーリングされたクラスターを構成する場合は、次のコマンドを実行する必要があります。
rabbitmqctl -n rabbit1 set_policy ha-all "^" '{"ha-mode":"all"}'
ここでRabbitMQ
は、ビルドが完了していてもクラスターですが、これはスタンドアロンバージョンであるため.erlang.cookie
、ファイルの整合性を考慮しないでください。
HAProxy + Keepalivedに基づく高可用性クラスター
RabbitMQ
クラスタの場合、複数のメモリノードがあり、ノードが接続されている場所で行う必要がありますか?この選択戦略をクライアント側で行うと、大きなデメリットがあります。最も深刻なのは、クラスターを拡張するたびにクライアントコードを変更する必要があることです。したがって、この方法はあまり望ましくないため、デプロイしています。クラスター。中間プロキシコンポーネントが必要な場合、このコンポーネントRedis
は、Sentinel
(センチネル)クラスターモードなどのサービスの監視と転送を有効にするために、センチネルRedis
ノードとフェイルオーバーを監視できます。
ではRabbitMQ
、クラスタによってKeepalived
およびHAProxy
部品2の高可用性と負荷分散クラスタを実現しています。
HAProxy
HAProxy
また、負荷分散ソフトウェアとして使用することができ、オープンソースの高性能負荷分散ソフトウェア、であるnginx
、lvs
など レイヤーの負荷分散とレイヤーの負荷分散をHAproxy
サポートします。7
4
負荷分散
以下に示す、モデルの目的のためのいわゆる7
レイヤーロードバランシングと4
レイヤーロードバランシングOSI
は、OSI
通信モデルです。
上の図を見ると、最初の7
層はアプリケーション層に4
対応し、2番目の層はトランスポート層に対応しています。負荷分散ソフトウェアとして一般的に使用されるのは、通常nginx
、第17
層で機能し、lvs
通常は第1層で機能します(Linux Virtual Server)4
。
4
レイヤーロード:
4
レイヤーロードは、NAT
(ネットワークアドレス変換)テクノロジー、つまりネットワークアドレス変換を使用します。クライアント要求を受信するときは、データパッケージのソースIP
とポートを変更してから、対応するターゲットサーバーにパケットを転送します。4
レイヤーロードバランシングは、メッセージ内の宛先アドレスと送信元アドレスに基づいてのみ要求を転送でき、要求されたリソースの特定のタイプを決定または変更することはできません。
7
レイヤーロード:
クライアントから要求されたリソースパスに従って、別のターゲットサーバーに転送されます。
高可用性HAProxy
HAProxy
負荷分散は実現されていますが、1つしか導入されていない場合HAProxy
、ダウンタイムのリスクがあります。一度HAProxy
ダウンし、それは我々がする必要があるので、クラスタ全体が、使用できない原因となりますHAProxy
また、クラスタを実装する場合、HAProxy
また、クラスタを実現し、クライアントがどのサービスに接続する必要がありますか?問題は最初に戻っているようで、無限ループに陥っています...
キープアライブ
HAProxy
高可用性を実現するために、Keepalived
コンポーネントを導入する必要があります。Keepalived
コンポーネントには、主に次の特性があります。
- ロード機能により、クラスター内のノードの状態を監視できます。クラスター内のノードがダウンした場合、フェイルオーバーを実現できます。
- クラスター自体も実現できますが、
master
ノードは1つだけです。 master
外部ノードは仮想IP
アプリケーション側を提供し、これを回線に接続するだけで済みますIP
。クラスタHAProxy
ノードは仮想をめぐって競合することも理解できます。仮想はIP
、どのノードが競合に参加し、ノードがサービスを提供します。
VRRPプロトコル
VRRP
プロトコルは、仮想ルーター冗長プロトコル(仮想ルーター冗長プロトコル)です。Keepalived
仮想IP
メカニズムがに属しているVRRP
場合、フォールトトレラントプロトコルルーターの単一障害点の出現を回避するためです。
総括する
このホワイトペーパーでは、RaabbitMQ
関連するナレッジクラスターについて説明し、通常のクラスターとクラスターミラーの違いを比較し、最後にRabbitMQ
クラスターを構築するための実践を通じて、一般的なクラスターHAProxy
とKeepalived
コンポーネントを組み合わせて真の高可用性分散クラスターサービスを実現できるいくつかの欠点を紹介します。