0

私は飼育係、Apache キュレーターの初心者で、プログラムを設計するためにあなたの助けが必要です:

1 時間ごとにスクリプトを実行する Java プログラムを作成する必要があります (エンド ユーザーが提供する cron 式に基づいて)。
サーバーが 3 台あるとします。サーバーがダウンした場合でも、スクリプトが 1 時間ごとに失敗することなく実行されるようにする必要があります (この場合、スクリプトは他のサーバーで実行する必要があります)。1 時間ごとのスクリプトは、1 つのサーバーでのみ実行されます。
このJavaプログラムに入力を提供するためのインターフェースを作成する必要があります。
入力は、(i) 実行するスクリプト、および (ii) スクリプトをスケジュールする Cron 式です。

1)これを達成するためにプログラムをどのように設計できるかを提案してください。Zookeeper、Apache curator を同じように使用できる方法。
2) エンドユーザーが実行するために提供するこれら 3 つのサーバーにスクリプトをキャッシュする方法はありますか?

これら 3 つのサーバーでスクリプトをキャッシュするために、Apache キュレーターの NodeCache を使用できますか? あなたの応答は非常に高く評価されます。

4

2 に答える 2

0

これはインタビューの質問ですよね?はいの場合、この回答は途中でしか得られないことに注意してください。

最も簡単な解決策は、3 つのサーバーをすべて実行し、ロックを取得して処理を実行することです。http://zookeeper.apache.org/doc/trunk/recipes.html#sc_recipes_Locksを参照してください。

1 つのサーバーだけがジョブを実行するようにするには、最後の実行時間を記録する必要があります。これは単純に「既知のキーを使用して値を格納する」ことであり、イントロ チュートリアルの 1 つに記載されています。

もちろん、これインタビューの質問である場合、インタビュアーは「スクリプトが途中で失敗したらどうなりますか?」などの追加の質問をします。または「コンピューターの時間が同じでない場合はどうなりますか?」ZooKeeper では、これらの問題を (簡単に) 解決することはできません。

于 2014-12-04T14:51:56.430 に答える
0

3 台のサーバーがある場合、1 台は何があっても実行する必要があるため、分散型のアプローチが必要です。問題は、障害が発生した場合に、スクリプトを実行するかどうかというパズルを解くことができない可能性があることです。

まず、1 台のコンピューターを他のコンピューターに接続し、実行しないように指示することができます。これは「ホールドダウン」アプローチと呼ばれます。ただし、他のコンピューターに接続できない場合、多くの問題があります。問題は、ほとんどの初心者プログラマーが、ネットワーク環境によってプログラムの設計方法がどのように変化するかを本当に理解していないことです。少し時間をとって、分散コンピューティングの典型的な誤謬を読んでください。

Chron は、他のコンピューターで何が起こるかを気にしないことでこれを解決します。そのため、cron は間違った設計目標を持っています。

3 台のコンピューターを使用すると、独自の速度と時間を持つ 3 つの異なるクロックも使用できます。優れた分散ソリューションには、各マシンのクロックに直接依存しない時間の概念があります。

分散ソリューションは (障害や障害を許容する場合)、他のマシンとの信頼できる通信なしで実行できなければなりません。場合によっては、グループが半分に分割され、マシンの 1 つのグループが他のグループと通信できなくなることがあります。多くの場合、どちらのグループも、もう一方のグループが実行しなかったことを恐れて、「重要な」アクションを実行します。それ以外の場合は、他のグループが実行したと仮定して、両方のグループが「重大な」アクションを実行しない可能性があります。優れたソリューションは、コンピュータが通信できない場合でも、「クリティカル アクション」が 1 回実行されることを保証します。多くの場合、これは「過半数」によって行われます。関連するマシンの少なくとも過半数にアクセスできない場合、グループ (定足数) は重要なアクションを実行できません。

問題を理解するには Paxos アルゴリズムを見てください。そして、問題をより認識したら、選択したテクノロジを振り返り、「分散コンピューティングの誤謬」を考慮して、問題のどの部分を解決しようとしているのかを判断します。また、完璧で 100% 正しい解決策は不可能かもしれないことも理解しておいてください。なぜなら、スクリプトを実行するために事前に選択されたマシンがネットワーク障害を被る可能性があり、その後、稼働中のマシンがネットワークの停止のみを想定するような方法で、電源障害が連続して発生する可能性があるためです。

于 2014-12-04T14:01:40.063 に答える