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
TCPキープアライブはトランスポート層にあり、接続で一部のトラフィックを実行するためにのみ使用されるため、中間パケットフィルターなどのシステムは状態を失うことはなく、エンドシステムは接続が反対側が壊れました(何かがクラッシュしたか、ネットワークケーブルが壊れたためかもしれません)。
TCPキープアライブは、明示的に200秒に設定したアプリケーションレベルのアイドルタイムアウトとは何の関係もありません。
timeout client 200000ms timeout server 200000ms
このタイムアウトは、接続がアイドル状態の場合、つまりデータが転送されない場合にトリガーされます。 TCPキープアライブはデータを転送しません。これらのパケットのペイロードは空です。
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秒後に接続を切断します。