ActiveMQ学習ノート(9)-Broker Cluster


1メッシュクラスタの紹介
1.1特徴
ActiveMQ Brokerのグループは、接続ネットワーククラスタ、ノードクラスタ、または網状クラスタと呼ばれるBrokerネットワーク、すなわちBroker Clusterを構成することができる.メッシュクラスタには、Static DiscoveryクラスタとDynamic Discoveryクラスタの2種類があります.この文書では、2つのクラスタの構成方法についても後述します.
メッシュクラスタには、次のような特徴があります.
クライアント接続のBrokerノードが無効になり、他のBrokerノードに自動的に接続できます.
Brokerは、クラスタ内の他のBrokerノードを発見することができる.
メッセージは、複数のBroker間でルーティングすることができる.
あるBroker上の消費者が切り、まだ消費されていないメッセージは他のBroker(生存している消費者)にルーティングされます.
Brokerは、分散されたキューとトピックをサポートします.
これらの特徴は、それぞれfailover、Discovery of Brokers、Networks of Brokersに関連している.
1.2 failover
Client接続上のいくつかのBrokerのうちの1つは、接続されたBrokerが無効になった場合、Clientはfailoverメカニズムを介して他のBrokerに自動的に接続されます.
前述の学習ノートでも述べたように、Clientはfailoverメカニズムを使用し、Clientプログラミング時にfailover URLを設定するだけでよい.例は以下の通りである.
String url = "failover:(tcp://localhost:61616,tcp://localhost:61626)?randomize=false";
ConnectionFactory contectionFactory = new ActiveMQConnectionFactory(user, password, url);

