3. RabbitMQ クラスターの構築
要旨: 実際の本番アプリケーションではメッセージキューのクラスタ方式が採用されます.RabbitMQを選択する場合は,そのクラスタ方式の原理を理解する必要があります.
一般的に言えば、RabbitMQ の学習やビジネス エンジニアリングの正しさの検証だけを行う場合は、ローカル環境またはテスト環境で単一インスタンスの展開を使用できますが、信頼性、同時実行性、スループット、およびメッセージ蓄積機能などの問題を考慮する必要があります。 、RabbitMQ クラスター ソリューションは、一般的に運用環境で考慮されます。
3.1 クラスター方式の原理
メッセージ キュー ミドルウェア製品である RabbitMQ は、本質的に分散されている (Erlang クラスター内の各ノードのマジック クッキーを同期することによって実現される) Erlang に基づいて作成されています。したがって、RabbitMQ は当然クラスタリングをサポートします。これにより、RabbitMQ 自体が HA スキームを実装し、ActiveMQ や Kafka のように ZooKeeper を介してクラスターのメタデータを保存する必要がなくなります。クラスタリングは、信頼性を確保する方法であると同時に、水平展開によるメッセージ スループットの向上という目的を達成できます。
[外部リンクの画像の転送に失敗しました。ソース サイトにリーチング防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-KEaBUyen-1670818771338)(pic/1566073768274.png)]
3.2 単一マシンのマルチインスタンス展開
特定の要因により、ときどき 1 台のマシンに rabbitmq クラスターを構築する必要があります。これは、Zookeeper のスタンドアロン バージョンに似ています。実際の運用環境は、マルチマシン クラスターとして構成する必要があります。マルチマシン クラスタの構成方法については、他の資料を参照できますが、ここでは主に、単一のマシンで複数の rabbitmq インスタンスを構成する方法について説明します。
主に公式ドキュメントを参照: https://www.rabbitmq.com/clustering.html
まず、RabbitMQ が問題なく実行されていることを確認します
[root@super ~]# rabbitmqctl status
Status of node rabbit@super ...
[{
pid,10232},
{
running_applications,
[{
rabbitmq_management,"RabbitMQ Management Console","3.6.5"},
{
rabbitmq_web_dispatch,"RabbitMQ Web Dispatcher","3.6.5"},
{
webmachine,"webmachine","1.10.3"},
{
mochiweb,"MochiMedia Web Server","2.13.1"},
{
rabbitmq_management_agent,"RabbitMQ Management Agent","3.6.5"},
{
rabbit,"RabbitMQ","3.6.5"},
{
os_mon,"CPO CXC 138 46","2.4"},
{
syntax_tools,"Syntax tools","1.7"},
{
inets,"INETS CXC 138 49","6.2"},
{
amqp_client,"RabbitMQ AMQP Client","3.6.5"},
{
rabbit_common,[],"3.6.5"},
{
ssl,"Erlang/OTP SSL application","7.3"},
{
public_key,"Public key infrastructure","1.1.1"},
{
asn1,"The Erlang ASN1 compiler version 4.0.2","4.0.2"},
{
ranch,"Socket acceptor pool for TCP protocols.","1.2.1"},
{
mnesia,"MNESIA CXC 138 12","4.13.3"},
{
compiler,"ERTS CXC 138 10","6.0.3"},
{
crypto,"CRYPTO","3.6.3"},
{
xmerl,"XML parser","1.3.10"},
{
sasl,"SASL CXC 138 11","2.7"},
{
stdlib,"ERTS CXC 138 10","2.8"},
{
kernel,"ERTS CXC 138 10","4.2"}]},
{
os,{
unix,linux}},
{
erlang_version,
"Erlang/OTP 18 [erts-7.3] [source] [64-bit] [async-threads:64] [hipe] [kernel-poll:true]\n"},
{
memory,
[{
total,56066752},
{
connection_readers,0},
{
connection_writers,0},
{
connection_channels,0},
{
connection_other,2680},
{
queue_procs,268248},
{
queue_slave_procs,0},
{
plugins,1131936},
{
other_proc,18144280},
{
mnesia,125304},
{
mgmt_db,921312},
{
msg_index,69440},
{
other_ets,1413664},
{
binary,755736},
{
code,27824046},
{
atom,1000601},
{
other_system,4409505}]},
{
alarms,[]},
{
listeners,[{
clustering,25672,"::"},{
amqp,5672,"::"}]},
{
vm_memory_high_watermark,0.4},
{
vm_memory_limit,411294105},
{
disk_free_limit,50000000},
{
disk_free,13270233088},
{
file_descriptors,
[{
total_limit,924},{
total_used,6},{
sockets_limit,829},{
sockets_used,0}]},
{
processes,[{
limit,1048576},{
used,262}]},
{
run_queue,0},
{
uptime,43651},
{
kernel,{
net_ticktime,60}}]
rabbitmq サービスを停止する
[root@super sbin]# service rabbitmq-server stop
Stopping rabbitmq-server: rabbitmq-server.
最初のノードを開始します。
[root@super sbin]# RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit1 rabbitmq-server start
RabbitMQ 3.6.5. Copyright (C) 2007-2016 Pivotal Software, Inc.
## ## Licensed under the MPL. See http://www.rabbitmq.com/
## ##
########## Logs: /var/log/rabbitmq/rabbit1.log
###### ## /var/log/rabbitmq/rabbit1-sasl.log
##########
Starting broker...
completed with 6 plugins.
2 番目のノードを開始します。
Web 管理プラグインのポートが占有されているため、Web プラグインが占有するポート番号も指定する必要があります。
[root@super ~]# RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server start
RabbitMQ 3.6.5. Copyright (C) 2007-2016 Pivotal Software, Inc.
## ## Licensed under the MPL. See http://www.rabbitmq.com/
## ##
########## Logs: /var/log/rabbitmq/rabbit2.log
###### ## /var/log/rabbitmq/rabbit2-sasl.log
##########
Starting broker...
completed with 6 plugins.
終了コマンド:
rabbitmqctl -n rabbit1 stop
rabbitmqctl -n rabbit2 stop
Rabbit1 はマスター ノードとして動作します。
[root@super ~]# rabbitmqctl -n rabbit1 stop_app
Stopping node rabbit1@super ...
[root@super ~]# rabbitmqctl -n rabbit1 reset
Resetting node rabbit1@super ...
[root@super ~]# rabbitmqctl -n rabbit1 start_app
Starting node rabbit1@super ...
[root@super ~]#
rabbit2 はスレーブ ノードとして動作します。
[root@super ~]# rabbitmqctl -n rabbit2 stop_app
Stopping node rabbit2@super ...
[root@super ~]# rabbitmqctl -n rabbit2 reset
Resetting node rabbit2@super ...
[root@super ~]# rabbitmqctl -n rabbit2 join_cluster rabbit1@'super' ###''内是主机名换成自己的
Clustering node rabbit2@super with rabbit1@super ...
[root@super ~]# rabbitmqctl -n rabbit2 start_app
Starting node rabbit2@super ...
クラスターのステータスを表示します。
[root@super ~]# rabbitmqctl cluster_status -n rabbit1
Cluster status of node rabbit1@super ...
[{nodes,[{disc,[rabbit1@super,rabbit2@super]}]},
{running_nodes,[rabbit2@super,rabbit1@super]},
{cluster_name,<<"rabbit1@super">>},
{partitions,[]},
{alarms,[{rabbit2@super,[]},{rabbit1@super,[]}]}]
ウェブ監視:
[外部リンクの画像の転送に失敗しました。ソース サイトにリーチング防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-TGAqrXj2-1670818771339)(pic\1566065096459.png)]
3.3 クラスタ管理
rabbitmqctl join_cluster {cluster_node} [–ram] は、
ノードを指定されたクラスターに参加させます。このコマンドを実行する前に、RabbitMQ アプリケーションを停止し、ノードをリセットする必要があります。
rabbitmqctl cluster_status は、
クラスターのステータスを示します。
rabbitmqctl change_cluster_node_type {dis|ram} は、
クラスター ノードのタイプを変更します。このコマンドを実行する前に、RabbitMQ アプリケーションを停止する必要があります。
rabbitmqctl forget_cluster_node [–offline] は、
クラスターからノードを削除し、オフラインで実行できるようにします。
rabbitmqctl update_cluster_nodes {clusternode}
クラスタでノードアプリケーションを起動する前に、clusternodeノードの最新情報を参照し、対応するクラスタ情報を更新してください。これは join_cluster とは異なり、クラスターに参加しません。ノード A とノード B の両方がクラスター内にある状況を考えます. ノード A がオフラインになると、ノード C はノード B とクラスターを形成し、ノード B はクラスターを離れます. A がウェイクアップすると、ノード B に接続しようとします. 、ただし、ノード B がクラスター内にないため、これは失敗します。
rabbitmqctl cancel_sync_queue [-p vhost] {queue} は、
キュー キュー同期ミラーリングの操作をキャンセルします。
rabbitmqctl set_cluster_name {name} は
クラスター名を設定します。クラスター名は、接続時にクライアントに通知されます。Federation および Shovel プラグインもクラスター名を使用します。クラスタ名はデフォルトでクラスタ内の最初のノードの名前になりますが、これはこのコマンドでリセットできます。
3.4 RabbitMQ ミラー クラスタ構成
以上でRabbitMQのデフォルトクラスタモードは完成しましたが、キューの高可用性は保証されていません.スイッチとバインディングはクラスタ内の任意のノードにコピーできますが、キューの内容はコピーされません. このモードはプロジェクト チームのノードへのプレッシャーを解決しますが、キュー ノードのダウンタイムは直接的にキューを使用できなくし、再起動することしかできません。キューの内容をクラスタにコピーする必要があります。 のノードごとに、ミラー化されたキューを作成する必要があります。
ミラー キューは、通常のクラスター モードに基づいており、いくつかのポリシーが追加されているため、最初に通常のクラスターを構成する必要があり、その後にミラー キューをセットアップすることができます. 上記のクラスターを続行します.
ミラー キューは、開いた Web ページの管理側の [管理者] -> [ポリシー] またはコマンドを使用して設定できます。
rabbitmqctl set_policy my_ha “^” '{“ha-mode”:“all”}'
- 名前: ポリシー名
- パターン: 一致ルール。すべてのキューに一致する場合は ^ です。
- 定義: すべてを ha モード モードで使用します。つまり、一致するすべてのキューを同期します。疑問符は、ヘルプ ドキュメントへのリンクです。
3.5 負荷分散 - HAProxy
HAProxy は、高可用性、負荷分散、および TCP および HTTP アプリケーションに基づくプロキシを提供し、仮想ホストをサポートします. 無料で高速で信頼性の高いソリューションです. Twitter, Reddit, StackOverflow, GitHub など、多くの有名なインターネット企業が使用しています. HAProxy は、非常に多数の同時接続をサポートするイベント駆動型の単一プロセス モデルを実装します。
3.5.1 HAProxy のインストール
//下载依赖包
yum install gcc vim wget
//上传haproxy源码包
//解压
tar -zxvf haproxy-1.6.5.tar.gz -C /usr/local
//进入目录、进行编译、安装
cd /usr/local/haproxy-1.6.5
make TARGET=linux31 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
mkdir /etc/haproxy
//赋权
groupadd -r -g 149 haproxy
useradd -g haproxy -r -s /sbin/nologin -u 149 haproxy
//创建haproxy配置文件
mkdir /etc/haproxy
vim /etc/haproxy/haproxy.cfg
3.5.2 HAProxy の設定
構成ファイルのパス: /etc/haproxy/haproxy.cfg
#logging options
global
log 127.0.0.1 local0 info
maxconn 5120
chroot /usr/local/haproxy
uid 99
gid 99
daemon
quiet
nbproc 20
pidfile /var/run/haproxy.pid
defaults
log global
mode tcp
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5s
clitimeout 60s
srvtimeout 15s
#front-end IP for consumers and producters
listen rabbitmq_cluster
bind 0.0.0.0:5672
mode tcp
#balance url_param userid
#balance url_param session_id check_post 64
#balance hdr(User-Agent)
#balance hdr(host)
#balance hdr(Host) use_domain_only
#balance rdp-cookie
#balance leastconn
#balance source //ip
balance roundrobin
server node1 127.0.0.1:5673 check inter 5000 rise 2 fall 2
server node2 127.0.0.1:5674 check inter 5000 rise 2 fall 2
listen stats
bind 172.16.98.133:8100
mode http
option httplog
stats enable
stats uri /rabbitmq-stats
stats refresh 5s
HAproxy ロードを開始する
/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
//查看haproxy进程状态
ps -ef | grep haproxy
访问如下地址对mq节点进行监控
http://172.16.98.133:8100/rabbitmq-stats
コード内で mq クラスター アドレスにアクセスすると、haproxy アドレス: 5672 にアクセスすることになります。