web-dev-qa-db-ja.com

`ln`はNFSでアトミックで信頼性がありますか?このユースケースでは、NFSがGFSを置き換えることができますか?

すべてのノードが同時にアクセスするGFSグローバルファイルシステムを含む共有ディスクを備えた多数のサーバーを備えたクラスターがあります。

クラスタ内の各ノードは同じプログラムを実行します(シェルスクリプトがメインコアです)。システムは、いくつかの入力ディレクトリに表示されるファイルを処理し、次のように機能します。

  • プログラムは入力ディレクトリをループします。
  • 見つかったファイルごとに、「ロックファイル」の存在を確認します。ロックファイルが存在する場合は、次のファイルにスキップします。
  • ロックファイルが見つからない場合は、ロックファイルを作成します。ロックファイルの作成に失敗した(レースが失われた)場合は、次のファイルにスキップします
  • 「私たち」がロックを所有している場合は、ファイルを処理し、終了時に邪魔にならない場所に移動します。

これはすべて非常にうまく機能しますが、より安価な(それほど複雑ではない)ソリューションも機能するのではないかと思います。 NFSまたはSMB)を考えています。

私がGFSを使用する理由は2つあります。

  1. 各ファイルは1か所にのみ保存されます(もちろん、冗長な基盤となるハードウェア上に)
  2. ファイルロックは確実に機能します

次のようにロックファイルを作成します。

date '+%s:'${unid} > ${currlock}.${unid}
ln ${currlock}.${unid} ${currlock}
lockrc=$?
rm -f ${currlock}.${unid}

どこ $unidは一意のセッション識別子であり、$currlock/gfs/tmp/lock.${file_to_process}

lnの美しさは、それがatomicであるため、同じことを同時に試行するものを除いてすべて失敗することです。

だから、私が求めているのは、NFSが私のニーズを満たすのかということだと思います。 lnは、NFSでもGFSでも同じように確実に機能しますか?

6
MattBianco

NFSクライアントでのlink()システムコールは、NFS LINK操作に直接マップする必要があります。これは、サーバーがlink()システムコールを使用して実装する必要があります。 link()がサーバー上でアトミックである限り、クライアント上でもアトミックになります。

3
Barmar