ActiveMQのfailoverメカニズムについては、
http://activemq.apache.org/failover-transport-reference.html
1.3 Discovery of brokers
Discovery of Brokersは、Static DiscoveryとDynamic Discoveryの2つに分けられ、1つのBrokerノードにネットワークにどのBrokerノードがあるかを知らせることを目的としています.
Static Discovery,静的発見とは,書き込み済みのURLリストを用いて他の接続可能なBrokerノードを発見することである.この発見メカニズムの接続を採用すると、成功するまですべてのURLを試します.(これは公式サイトの鬼話の翻訳ですhttp://activemq.apache.org/static-transport-reference.html )
一般的に言えば、静的発見はすべてのBrokerノードのURLをactivemqに書き込んだ.xmlでは、URLの例を以下に示します.
    static:(tcp://localhost:61616,tcp://remotehost:61617?trace=false)
Dynamic Discovery,動的発見,Brokerインスタンスを構成する際,他のすべてのインスタンスのURLアドレスを知る必要はなく,マルチキャスト(multicast)方式で他のノードを動的に発見する.そのURLの例は以下の通りです.
    discoveryUri="multicast://default"
動的検出の詳細については、http://activemq.apache.org/discovery-transport-reference.html .
1.4 Networks of Brokers
ネットワークに複数のBrokerと複数のClientがある場合、1つのBrokerノードはconsumers(消費者)ではなくproducers(生産者)のみである可能性が高い.独立したノードは、他のノード上の消費者を理解していない.すなわち、あるノードに消費者がいない場合、このノード上のメッセージは処理が得られないために蓄積される可能性がある.
現在のソリューションはNetworks of Brokers(ノードネットワーク)を採用しています.分散されたキューとトピックをサポートします.1つのノードは、ローカルのクライアント接続からでもリモートノードからでも、関連するメッセージを各サブスクリプションにコピーします.リモートノードは、このメッセージのコピーを取得すると、内部のローカル接続に順次送信されます.
2 Static Discoveryクラスタ
2.1 AMQの配備
仮定D:MQapache-activemqob_staticディレクトリの下にamqインスタンスが2つあります
D:\MQ\apache-activemqob_static\amq1
D:\MQ\apache-activemqob_static\amq2
2.2 activemqを構成する.xml
amq 1の場合
<!—  brokerName-->
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="static-broker1" 
               dataDirectory="${activemq.data}">

<transportConnectors>
  <!-     openwire,    61616 -->
  <transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/>
</transportConnectors>

amq 2について
<!—  brokerName-->
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="static-broker2" 
               dataDirectory="${activemq.data}">

<!—      ,      。duplex=true,      ,amq1    -->
<networkConnectors>
  <networkConnector uri="static:(tcp://localhost:61616)" duplex="true"/>
</networkConnectors>

<transportConnectors>
  <!-     openwire,  61618 -->
  <transportConnector name="openwire" uri="tcp://0.0.0.0:61618"/>
</transportConnectors>

同じマシンに2つのノードを配置し、ポートの衝突を防ぐためにjetty.xmlの8161ポートは8162に変更されました.
2.3起動
まずamq 1を起動し、amq 2を起動し、コンソールを観察します.
amq 2出力情報
Establishing network connection from vm://static-broker2?async=false&network=true 
to tcp://localhost:61616

amq 1出力情報
Network connection between vm://static-broker1#4 and 
tcp:///127.0.0.1:51578@61616 (static-broker2) has been established.

3 Dynamic Discoveryクラスタ
3.1 AMQの配備
仮定D:MQapache-activemqob_dynamicディレクトリの下に2つのamqインスタンスがあります
D:\MQ\apache-activemqob_dynamic\amq1
D:\MQ\apache-activemqob_dynamic\amq2
3.2 activemqを構成する.xml
amq 1の場合
<!—  brokerName-->
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="dynamic-broker1" 
               dataDirectory="${activemq.data}">

<!—broker           ,      -->
<networkConnectors>
  <networkConnector uri="multicast://default"/>
</networkConnectors>

<transportConnectors>
  <!-     openwire,    61616 ,   discoveryUri -->
  <transportConnector name="openwire" uri="tcp://0.0.0.0:61616" 
                      discoveryUri="multicast://default" />
</transportConnectors>

amq 2について
<!—  brokerName-->
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="dynamic-broker2" 
               dataDirectory="${activemq.data}">
<!—broker           ,      -->
<networkConnectors>
  <networkConnector uri="multicast://default"/>
</networkConnectors>

<transportConnectors>
  <!-     openwire,  61618,  discoveryUri -->
  <transportConnector name="openwire" uri="tcp://0.0.0.0:61618" 
                      discoveryUri="multicast://default" />
</transportConnectors>

同じマシンに2つのノードを配置し、ポートの衝突を防ぐためにjetty.xmlの8161ポートは8162に変更されました.
3.3起動
まずamq 1を起動し、amq 2を起動し、コンソールを観察します.
AMQ 1出力情報
Network connection between vm://dynamic-broker1#2 and 
tcp://guohj-pc/192.168.56.1:61618@49858 (dynamic-broker2)has been established.

AMQ 2出力情報
Network connection between vm://dynamic-broker2#0 and 
tcp://guohj-pc/192.168.56.1:61616@49899 (dynamic-broker1)has been established.

4プログラム検証
プログラムを書いて検証します.Clientの生産者はbroker 1(amq 1)に「hello,world!」を送信し、消費者はbroker 2(amq 2)に接続し、「hello,world!」に表示されます.
生産者接続URL(61616,amq 1)とキュー名
String url = "failover:tcp://localhost:61616";
String subject = "TOOL.DEFAULT";//      

消費者接続URL(61618,amq 2)とキュー名
String url = "failover:tcp://localhost:61618";
String subject = "TOOL.DEFAULT";//      

5 Network Connector
5.1属性紹介
パラメータ名
デフォルト
説明
name
bridge
ネットワークコネクタの名前です.同じ2つのノード間に複数のネットワークコネクタがある場合は、ネットワークコネクタごとに異なる名前を使用します.
dynamicOnly
false
動的転送のみ、trueの場合、メッセージはノードに接続された消費者がアクティブな場合にのみ転送されます.
decreaseNetworkConsumerPriority
false
(ネットワークジャンプ時に)キュー消費者に配布される優先度を低下させるかどうかは、実際には消費者優先度の制御である.
networkTTL
1
ノードネットワークにおいて、メッセージまたはサブスクライバが越えることができるノードの数.
conduitSubscriptions
true
カテーテルサブスクリプションを開くかどうか、ノードネットワークで複数の消費者サブスクリプション(同じノード上)が同じターゲットであり、同じ消費者として扱われるかどうか.
excludedDestinations

メッセージ転送を行わないターゲットのリストを除外します.
dynamicallyIncludedDestinations

ダイナミックには、メッセージ転送が可能なリストが含まれます.空の場合、すべてのターゲットが転送できることを意味します.
staticallyIncludedDestinations

静的はリストを含み、このリストのターゲットは、ターゲットに消費者がいなくてもメッセージを転送することができる.
duplex
false
デュプレクスの有無、trueの場合、ネットワーク接続は、生産者と消費者の間で双方向にメッセージを伝達することができる.このパラメータはhub-spokeモード、特にhubがファイアウォールによって保護されている場合に特に役立ちます.
5.2パイプ購読-conduitSubscriptions
         
2つのbrokersがbrokerAとbrokerBの場合、forwarding bridgeで接続されます.3つのConsumerがあり、同じQueueを購読し、そのうち1つはbrokerAに接続され、2つはbrokerBに接続されています.
conduitSubscriptions=trueの場合、brokerAのconsumerは15のメッセージを得、15のメッセージはbrokerBに送信されます.この場合、brokeraはbrokerB上の2つのconsumersを1つと見なすため、負荷が等しくありません.
conduitSubscriptions=falseの場合、各consumerには10件のメッセージが受信されます.
5.3デュプレクス-duplex
前述した静的ネットワーク接続クラスタの構成ではduplexが用いられている.NetworkConnectorは、メッセージを転送する必要がある場合、デフォルトでは一方向接続です.broker 2でduplex=trueを構成すると、双方向接続になります.すなわち、broker 2からbroker 1へのネットワーク接続が構成され、broker 1からbroker 2へのネットワーク接続も構成されている.
2つのbroker間で2つ以上の双方向ネットワーク接続を確立し、スループットを増加させるか、トピック/キューパーティションに対して、異なるnameを使用するように指定するだけでよい.
6まとめ
6.1構成例
ActiveMQのexamplesディレクトリには静的クラスタと動的クラスタの構成例があり、2つのBrokeインスタンスを直接起動できます.cmdウィンドウでディレクトリD:MQapache-activemqapache-activemq-5.10.1binに入ります.
動的クラスタを起動し、次のコマンドを実行します.
activemq-admin start xbean:../examples/conf/activemq-dynamic-network-broker1.xml
activemq-admin start xbean:../examples/conf/activemq-dynamic-network-broker2.xml

静的クラスタを起動し、次のコマンドを実行します.
activemq-admin start xbean:../examples/conf/activemq-static-network-broker1.xml
activemq-admin start xbean:../examples/conf/activemq-static-network-broker2.xml

6.2メリットとデメリット
メリット:
メッセージ・ルーティングとロード・バランシングをサポートします.
欠点:
単一の障害が発生し、Brokerが無効になった場合、データが失われる可能性があります.
メッセージの信頼性と負荷分散を同時にサポートするためには、Broker Cluster+Master Slaveモードの組み合わせを採用することができる.