web-dev-qa-db-ja.com

サーバーのIPが変更されても、既存のTCP(http / mysqlなど)への接続は実行されたままになります

PHP-FPMサーバーがいくつかあり、データベース接続が必要な場合は、HAProxyサーバーに接続して、使用するデータベースサーバーを選択すると、接続が開きます。次に、HAProxyサーバーでメンテナンス(HAProxyの再起動が必要な構成の変更など)を実行する場合のプロセスは次のとおりです。

  1. HAProxyサーバーでKeepalivedをシャットダウンします
  2. フローティングIPがバックアップHAProxyサーバー(Keepalivedも実行中)に転送されるのを待ちます
  3. HAProxy統計が1つの接続のみを報告するまで待ちます(接続の数を確認します)
  4. HAProxyを再起動します
  5. キープアライブを再起動します

ステップ2が発生すると、その時点で開いているmysql接続はどうなりますか? this TCP Sessions and IP Changes question 接続が切断されます。これは本当ですか?もしそうなら、防ぐために何ができるでしょうか?これは起こっていますか?接続は、サーバーのメイン(非フローティング)IPを使用するように何らかの方法で強制できますか?

また、Keepalivedが実行されている2つのNginxサーバーを使用した同様のセットアップがあり、同等のプロセスを実行することを計画していました。その場合、同じ質問が当てはまります。IPが他のサーバーに移動すると、既存のhttp接続はどうなりますか?

私はあなたの助けに感謝します。

3
Luke Cousins

それらは切断されます。 TCP IPアドレスを変更するためのプロトコル部分がないため、クライアントはIPアドレスが魔法のように変更されたことを認識できません。新しい接続を確立する必要があります。

5
TomTom

TCP接続に使用するIPアドレスは、接続が確立されたときにクライアントによって選択されます。接続前にソケットを特定のIPにバインドすることにより、アプリケーション層によって選択できます。または、アプリケーション層が選択を行わなかった場合はカーネルによって。

カーネルによる選択は、いくつかの異なる方法で制御できます。静的IPアドレスとフローティングIPアドレスの両方を持つホストは、発信接続に静的IPアドレスを使用するように構成する必要があります。 IPを着信接続にのみ使用し、発信接続には使用しない場合は、ダミーインターフェイスに割り当てることができます。

デフォルトでは、カーネルによって選択されたIPアドレスは、TCP SYNパケットが送信されるインターフェイスに割り当てられたものです。IPv6を使用している場合は、よりきめ細かい制御が可能です。ここにいくつかあります。 Linuxで使用できるコマンドの例:

/sbin/ip -6 addr change 2001:db8::234 dev eth0 preferred_lft 1
/sbin/ip -6 addr change 2001:db8::1 dev eth0 preferred_lft 0

上記のコマンドのペアは、2001:db8::234を介して送信されるSYNパケットにeth0を使用します。

1
kasperd