私の理解する限りでは、すべてのLinuxプロセスは実際にはファイルですが、実行中のプロセスをあるマシンから別のマシンにコピーすることは可能ですか?
たとえば、サーバーを再起動せずに、実行中のTomcatサーバーをあるマシンから別のマシンにコピーする
私の理解の及ぶ限り、すべてのLinuxプロセスは実際にはファイルです
比喩を文字通りに受け取らないでください。 Linuxプロセスは、デバッグ、監視、分析のために疑似ファイルシステムを介してアクセスできますが、プロセスはこれらのファイルだけではなく、ソースホスト/proc
ファイルシステムからターゲット/proc
に「コピー」するだけではありませんファイルシステムは運命です。
実行中のプロセスをマシン間でコピーすることはできますか?
ホスト間で実行中のプロセスを移動する重大な問題の1つは、このプロセスが使用しているオープンファイル記述子を処理する方法です。プロセスがファイルの読み取りまたは書き込みを行っている場合、このまさにそのファイル(または正確なクローン)がターゲットホストで利用可能である必要があります。ソケットに関連するファイル記述子は、それらがバインドされているIPアドレスが1つのホストから別のホストに変更される可能性が高いため、処理が難しいでしょう。他のプロセスとメモリセグメントを共有するプロセスは、移行後にそれを停止します。 PIDのクラッシュも発生する可能性があります。実行中のプロセスが受信したものと同じpidを持っている場合、そのうちの1つを変更する必要があります。親子関係は失われ、私は潜在的な問題をひっかいただけです。
これらの問題にもかかわらず、「 Application checkpointing 」と呼ばれる機能を提供する技術的なソリューションがあり、 [〜#〜] dmtcp [〜#〜] および [〜#〜] criu [〜#〜] 。これは、VMWare、VirtualBox、Oracle VMなどのハイパーバイザーが仮想マシン ライブマイグレーション / teleportationを実行するときに使用するものと同様です。 。仮想マシンでは、ファイル記述子、ファイルシステム、メモリ、ネットワーク、その他のデバイスなど、OS全体が移動されるため、ジョブは実際には「より単純」です。
いいえ、プロセス(つまり、実行中のプログラム)をあるUnixマシンから別のUNIXマシンに移動することはできません。
Webサービス、データベースサービス、ルーターなどの一部のサービスは、フェイルオーバーやロードバランシングなどの冗長オプションを提供します。つまり、複数のマシンで実行されているサービスのコピーがいくつかあり、1つがダウンした場合、別のマシンが引き継ぐか、サービスを提供する負荷を共有し、データベース/状態を複製して最新の状態に保つことができます。
これらの種類のサービスは、あるマシンから別のマシンに「移動」しますが、サービスを提供しているプロセスは移動しません。
これは特定のサービスの機能であり、Unixの機能ではありません。
詳細は ServerFaultフォーラム をご覧ください。
はい、可能です。 MOSIX( http://www.mosix.org )は、Linuxマシン間の移行を処理します(@jlliagreの回答のWikipediaのリンクに記載されています)。オープンソースであり、カーネルパッチは必要ありません。これはHPCアプリケーション用であり、おそらく望んでいるものではありませんが、後世のために言及したいと思いました。
いいえ、現時点では不可能です。プロセスがサービスを受けるとき。その後、サービス間のサービス転送が可能になります。ただし、これにはOSレベルの変更が必要です。