10 RabbitMQクラスタ構築
20995 ワード
3.RabbitMQクラスタ構築
要旨:実際の生産応用ではメッセージキューのクラスタ方式を採用しているが、RabbitMQを選択した場合、そのクラスタ方式の原理を理解する必要がある
一般に、RabbitMQを学習したり、ビジネスエンジニアリングの正確性を検証したりするために、ローカル環境またはテスト環境でその単一インスタンス配置を使用すればよいが、MQミドルウェア自体の信頼性、同時性、スループット、メッセージ蓄積能力などの問題を考慮すると、生産環境ではRabbitMQを使用するクラスタスキームが一般的に考慮される.
3.1クラスタスキームの原理
RabbitMQというメッセージキューミドルウェア製品自体はErlangに基づいて作成されており、Erlang言語は生まれながらにして分散特性を備えている(Erlangクラスタの各ノードのmagicクッキーを同期することによって実現される).そのため、RabbitMQは天然にClusteringをサポートしています.これにより、RabbitMQ自体は、ActiveMQ、KafkaのようにZooKeeperによってHAスキームおよび保存クラスタのメタデータをそれぞれ実現する必要がなくなる.クラスタは信頼性を保証する方法であり、メッセージのスループット能力を増加させる目的で水平に拡張することができる.
3.2シングルマシンマルチインスタンスの導入
いくつかの要因の制限のため、時には1台の機械でrabbitmqクラスタを構築しなければなりません.これはzookeeperの単機版に似ています.実際の生成環境は、マルチマシンクラスタに割り当てられます.マルチマシンクラスタの構成方法については、他の資料を参照してください.ここでは、単一マシンで複数のrabbitmqインスタンスを構成する方法について主に説明します.
主に公式文書を参照:https://www.rabbitmq.com/clustering.html
まずRabbitMQ運転に問題がないことを確認する
rabbitmqサービスの停止
最初のノードを起動します.
2番目のノードを起動します.
Web管理プラグインのポート占有量です.そのため、Webプラグインが占有するポート番号も指定します.
終了コマンド:
rabbit 1操作はプライマリノードとして使用されます.
rabbit 2は、スレーブノードとして動作します.
クラスタのステータスを表示するには、次の手順に従います.
Webモニタリング:
[外部チェーン画像の転送に失敗した場合、ソース局は盗難防止チェーンメカニズムがある可能性があり、画像を保存して直接アップロードすることを提案する(img-YAab 7 FVM-178324069414)(/img/1566065096459.png)]
3.3クラスタ管理
rabbitmqctl join_cluster{cluster_node}[–ram]は、指定したクラスタにノードを追加します.このコマンドを実行する前にRabbitMQアプリケーションを停止し、ノードをリセットする必要があります.
rabbitmqctl cluster_statusはクラスタの状態を表示します.
rabbitmqctl change_cluster_node_type{disc|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}キューqueue同期ミラーの操作をキャンセルします.
rabbitmqctl set_cluster_name{name}クラスタ名を設定します.クラスタ名は、クライアント接続時にクライアントに通知されます.FederationやShovelプラグインもクラスタ名の場所に役立ちます.クラスタ名のデフォルトは、クラスタ内の最初のノードの名前です.このコマンドで再設定できます.
3.4 RabbitMQミラークラスタ構成
RabbitMQのデフォルトのクラスタ・モードはすでに完了していますが、スイッチ、バインドはクラスタ内のいずれかのノードにコピーできますが、キューの内容はコピーされません.このモードでは、プロジェクトグループノードの圧力が解決されますが、キューノードのダウンタイムによってキューが適用されず、再起動を待つしかありません.そのため、キューノードのダウンタイムや障害が正常に適用されるようにするには、クラスタ内の各ノードにキューの内容をコピーし、ミラーキューを作成する必要があります.
ミラーキューは通常のクラスタモードに基づいているので、ポリシーを追加します.ミラーキューを設定するには、通常のクラスタを構成してから、上のクラスタで続行します.
設定されたミラーキューは、開いているWebページの管理側Admin->Policiesまたはコマンドで実行できます.
rabbitmqctl set_policy my_ha “^” ‘{“ha-mode”:“all”}’
[外部チェーン画像の転送に失敗し、ソース局に盗難防止チェーンメカニズムがある可能性があり、画像を保存して直接アップロードすることを提案する(img-FmmBQjbR-1578324069415)(/img/1566072300852.png)] Name:ポリシー名 Pattern:すべてのキューに一致する場合、一致するルールは^. Definition:ha-modeモードのallを使用します.つまり、一致するすべてのキューを同期します.疑問符リンクヘルプドキュメント.
3.5負荷等化-AProxy
HAProxyは、高可用性、負荷分散、TCPおよびHTTPアプリケーションベースのエージェントを提供し、仮想ホストをサポートします.Twitter、Reddit、StackOverflow、GitHubを含む多くの有名なインターネット会社が使用している無料で、迅速で信頼性の高いソリューションです.HAProxyは、非常に大きな同時接続数をサポートするイベント駆動、単一プロセスモデルを実現します.
3.5.1 HAProxyのインストール
3.5.2 HAProxyの構成
プロファイルパス:/etc/haproxy/haproxy.cfg
HAproxy負荷の起動
HAproxy負荷の起動
コードでmqクラスタアドレスにアクセスするとhaproxyアドレスにアクセスする:567
要旨:実際の生産応用ではメッセージキューのクラスタ方式を採用しているが、RabbitMQを選択した場合、そのクラスタ方式の原理を理解する必要がある
一般に、RabbitMQを学習したり、ビジネスエンジニアリングの正確性を検証したりするために、ローカル環境またはテスト環境でその単一インスタンス配置を使用すればよいが、MQミドルウェア自体の信頼性、同時性、スループット、メッセージ蓄積能力などの問題を考慮すると、生産環境ではRabbitMQを使用するクラスタスキームが一般的に考慮される.
3.1クラスタスキームの原理
RabbitMQというメッセージキューミドルウェア製品自体はErlangに基づいて作成されており、Erlang言語は生まれながらにして分散特性を備えている(Erlangクラスタの各ノードのmagicクッキーを同期することによって実現される).そのため、RabbitMQは天然にClusteringをサポートしています.これにより、RabbitMQ自体は、ActiveMQ、KafkaのようにZooKeeperによってHAスキームおよび保存クラスタのメタデータをそれぞれ実現する必要がなくなる.クラスタは信頼性を保証する方法であり、メッセージのスループット能力を増加させる目的で水平に拡張することができる.
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]
"},
{
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
rabbit 1操作はプライマリノードとして使用されます.
[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 ~]#
rabbit 2は、スレーブノードとして動作します.
[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,<>},
{partitions,[]},
{alarms,[{rabbit2@super,[]},{rabbit1@super,[]}]}]
Webモニタリング:
[外部チェーン画像の転送に失敗した場合、ソース局は盗難防止チェーンメカニズムがある可能性があり、画像を保存して直接アップロードすることを提案する(img-YAab 7 FVM-178324069414)(/img/1566065096459.png)]
3.3クラスタ管理
rabbitmqctl join_cluster{cluster_node}[–ram]は、指定したクラスタにノードを追加します.このコマンドを実行する前にRabbitMQアプリケーションを停止し、ノードをリセットする必要があります.
rabbitmqctl cluster_statusはクラスタの状態を表示します.
rabbitmqctl change_cluster_node_type{disc|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}キューqueue同期ミラーの操作をキャンセルします.
rabbitmqctl set_cluster_name{name}クラスタ名を設定します.クラスタ名は、クライアント接続時にクライアントに通知されます.FederationやShovelプラグインもクラスタ名の場所に役立ちます.クラスタ名のデフォルトは、クラスタ内の最初のノードの名前です.このコマンドで再設定できます.
3.4 RabbitMQミラークラスタ構成
RabbitMQのデフォルトのクラスタ・モードはすでに完了していますが、スイッチ、バインドはクラスタ内のいずれかのノードにコピーできますが、キューの内容はコピーされません.このモードでは、プロジェクトグループノードの圧力が解決されますが、キューノードのダウンタイムによってキューが適用されず、再起動を待つしかありません.そのため、キューノードのダウンタイムや障害が正常に適用されるようにするには、クラスタ内の各ノードにキューの内容をコピーし、ミラーキューを作成する必要があります.
ミラーキューは通常のクラスタモードに基づいているので、ポリシーを追加します.ミラーキューを設定するには、通常のクラスタを構成してから、上のクラスタで続行します.
設定されたミラーキューは、開いているWebページの管理側Admin->Policiesまたはコマンドで実行できます.
rabbitmqctl set_policy my_ha “^” ‘{“ha-mode”:“all”}’
[外部チェーン画像の転送に失敗し、ソース局に盗難防止チェーンメカニズムがある可能性があり、画像を保存して直接アップロードすることを提案する(img-FmmBQjbR-1578324069415)(/img/1566072300852.png)]
3.5負荷等化-AProxy
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
6.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アドレスにアクセスする:567