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