web-dev-qa-db-ja.com

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

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

そのため、/mnt/cloudにキャッシュされたビューを/mnt/cloud_cacheにマウントして、別のパスを使用します。たとえば、キャッシュ場所として/var/cache/cloudを使用します。

ここで/mnt/cloud_cache/fileを読んだ場合、次のことを実行してください。

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

  1. キャッシュされている場合:/mnt/cloudからmodtimeやチェックサムをフェッチして、キャッシュ内のfileが最新であることを確認します。最新の場合は、キャッシュからファイルを提供します。そうでない場合は、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への外部の変更を反映すること)はそれほど重要ではありません。これは、一度に/mnt/cloudにアクセスするクライアントはおそらく1つだけであるためです。

既存のソリューションを探すのにかなりの時間を費やしましたが、満足できるものは何も見つかりませんでした。

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

私が現在取り組んでいる汎用のFuseキャッシングファイルシステム catfs を使用してみてください。

4
khc

FS-Cache/CacheFSを使用して、Fuseでマウントされたシステムをキャッシュすることができます。その間にNFSインダイレクションを追加することで可能です。

/fusefs localhost(fsid=0)

これでこれを行うことができます:

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

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

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

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

2
Erik Carstensen

これをテストするためのAmazonクラウドディレクトリにアクセスしていないため、これは無知な種類の答えです。しかし "方法" 精神:セットアップ NFSにサービスを提供するAmazonクラウド 、次に cachefilesdを使用してそのNFSサーバーにリモートでログインします

「言うより簡単だ...」

1
agc