ハンドオーバーする方法TCPリスニングソケット最小限のダウンタイムで?
-
18-09-2019 - |
質問
、任意の言語での一般的なBSDソケット・ソリューションは、あまりにも高く評価されています。の
<時間>いくつかの背景:
私は、アプリケーションがTCPソケットをリッスンしています。それが起動し、定期的なシステムVスタイルのinitスクリプトでシャットダウンされます。
私の問題は、TCPソケットにサービスを提供する準備ができている前に起動するためにいくつかの時間を必要としていることです。それはおそらく、あまりにも長い間、わずか5秒ではありませんが、それはあまりにも長い間、再起動が勤務時間中に実行する必要があるときに5秒です。これは、既存の接続が開いたままにして正常に終了していることも重要です。
アプリケーションの再起動のために理由は、パッチ、アップグレード、等です。私は残念ながら、たまにでは、私は生産でこの種のものを行うために必要な位置に自分自身を見つけます。
<時間>質問:
私は別のプロセスから、TCPリスニングソケットのきちんとしたハンドオーバーを行うための方法を探して、その結果、ダウンタイムの唯一の一瞬を取得しています。新しいプロセスが新しいconnectinosにサービスを提供開始している間、私は、開いたままで、古いプロセスで処理を完了するために、既存の接続/ソケットをたいと思います。
BSD-ソケットを使用してこれを行うためのいくつかの実証済みの方法はありますか? (EventMachine液のボーナスポイント。)
は、私はそのまま使用するか、または参照として使用することができ、おそらくこれを実装そこにオープンソースのライブラリはありますか? の(ここでも、非Rubyと非EventMachineのソリューションがあまりにも高く評価されている!)の
解決
サーバープログラムへの適切な修正を加えて、ダウンタイムなしでこれを行うにはいくつかの方法があります。
一つは、特定の信号または他のメッセージを受信すると、例えば、サーバ自体でリスタート機能を実装することです。その後、プログラムは、例えばそれをリスニングソケットのファイルディスクリプタ番号を渡し、その新しいバージョンをexecします引数として。このソケットはそれほど明確 FD_CLOEXEC
のフラグ(デフォルト)を持っていますそれが継承されること。他のソケットが元のプロセスによってサービスされ続けると、新しいプロセスに渡されるべきではないので、フラグはそれらの例えば上に設定されるべきです fcntl()
に使用。新しいプロセスが今そのソケット上で待機しているので、新しいプロセスをフォークとexecingした後、元のプロセスが先に行くことができ、サービスを中断することなく、リスニングソケットを閉じます。
別の方法、あなたは新しいサーバー自体をforkとexecしなければならないために、古いサーバーを使用しない場合は、<のhref = "http://www.kernel.org/doc/man-を使用することですページ/オンライン/ページ/ man7 / unix.7.html」のrel = 『noreferrer』>古いものと新しいサーバプロセス間で通信するのUnixドメインソケット。それが開始されたときに、新しいサーバ・プロセスは、ファイルシステムではよく知られている場所で、このようなソケットをチェックすることができます。存在する場合、新しいサーバはこのソケットに接続し、補助データとして古いサーバ転送そのリスニングソケットは、SCM_RIGHTSを使用することを要求します。この例は CMSGの端部に与えられます。 (3)の
他のヒント
ジャン=ポール・Calderoneは<のhref = "http://twistedmatrix.com/trac/export/29083/sandbox/exarkun/papers/2004/pycon/migration/migration.html" のrel = "nofollowをnoreferrer" を書きました>ソケットマイグレーションやその他の問題を含むツイストを使用して、問題の総合的なソリューション、上の2004年に発表を詳しく説明ます。