3

HAProxy をロードバランサーとして使用したい。haproxy の背後に 2 つの rabbitmq サーバーを配置したいと考えています。両方の rabbitmq サーバーは、EC2 の異なるインスタンス上にあります。このリファレンスに従って HAProxy サーバーを構成しました。私は動作しますが、問題はメッセージがラウンドロビン パターンで公開されないことです。メッセージは 1 つのサーバーでのみ公開されます。私の要件に別の構成はありますか?

/etc/haproxy/haproxy.cfg の私の構成

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

アップデート:

これについていくつかの研究開発を行ったところ、HAProxy が rabbitmq サーバー上の接続でラウンド ロビンであることがわかりました。例: 10 の接続を要求すると、2 つの rabbitmq サーバーを介して 10 の接続をラウンドロビンし、メッセージを公開します。

しかし、問題は、HAProxy サーバーによって管理されるべき接続ではなく、メッセージをラウンドロビンしたいことです。つまり、一度に 1000 メッセージを HAProxy に送信すると、500 メッセージがウサギ サーバー 1 に送信され、500 メッセージがウサギ サーバー 2 に送信されます。私が従わなければならない構成は何ですか?

アップデート:

バランシングで leastconn もテストしましたが、HAProxy の動作は予期しないものでした。その質問をserverfault.comに投稿しました

4

3 に答える 3

5

メッセージは、キューにルーティングされる交換に発行されます。

{"x-ha-policy","all"} でキューを構成していない可能性があります。交換ルーティングが両方のノードで機能しているという事実に基づいて、これはおそらく不足しているすべてです。

注: Rabbit 3.0 より前では、x-ha-policy 引数を使用してキューを宣言すると、ミラーリングされました。rabbit 3.0 では、ポリシー (ha-mode = all) を適用する必要があります。API または API ツール (rabbitmqctl、管理 GUI) を使用してポリシーを設定できます。すなわち

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

于 2012-12-18T20:35:28.780 に答える
2

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

したがって、指定された目標を達成することはできません。ただし、実際の目標がそれらの RabbitMQ インスタンスのコンシューマーに均等にメッセージを配布することである場合は、Karsten が説明するようにクラスタリングを使用するか、フェデレーションを使用できます。

フェデレーションのセットアップ:

まず、フェデレーション プラグインを有効にする必要があります。

rabbitmq-plugins enable rabbitmq_federation
rabbitmq-plugins enable rabbitmq_federation_management

次に、各サーバーについて、RabbitMQ Web UI に管理者としてログオンし、[管理] > [フェデレーション アップストリーム] > [新しいアップストリームを追加] に移動して、他のサーバーをアップストリームとして追加します。

ここで、フェデレーションする各エクスチェンジ/キューのポリシーを定義する必要があります。私はフェデレーションをキューに対してのみ機能させることができたので、最初にそれを試してみます. [管理] > [ポリシー] > [ポリシーの追加/更新] に移動し、フェデレーションするキューを対象とするポリシーを追加します。

于 2014-10-07T16:26:50.893 に答える
0

サーバー定義から「バックアップ」を削除してください。

バックアップ サーバーは、他のサーバーがすべてダウンしたときに使用されるサーバーです。すべてのサーバーbackupを使用せずに指定すると、option allbackups望ましくない結果が生じる可能性があります。

構成の関連部分を次のように変更します。

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
于 2012-05-15T15:26:17.787 に答える