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運転に問題がないことを確認する
[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)]
  • Name:ポリシー名
  • Pattern:すべてのキューに一致する場合、一致するルールは^.
  • Definition:ha-modeモードのallを使用します.つまり、一致するすべてのキューを同期します.疑問符リンクヘルプドキュメント.

  • 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