2017-07-15 1 views
0

私は2台のサーバとそのサーバ上で実行したいプログラムを持っています(ではなく、が同時に必要です)。コンピュータ/サーバ間でプログラムの実行を切り替える

1つのサーバーを「SA」と呼び、もう1つを「SB」とします。

SBはSAのバックアップです。私のプログラムがSA上で実行されている間、SAが失敗した場合、プログラムは直ちに中断してSB上で実行を続けます。

私はこれを達成する最も簡単な方法は何ですか?

+0

あなたは共有の場所にデータを永続化する必要があると思います:

この質問は、おそらく再利用可能性例があります。次に、SBがデータベースを監視し、何かが1分(またはあなたの間隔が何であれ)書き込まれていない場合、それはキックオフされ、データベースが何を処理しているか把握するために読むでしょう。 – mrogers

+2

できません。あなたの期待は非現実的です。 2番目のコンピュータでアプリケーションを実行し、最初の状態からロードすることはできますが、互いのコードをシームレスに実行することはできません。 –

答えて

0

おそらく、これを行う方法はたくさんありますが、排他的なファイルロックを使用してそれを実行します。それを実現するには、2つのサーバー間に十分なネットワーク接続が必要で、両方のサーバーが書き込み用にファイルを開くことができます。 (擬似コード)

あなたの基本的なアルゴリズムは、このように書きます:

File f; 
while (true) { 
    myTurn = false 
    try { 
     Open Network file for writing 
     myTurn = true; 
    } catch (IOException e) { 
     // not logging anything because this is expected. 
     // you might log that you tried maybe 
     myTurn = false; 
    } 
    if (myTurn) { 
     Do all of your actual work here. 
     loop many times if that's what you're doing. 
     don't exit this bit until your server wants to shut down 
      (or crashes). 
     But don't close the file 
    } 
} 

は、基本的に何が起こるかは、あなたのアプリケーションが排他的にファイルを開こうとしていることです。

それを開くことができない場合、もう一方のサーバーはロックされているため、このサーバーは静かな状態に保たれます。

ファイルを開くと、他のサーバーは実行されていないため、このサーバーは作業を行う必要があります。

"作業"ルーチンが、がハングしないようにするには、絶対に不可欠です。 - 他のサーバーのプロセスがアクティブである限り、そのネットワークファイルロックにハングします。したがって、他のサーバーが無限ループに入ると、あなたは不運になります。

両方のサーバーが同じネットワークファイルを開こうとしています。彼らがローカルファイルを開こうとしているなら、それは動作しません。 Getting notified when a file lock is released

関連する問題