web-dev-qa-db-ja.com

HAProxyは長寿命を閉じますTCP接続を無視してTCPキープアライブ

TCPモード2サーバーが5672ポートでAMQPプロトコル(WSO2メッセージブローカー)を公開する)でバランスを取るようにHAProxy(1.5.4ですが、1.5.14も試しました)を構成しました。クライアントは作成して使用しますHAProxyを介したAMQPサーバーへの永続的な接続。

クライアントとサーバーを変更しましたTCPキープアライブタイムアウト、net.ipv4.tcp_keepalive_time = 120(CentOS 7)を設定します。

HAProxyで、タイムアウトクライアント/サーバーを200秒(キープアライブパケットの> 120秒)に設定し、オプションclitcpkaを使用しました。

次に、wiresharkを起動し、すべてのtcpトラフィックをスニッフィングしました。クライアントからの最後の要求の後、tcpキープアライブパケットは120秒後に定期的に送信されますが、クライアントからの最後の要求から200秒後に接続が閉じられます(したがって、無視されます)。キープアライブパケット)。

構成の下:

haproxy.conf

global
    log 127.0.0.1   local3
    maxconn 4096
    user haproxy
    group haproxy
    daemon
    debug

listen messagebroker_balancer 172.19.19.91:5672
    mode tcp
    log global
    retries 3
    timeout connect 5000ms
    option redispatch
    timeout client 200000ms
    timeout server 200000ms
    option tcplog
    option clitcpka 
    balance leastconn
    server s1 172.19.19.79:5672 check inter 5s rise 2 fall 3
    server s2 172.19.19.80:5672 check inter 5s rise 2 fall 3
7
Paolo Parlato

TCPキープアライブはトランスポート層にあり、接続で一部のトラフィックを実行するためにのみ使用されるため、中間パケットフィルターなどのシステムは状態を失うことはなく、エンドシステムは接続が反対側が壊れました(何かがクラッシュしたか、ネットワークケーブルが壊れたためかもしれません)。

TCPキープアライブは、明示的に200秒に設定したアプリケーションレベルのアイドルタイムアウトとは何の関係もありません。

timeout client 200000ms
timeout server 200000ms

このタイムアウトは、接続がアイドル状態の場合、つまりデータが転送されない場合にトリガーされます。 TCPキープアライブはデータを転送しません。これらのパケットのペイロードは空です。

11
Steffen Ullrich

timeout clientは、レスポンシブクライアントOSでデッドクライアントアプリケーションを検出します。接続を占有しているが、あなたに話しかけないアプリケーションはいつでも持つことができます。接続の数が無限ではないため、これは悪いことです(maxconn)。

同様に、バックエンドにtimeout serverを設定します。

これらのオプションは、haproxyがアプリケーションと通信するためのものでした。現在、OSがOSと通信する完全に別個のチェックがあります(アプリやhaproxyに触れることなく):

option clitcpkaまたはoption srvtcpkaまたはoption tcpkaを使用すると、haproxyがアクティブにチェックしていなくても、OSが非アクティブな接続を検出して強制終了できるようになります。これには主にOS設定が必要です(Linux)。

110秒間データが送信されなかった場合は、すぐに最初のキープアライブ(KA)を送信しますが、まだ接続を切断しないでください。

 sysctl net.ipv4.tcp_keepalive_time=110

この接続でKAが有効になったら、各KAの後で30秒待ちます。

 sysctl net.ipv4.tcp_keepalive_intvl=30

3つのKAが確認応答されないようにしてから、TCP接続:

 sysctl net.ipv4.tcp_keepalive_probes=3

この状況では、OSはパケットの受信が停止してから200秒後に接続を切断します。

3
kubanczyk