2012-05-11 8 views
3

ロードバランサとしてHAProxyを使いたい。私はhaproxyの後ろに2つのrabbitmqサーバを置いておきたい。両方のrabbitmqサーバーはEC2の別のインスタンスにあります。 this referenceに従って、HAProxyサーバーを構成しました。私は動作しますが、問題はメッセージがラウンドロビンパターンで公開されていないことです。メッセージは1台のサーバーでのみ発行されます。私の要件のための構成がありますか?rabbitmqのHAProxyを設定する

/etc/haproxy/haproxy.cfgマイconfigureation

listen rabbitmq 0.0.0.0:5672 
    mode tcp 
    stats enable 
    balance roundrobin 
    option tcplog 
    no option clitcpka 
    no option srvtcpka 
    server rabbit01 46.XX.XX.XX:5672 check 
    server rabbit02 176.XX.XX.XX:5672 check 
listen web-service *:80 
      mode http 
     balance roundrobin 
     option httpchk HEAD/HTTP/1.0 
     option httpclose 
     option forwardfor 
     option httpchk OPTIONS /health_check.html 
     stats enable 
     stats refresh 10s 
     stats hide-version 
     stats scope . 
     stats uri  /lb?stats 
     stats realm LB2\ Statistics 
     stats auth admin:Adm1nn 

アップデート:私はこの上でいくつかのR & Dを作り、HAProxyは、ラウンドロビンでの接続であることを発見した

rabbitmqサーバー。例:もし私が10の接続を要求すると、2つのrabbitmqサーバー上の10の接続をラウンドロビンし、メッセージを公開します。

しかし、問題は私がメッセージをロビンしたいのですが、接続ではなくHAProxyサーバーで管理する必要があります。つまり、一度に1000個のメッセージをHAProxyに送信すると、500個のメッセージは、rabbit server1に、500個のmsgは、rabbit server2に移動する必要があります。私はそれに従わなければならない構成は何でしょうか?

更新:

私はまた、均衡におけるleastconnが、予想外でHAProxy行動をテストしてきました。私はその質問を投稿しましたserverfault.com

+0

メッセージは機能しているが、メッセージは1台のサーバーにのみ公開されていますが、これは正常に動作していないことを示していますか? HAProxyマシンから、両方のサーバーにAMQP接続できますか?彼らは異なるネットワーク上にあることに注意してください.HAProxyが何をしているかを見るために、統計ページのスクリーングラブを投稿できますか?ちなみに、あなたの目標はここですか?おそらくファンアウト交換によってよりよく管理できるものがあれば、HAProxyからRRへのメッセージをさまざまなサーバーに使用します。 –

+0

steve martin。返信ありがとう。私のHAproxyサーバは、両方のRabbitmqサーバに接続できます。私の目標は接続がHAProxyによって管理されるべきことです。たとえば、HAProxyの背後に2つのウサギサーバーがあり、1000個のメッセージを公開している場合、500個のメッセージがウサギに送られ、500個のメッセージが残ります。また、HAProxyサーバーにrabbitmqサーバーを動的に追加すると、HAPはすべてのウサギサーバーに配布する必要があります。現在私が苦しんでいるのは、すべての1000のメッセージがウサギ1に入っていて、両方ではないということです。 –

+0

ああ、ちょうどあなたのHAP設定をもっとよく見てみました。両方のサーバーが「バックアップ」として構成されています。答えに提案を投稿します... –

答えて

5

メッセージがどのキューへのルートがするExchangeに公開ます。

{"x-ha-policy"、 "all"}を使用してキューを構成していない可能性があります。交換ルートが両方のノードで動作しているという事実に基づいて、これはおそらくあなたが欠けているものです。

注:Pre Rabbit 3.0では、x-ha-policy引数を持つキューが宣言され、ミラー化されます。ウサギ3.0では、ポリシーを適用する必要があります(ha-mode = all)。 apiまたはapiツール(rabbitmqctl、management gui)を使用してポリシーを設定できます。すなわち

rabbitmqctl set_policy -p '/' MirrorAllQueues '.+' '{"ha-mode": "all"}'

+1

このような方法でキューを構成する方法を詳しく説明することをお勧めします。 – JoshDM

0

サーバー定義から「バックアップ」を削除します。

バックアップサーバは、他のサーバがすべて停止している場合に使用されるサーバです。 option allbackupsを使用せずにすべてのサーバーをbackupと指定すると、不適切な結果が生じる可能性があります。

変更し、次へのあなたの設定の関連部分:

listen rebbitmq *:5672 
     mode tcp 
     balance roundrobin 
     stats enable 
     option forwardfor 
     option tcpka 
     server web2 46.XX.XX.XXX:5672 check inter 5000 
     server web1 176.XX.XX.XX:5672 check inter 5000 
+0

これは本当に意味があるように 'オプションforwardfor'をオフにしてください –

+0

スティーブマーティンありがとう。試してみた目標を達成することはできません。質問の設定コードを更新しました。 –

+0

HAP統計ページは、あなたのRabbitサーバーとの接続について何と言っていますか? –

2

AMQPプロトコルは、あなたが(常に再接続のオーバーヘッドを回避するために)AMQPメッセージごとに新しい接続を取得することはできませんを意味し、永続接続を使用するように設計されています。つまり、HAProxyなどのロードバランサはメッセージの均衡を保つ効果がありません。接続の均衡をとるだけで役立ちます。

このように、目標を達成することはできません。ただし、実際の目標が人のRabbitMQインスタンスのコンシューマに均等にメッセージを配信する場合は、Karstenの説明に従ってクラスタリングを使用するか、federationを使用できます。

連盟のセットアップ:あなたはフェデレーションプラグインを有効にする必要が

まず:

rabbitmq-plugins enable rabbitmq_federation 
rabbitmq-plugins enable rabbitmq_federation_management 

その後、サーバーごとに管理者としてのRabbitMQのWeb UIにログオンし、管理者に行く>「連盟アップストリーム ">"新しいアップストリームを追加 "をクリックし、他のサーバーをアップストリームとして追加します。

これで、フェデレーションするExchange /キューごとにポリシーを定義する必要があります。私はフェデレーションを待ち行列のために働かせることしかできませんでしたので、まずそれを試してみましょう。管理> [ポリシー]> [ポリシーの追加/更新]に移動して、フェデレーションするキューを対象とするポリシーを追加します。

関連する問題