読み取りと書き戻しのために、ディレクトリまたはマウントされたファイル システムを透過的にキャッシュするにはどうすればよいですか?

読み取りと書き戻しのために、ディレクトリまたはマウントされたファイル システムを透過的にキャッシュするにはどうすればよいですか?

たとえば、FUSE クライアントを使用して、クラウド ストレージ (私の場合は Amazon Cloud Drive) を にマウントするとします/mnt/cloud。ただし、ファイルを直接読み書きすると、/mnt/cloudインターネットを経由する必要があるため速度が遅くなるため、クラウド ストレージから読み書きするファイルをキャッシュする必要があります。一度に大量のデータを書き込む可能性があるため、キャッシュは RAM ではなくディスク上に配置する必要があります。ただし、ディスクが小さすぎる可能性があるため、クラウド ストレージ全体をディスクに複製することは避けます。

そこで、別のパス (たとえばキャッシュ場所)を使用する に/mnt/cloudマウントされたキャッシュ ビューを用意したいと思います。/mnt/cloud_cache/var/cache/cloud

今 と読む場合/mnt/cloud_cache/file、次のことが起こることを望みます。

fileが にキャッシュされているかどうかを確認します/var/cache/cloud/file

  1. キャッシュされている場合:fileから変更時刻やチェックサムを取得して、キャッシュが最新であることを確認します/mnt/cloud。最新の場合は、キャッシュからファイルを提供し、そうでない場合は 2 に進みます。
  2. キャッシュされていないか、キャッシュが古い場合:キャッシュ/mnt/cloud/fileにコピーして/var/cache/cloud/fileキャッシュから提供します。

に書き込むとき/mnt/cloud_cache/file、次のようになることを望みます:

  1. 書き戻す必要がある/var/cache/cloud/file日記に書き込み、記録するfile/mnt/cloud
  2. /var/cache/cloud/fileへの書き込みが完了するか、または以前の書き戻しが/mnt/cloud完了するまで待機します。
  3. コピー/var/cache/cloud/file/mnt/cloud

以下の要件と制約があります。

  • 無料でオープンソース
  • 任意のキャッシュ場所を設定する機能
  • 任意の場所(おそらくFUSEマウントポイント)をキャッシュする機能
  • 透過的なキャッシュ、つまり使用は/mnt/cloud_cacheキャッシュメカニズムに対して透過的であり、他のマウントされたファイルシステムと同様に機能します。
  • 書き戻す必要があるものの記録を保持する (キャッシュには、数日にわたって元の保存場所に書き戻す必要がある大量のデータが含まれる場合があります)
  • 書き戻された、またはしばらくアクセスされていないキャッシュファイルの自動削除
  • /mnt/cloudおそらく一度にアクセスするクライアントは 1 つだけなので、一貫性 (つまり、外部の変更を に反映すること) はそれほど重要ではありません/mnt/cloudが、あれば便利です。

既存の解決策を探すのにかなりの時間を費やしましたが、満足のいくものは見つかりませんでした。

  • FS-Cache と CacheFS (https://www.kernel.org/doc/Documentation/filesystems/caching/fscache.txtnfs) は、またはファイル システムでのみ機能するようafsで、別の FUSE ファイル システムまたは一般的なディレクトリをキャッシュする方法がわかりません。
  • bcache (https://bcache.evilpiepirate.org/) はブロックデバイスでのみ動作するようです。つまり、別の FUSE ファイルシステムをキャッシュすることはできません。
  • gcsfuse (https://github.com/GoogleCloudPlatform/gcsfuse) これはまさに私が望んでいることを実現すると思いますが、Google Cloud Storage と統合されています。これを一般的に動作させるには、ハッキングして、GCS へのアクセスを、指定されたマウントポイントのローカルファイルへのアクセスまたは Amazon Cloud Drive へのアクセスに変更する必要があります。

答え1

使ってみる、私が現在取り組んでいる汎用ヒューズ キャッシュ ファイル システムです。

答え2

間に NFS 間接を追加することで、FS-Cache/CacheFS を使用して fuse マウントされたシステムをキャッシュすることができます。fuse マウントが /fusefs にある場合は、/etc/exportfs に次のように記述して、nfs で自分自身と共有します。

/fusefs localhost(fsid=0)

これで次の操作を実行できます:

mount -t nfs -o fsc localhost:/fusefs /nfs systemctl start cachefilesd

/nfs は /fusefs へのキャッシュされたアクセスを提供します。

私は sshfs をバック FS としてこのアプローチを使用していますが、うまく動作します。

(残念ながら、これによってファイル コンテンツへのアクセスが高速化されるだけで、ファイル メタデータはキャッシュされないためstatopen依然として低速です)。

答え3

これは無知な回答です。テストするためのAmazonクラウドディレクトリにアクセスできないからです。しかし、"どうやってするの"精神: セットアップNFS を提供する Amazon クラウド、 それからNFSサーバーにリモートログインするには、cachefilesd

「言うのは簡単だが、実行するのは難しい…」

関連情報