- ファイルが存在することを確認する信頼できる方法はありますか? 上記のシナリオでは、ファイルの lstat は成功を返し、アプリケーションはファイルを移動しようとした後にのみ失敗します。
これが通常の NFS の動作です。
- クライアントのディレクトリの内容をサーバーと手動で同期するにはどうすればよいですか?
NFS は通常の POSIX 準拠のファイル システムのふりをするため、これを手動で行うことは不可能です。
NFS クライアント側のキャッシュの影響を何らかの方法で軽減するために、close()/open() のコードを作成しようとしました。私の場合、他のサーバー上のファイルに書き込まれた情報を読み取る必要がありました。しかし、再開のトリックでさえ、ほとんど効果がありませんでした。また、アプリケーション全体の速度が低下するため、書き込み側に fdatasync() を追加することはできません。
これまでの NFS に関する私の経験では、できることは何もないということです。重要なコード パスでは、ESTALE を返すファイル操作を再試行するように単純にコーディングしました。
- NFS の場合に信頼性の高いファイル管理コードを作成する方法に関する一般的なアドバイスはありますか?
必要に応じて改造してください。ただし、顧客が信頼性を求める場合は、NFS を使用しないでください。
たとえば、私の会社は、顧客が信頼性を求めている場合、適切な分散ファイル システムの使用を宣伝しています (意図的にブランドを省略しています)。当社のコア ソフトウェアは NFS での実行が保証されておらず、そのような構成はサポートされていません。しかし、私たちの場合、データが FS に書き込まれるとすぐに他のすべてのノードでアクセスできるようになるという保証が本当に必要です。
NFS のコヒーレンシは実現できますが、パフォーマンスが犠牲になるため、NFS はほとんど使用できなくなります。(マウント オプションを確認してください。) NFS は、それがサーバー ファイル システムであるという事実を隠すために狂ったようにキャッシュします。すべての操作を一貫させるために、NFS クライアントはローカル キャッシュをバイパスして、小さな操作ごとに NFS サーバーに同期的にアクセスする必要があります。そして、それは決して高速ではありません。
しかし、ここでは Linux について話しているので、ソフトウェアの顧客に、利用可能なクラスター ファイル システムを評価するようアドバイスすることができます。たとえば、RedHat はGFSを正式にサポートするようになりました。CodaFS を使用している人について聞いたことがありますが、確かな情報はありません。