複数のサーバーでNFSを介してディレクトリをマウントする場合、各サーバーはそのディレクトリから特定のファイルの最初の行を読み取って削除するプロセスを実行し、どの行も2回読み取ることを保証できますか?それとも抽出せずに削除しますか?
明らかに、1つのプロセスだけがNFSマウントファイルで動作することを可能にするいくつかのミューテックスを作成できますが、これを達成するためにこれを構築する方法はありますか?
答え1
複数のサーバーでNFSを介してディレクトリをマウントする場合、各サーバーはそのディレクトリから特定のファイルの最初の行を読み取って削除するプロセスを実行し、どの行も2回読み取ることを保証できますか?それとも抽出せずに削除しますか?
抽出が容易でない場合は、行が削除されないようにすることができます。ただし、削除しないでください。行を「抽出」していない限り、プロセスから行を削除しないでください。
行が一度だけ処理されることを保証できますか?これは本当ではありません。 NFSにはあらゆる種類のタイミングの脆弱性があります。データとメタデータは各クライアントにキャッシュされ、すべてのキャッシュが無効になってもネットワークデータ転送にかなりの時間遅延が発生します。あるサーバーのプロセスは、遅すぎるまで何が起こっているのかを「確認」できません。
しかし、もっと大きな問題を逃しているようです。ファイルの最初の行を削除するには、ファイルの残りの部分全体を再構築する必要があります。このファイルを一種のFIFOとして使用したいと思うので、ファイルの末尾に行を追加する他のプロセスもあるとします。複数のクライアントが最初の行を削除した後にファイル全体を書き換えるとき、このアプローチはどのように効果的だと思いますか?でももしクライアントが正しく同期されるようにするには、同期クラスタに書き込みプロセスを追加する必要があります。
最初の行なしでファイル全体を書き換えるか、ファイルの最後に追加してコンテンツを更新するために完全なロックを必要とするファイルを共有するソフトウェアクラスタを作成する必要があります。
安定して実行できますか?もちろん可能ですが、NFSだけを使用するわけではありません。
ファイルをFIFOとして使用することを検討している場合は、より良いことができます。各行を別々のファイルに入れてから使用してください。rename()
パブリックディレクトリのファイルを同じNFSマウントファイルシステムのクライアント固有のディレクトリに移動します。各クライアントには独自のディレクトリがあり、正常に機能するとrename()
ファイルを正常に「請求」したことがわかり、失敗した場合は他のクライアントがファイルを「要求」したとします。
NFS実装がNFSサーバーをロックしたり、カーネルにパニックを起こしたりせずに1つのクライアントだけが機能して正常にrename()
返されますが、他のすべてのクライアントは、失敗したNFSサーバーでクラッシュする試みを適切に処理できるほど強力であることを願っています。rename()