NFS(2) および fcntl(2) によるクラスタリング

NFS(2) および fcntl(2) によるクラスタリング

Perl 5.x のドキュメントでは、クラスタリング (..) 実装は次の基本呼び出しのいずれかを使用し、使用できない場合は 1 から 3 まで作業することが示されています。

  1. 群れ(2)
  2. FCNTL(2)
  3. ロック(3)

それは問題ではありません。しかし、あなたはNFSでFlock(2)を使用してはならないという免責事項に気づいたでしょう。このドキュメントでは、-Ud_flockフラグを使用してPerlがクラスタリングを使用することをお勧めします(2)。 Flock(2)(Redhatの)マニュアルページには、NFS問題に関する同様の免責事項が記載されています。

私の質問はなぜですか! ! ! NFSでクラスタ(2)が安全でない理由の詳細な記事や説明が見つからないようです。

私はRedhat(flock(2)を使用)とSolaris(fcntl(2)を使用)でCとPerlで複数のテストスクリプトを作成しました。 Perlが実際にfancy(2)とfcntl(2)をそれぞれ使用していることを確認するために、strace / trussを実行しました。ロックが尊重されない問題は再現できません!何を提供しますか? ?

答え1

私はあなたが遺産の問題に​​ついて考えていると確信しています。 Perl5のマニュアルは1994年に発表され、1991年にPerl4のマニュアルを単に編集したことに注意してください。当時、しばしば「悪夢」と呼ばれるファイルシステムは、「クマがどれだけうまく飛び上がるのかということではなく、クマがどれだけうまく飛び上がるかについて」だったと言うこともできます。驚くべきことですが、踊るだけです。」

1991年、NFS2はSunからゆっくりと他のプラットフォームに移行しており、比較的荒れていました。セキュリティモデルは本質的に存在せず(クライアントシステムのルートはNFSマウントの全内容を読み取ることができます)、ロック(nfs.lockdによる)は実験のこの側面です。クラスタリングセマンティクスが2つの異なる相互運用可能な実装間で正しく機能することを期待するのは愚かです。 Coaxは当時の主要なイーサネットPHYであり、多くのネットワークユーザーはそれを使用しながら不快な経験をしたことがありませんでした。

答え2

これは現在廃止されました。 NFS4はロックをサポートします。契約内で(lockdデーモンやRPCコールバックメカニズムは必要ありません。)そしてPerlのflock()アプローチはうまくいきます。私たちはこれを本番環境で使用します。

非常に古いカーネルバージョンflock(システムコール)はNFSでランダムに実装されており、バイト範囲ロックなどの他の機能を正しくサポートしていません。ヒステリーはここから来ています。

答え3

Lennart Poetteringは最近、Linuxファイルシステムのロック動作について深く研究しましたが、NFSロックのために特にバラ色の絵を描いていません(特に彼が投稿の一番下にリンクした後の作業)。

http://0pointer.net/blog/projects/locking.html

答え4

Linux-NFS FAQ から直接インポートした別の記事: nfs.sf.net

複数のクライアントで使用されているファイルをロックするためにクラスタ()/ BSDロックを使用しようとしましたが、ファイルが破損しています。どうですか? A:Flock()/ BSDロックは、2.6.12より前のLinux NFSクライアントでのみデフォルトで機能します。ファイルロックが他のクライアントに表示されるようにするには、fcntl()/ POSIXロックを使用します。

NFSファイルへのアクセスをシリアル化するいくつかの方法は次のとおりです。

fcntl()/POSIX ロック API を使用します。このタイプのロックは、NLMプロトコルまたはNFSv4を介して複数のクライアントにわたってバイト範囲ロックを提供します。別のロックファイルを使用し、それに対するハードリンクを作成します。 creat(2) のマニュアルページの O_EXCL セクションの説明を参照してください。初期の2.6カーネルまでのLinux NFSクライアントでは、O_EXCLの生成がアトミックではなかったことに注目する価値があります。 2.6.5 より高いカーネルを実行しない限り、O_EXCL を使用して複数の NFS クライアント間のアトミック動作を生成し、予期しないでください。

デフォルトでは、Cluster()/ BSDロックを使用するPerlには既知の問題があります。これにより、クラスター/BSD ロックが POSIX ロックのように機能すると予想される他のオペレーティング システム (Solaris など) で移植されたプログラムがクラッシュする可能性があります。

Linuxでは、ハードリンクの代わりにファイルロックを使用すると、サーバーとクライアントキャッシュ間のチェックポイントをさらに取得できるという利点があります。ファイルロックが取得されると、クライアントはそのファイルのページキャッシュをフラッシュして、後続の読み取りがサーバーから新しいデータを取得できるようにします。ファイルのロックが解除されると、そのクライアントのファイルに対するすべての変更はロックが解除される前にサーバーに再フラッシュされるため、ファイルのロックを待っている他のクライアントが変更を確認できます。

2.6.12 の NFS クライアントは、POSIX バイト範囲ロックに基づく BSD スタイルロックをエミュレートし、NFS ファイルのクラスター ()/BSD ロックをサポートします。同じ偽装メカニズムを使用する、または fcntl()/POSIX ロックを使用する他の NFS クライアントには、Linux NFS クライアントに表示されるものと同じロックが表示されます。

デフォルトのLinuxファイルシステムでは、POSIXロックとBSDロックは互いに表示されません。したがって、このエミュレーションにより、Linux NFSサーバー上で実行されているアプリケーションは、クライアントのアプリケーションがBSDスタイルを使用しているかPOSIXを使用しているかにかかわらず、NFSクライアントがロックされたファイルをfcntl()/ POSIXロックでロックしたかのように処理し続けます。スタイルロック。サーバーアプリケーションがFlock()BSDロックを使用している場合、NFSクライアントが使用しているロックは表示されません。

関連情報