web-dev-qa-db-ja.com

RabbitMQのHAProxy構成

RabbitMQにメッセージを送信するAPIがあります。

HAProxyの背後に高可用性RabbitMQクラスターがあります。

APIをロードテストすると、次のような多くの問題が発生し始めます。

Recovering from a network failure... Exception in the reader loop: AMQ::Protocol::EmptyResponseError: Empty response received from the server.

私のユニコーンログ。

私がhaproxy経由で提起されたものとしてRabbitMQに直接接続する場合、私はしません。私がどこで間違っているのか、私のプロキシ設定は次のようになります:

global
  log 127.0.0.1   local0
  log 127.0.0.1   local1 notice
  #log loghost    local0 info
  maxconn 4096
  #debug
  #quiet
  user haproxy
  group haproxy

defaults
  log     global
  mode    http
  retries 3
  timeout client 50s
  timeout connect 10s
  timeout server 50s
  option dontlognull
  option forwardfor
  option httplog
  option redispatch
  balance  roundrobin

# Set up application listeners here.

listen http_frontend
  bind *:80
  mode http
  default_backend http_backend
  option httpclose
  reqadd X-Forwarded-Proto:\ http

listen https_frontend
  bind *:443 ssl crt /etc/haproxy.pem
  mode http
  default_backend http_backend
  reqadd X-Forwarded-Proto:\ https

listen http_bucky_frontend
  bind *:1880
  mode http
  default_backend http_bucky_backend
  option httpclose
  reqadd X-Forwarded-Proto:\ http

listen https_bucky_frontend
  bind *:1443 ssl crt /etc/haproxy.pem
  mode http
  default_backend http_bucky_backend
  reqadd X-Forwarded-Proto:\ https

listen rabbitmq_frontend
  bind *:5672
  mode tcp
  default_backend rabbitmq_backend
  option tcplog

listen admin
  bind 127.0.0.1:22002
  mode http
  stats uri /


backend http_backend
  mode http
  server 0-http_backend x.x.x.x:9000 maxconn 100 check
  server 1-http_backend x.x.x.x:9000 maxconn 100 check

backend http_bucky_backend
  mode http
  option httpchk GET /status
  http-check expect string up
  server 0-http_bucky_backend x.x.x.x:9000 maxconn 100 check
  server 1-http_bucky_backend x.x.x.x:9000 maxconn 100 check

backend rabbitmq_backend
  balance roundrobin
  mode tcp
  server 0-rabbitmq_backend x.x.x.x:5672 maxconn 4000 check
  server 1-rabbitmq_backend x.x.x.x:5672 maxconn 4000 check

負荷がかかっている場合、ロードバランサーは通常20〜30%cpu

3
msaspence

Nerijusは正解です。この問題はHAProxyにクライアントタイムアウトがあるために発生します。つまり、接続がXミリ秒を超えてアイドル状態であると見なされると、接続がドロップされます。

TCPはキープアライブパケットを送信して、アイドル接続を開いたままにする必要があります。

次のコマンドを使用して、キープアライブパケットのTCPパラメータを確認できます。

$ cat /proc/sys/net/ipv4/tcp_keepalive_time

デフォルトでは、この構成は7200秒です。つまり、TCPは、接続が2時間以上アイドル状態になった後でのみ、キープアライブパケットの送信を開始します。

したがって、HAProxyクライアントのタイムアウト値を2時間を超える値に更新するだけです。例:

timeout client 3h

そして、clitcpkaオプションをバックエンドに追加します。

backend rabbitmq_backend
  balance roundrobin
  mode tcp
  option          clitcpka
  server 0-rabbitmq_backend x.x.x.x:5672 maxconn 4000 check
  server 1-rabbitmq_backend x.x.x.x:5672 maxconn 4000 check
8
Tony

デフォルトのセクションからtimeout client 50sを削除し、rabbitmq_frontend以外のすべてのセクションに移動します。クライアントのタイムアウトとは、TCP rabbitmqクライアントとhaproxyの間のセッションを閉じるため、このソケットからの読み取りが ""になることを意味します。