読み取りと書き込みの両方のためにディレクトリまたはマウントされたファイルシステムを透過的にキャッシュする方法は?

読み取りと書き込みの両方のためにディレクトリまたはマウントされたファイルシステムを透過的にキャッシュする方法は?

FUSEクライアントを使用していくつかのクラウドストレージ(私の場合はAmazon Cloud Drive)をインストールしたとします/mnt/cloud。しかし、ファイルを直接読み書きするのは/mnt/cloudインターネット経由で行う必要があるため遅いので、読み書きするファイルをクラウドストレージにキャッシュしたいと思います。おそらく一度に大量のデータを書き込むので、キャッシュはRAMではなくディスクに配置する必要があります。しかし、私のディスクが小さすぎるため、クラウドストレージ全体を自分のディスクにコピーしたくありません。

そのため、キャッシュの場所などの他のパスを使用する/mnt/cloudMountedでキャッシュビューを取得したいと思います。/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-キャッシュとCacheFS(https://www.kernel.org/doc/Documentation/filesystems/caching/fscache.txtnfs)は、またはファイルシステムでのみ機能しているようですafs。他のFUSEファイルシステムや通常のディレクトリをキャッシュする方法がわかりません。
  • 隠れ家(https://bcache.evilpiepirate.org/)はブロックデバイスでのみ動作するようです。つまり、他のFUSEファイルシステムはキャッシュできません。
  • GCSFUSE(https://github.com/GoogleCloudPlatform/gcsfuse)これは私が望むものだと思いますが、Google Cloud Storageと統合されています。機能するには、ハッキングしてGCSへのアクセスを指定されたマウントポイントのローカルファイルアクセスまたはAmazon Cloud Driveへのアクセスに変更する必要がありました。

答え1

試してみてください猫男、現在開発中の汎用ヒューズキャッシュファイルシステムです。

答え2

FS-Cache / CacheFSを使用すると、2つの間にNFS間接参照を追加して、ヒューズが取り付けられているシステムをキャッシュできます。ヒューズが/fusefsにマウントされている場合は、/etc/exportfsに以下を作成してnfsで自分と共有します。

/fusefs localhost(fsid=0)

これで、次のことができます。

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

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

私はsshfsをバックエンドFSとして使用してこの方法を使用するのに最適です。

(残念ながら、これはファイルの内容へのアクセス速度だけを向上させるだけです。ファイルメタデータはキャッシュされていないため、statまだopen遅いです。)

答え3

テストに使用したAmazonクラウドディレクトリにアクセスできないため、これは無知の答えです。しかし、「どうすればいいですか?」精神:設定AmazonクラウドサービスNFS、その後Telnet を使用して NFS サーバーにログインcachefilesd

「言葉は簡単だし、実践は難しい…」

関連情報