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


22

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

したがって、キャッシュされたビューをに/mnt/cloudマウントし/mnt/cloud_cache/var/cache/cloudキャッシュ位置として別のパスを使用します。

今読ん/mnt/cloud_cache/fileでいるなら、私は次のことをしたいです

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

  1. キャッシュされている場合:filemodtimeおよび/またはチェックサムをから取得することにより、チェックインキャッシュは最新/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)はそれほど重要ではありません。おそらく/mnt/cloud、一度に1つのクライアントにしかアクセスできませんが、持っているとよいでしょう。

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

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

2
解決策を見つけたことがありますか?独自の要件を備えた同様のキャッシュレイヤーを探します。
SS44

1
bitbucket.org/nikratio/s3qlは、私が望むものをほとんど実行します。ただし、残念ながら、特にAmazon Cloud Driveでうまく再生されません(主に、優れたLinuxクライアントの欠如によるACDの障害)
Flecto

私は過去にs3qlを使用しましたが、私のファイルのためにACDに移行したため、そのプロバイダーでの使用が制限されているように見えました。データ収集が2 TBを超えると、s3qlでデータの一貫性に関する問題が発生しました。RCloneは有望であるように見えますが、その重要なキャッシングピースが欠落しています。
SS44

あなたがそれに真剣に興味を持っているなら-tmpfsとstatを使ってC ++で書くことができます。
GOST

回答:


3

現在作業中の汎用ヒューズキャッシングファイルシステムであるcatfsを使用してみてください。


1
私が今まで見ているものから、それは魅力のように機能します。どうもありがとう!
アルフェ

2

FS-Cache / CacheFSを使用して、NFSインダイレクションを間に追加することにより、ヒューズマウントシステムをキャッシュできます。ヒューズマウントが/ fusefsにある場合は、/ etc / exportfsにこれを書き込むことでnfsで共有します。

/fusefs localhost(fsid=0)

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

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

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

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

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.