Wie kann ich ein Verzeichnis oder ein bereitgestelltes Dateisystem transparent für Lese- und Schreibvorgänge zwischenspeichern?

22

Angenommen, ich mounte einen Cloud-Speicher (in meinem Fall Amazon Cloud Drive) mit einem FUSE-Client unter /mnt/cloud. Da das direkte Lesen und Schreiben von Dateien /mnt/cloudüber das Internet langsam ist, möchte ich die Dateien, aus denen ich lese und die ich schreibe, im Cloud-Speicher zwischenspeichern. Da ich möglicherweise viele Daten gleichzeitig schreibe, sollte sich der Cache auf meiner Festplatte und nicht im RAM befinden. Ich möchte jedoch nicht den gesamten Cloud-Speicher auf meiner Festplatte replizieren, da meine Festplatte möglicherweise zu klein ist.

Ich möchte also eine zwischengespeicherte Ansicht in /mnt/cloudmount at haben /mnt/cloud_cache, die einen anderen Pfad verwendet, /var/cache/cloudbeispielsweise als Caching-Speicherort.

Wenn ich jetzt lese /mnt/cloud_cache/file, soll Folgendes passieren:

Überprüfen Sie, ob fileum zwischengespeichert ist /var/cache/cloud/file.

  1. Wenn zwischengespeichert: Check- filein-Cache ist aktuell, indem Modtime und / oder Checksumme von abgerufen werden /mnt/cloud. Wenn es aktuell ist, servieren Sie die Datei aus dem Cache, andernfalls fahren Sie mit Schritt 2 fort.
  2. Wenn nicht zwischengespeichert oder Cache - out-of-date: Kopieren /mnt/cloud/fileauf /var/cache/cloud/fileund serviert es aus dem Cache.

Wenn ich schreibe, /mnt/cloud_cache/filesoll das passieren:

  1. Schreiben Sie /var/cache/cloud/filein ein Tagebuch, filein das zurückgeschrieben werden muss , und zeichnen Sie es auf/mnt/cloud
  2. Warten Sie, /var/cache/cloud/filebis das Schreiben abgeschlossen ist und / oder vorherige Zurückschreiben /mnt/cloudabgeschlossen ist
  3. Kopieren /var/cache/cloud/filenach/mnt/cloud

Ich habe die folgenden Anforderungen und Einschränkungen:

  • Kostenlos und Open Source
  • Möglichkeit zum Festlegen eines beliebigen Cache-Speicherorts
  • Möglichkeit zum Zwischenspeichern eines beliebigen Speicherorts (wahrscheinlich ein FUSE-Mount-Punkt)
  • Transparentes Caching, dh using, /mnt/cloud_cacheist für den Caching-Mechanismus transparent und funktioniert wie jedes andere gemountete Dateisystem
  • Aufzeichnen, was zurückgeschrieben werden muss (im Cache werden möglicherweise viele Daten abgelegt, die im Laufe der Tage an den ursprünglichen Speicherort zurückgeschrieben werden müssen)
  • Automatisches Löschen von zwischengespeicherten Dateien, die zurückgeschrieben wurden oder auf die seit einiger Zeit nicht mehr zugegriffen wurde
  • Konsistenz (dh das Reflektieren von externen Änderungen an /mnt/cloud) ist nicht besonders wichtig, da wahrscheinlich immer nur ein Client gleichzeitig darauf zugreift /mnt/cloud, aber es wäre schön, wenn dies geschehen würde.

Ich habe einige Zeit damit verbracht, nach vorhandenen Lösungen zu suchen, aber nichts Befriedigendes gefunden.

  • FS-Cache und CacheFS ( https://www.kernel.org/doc/Documentation/filesystems/caching/fscache.txt ) scheinen nur mit nfsoder afsDateisystemen zu funktionieren, und ich weiß nicht, wie ich eine andere FUSE-Datei zwischenspeichern soll System oder ein beliebiges allgemeines Verzeichnis.
  • bcache ( https://bcache.evilpiepirate.org/ ) scheint nur mit Blockgeräten zu funktionieren, dh es konnte kein anderes FUSE-Dateisystem zwischengespeichert werden
  • gcsfuse ( https://github.com/GoogleCloudPlatform/gcsfuse ) Ich denke, das macht genau das, was ich will, aber es ist in Google Cloud Storage integriert. Damit es im Allgemeinen funktioniert, müsste ich es hacken und alle Zugriffe auf GCS in lokale Dateizugriffe auf dem angegebenen Einhängepunkt oder Zugriffe auf Amazon Cloud Drive ändern
Flecto
quelle
2
Neugierig, wenn Sie jemals eine Lösung gefunden haben? Suchen Sie nach einer ähnlichen Cache-Ebene mit ähnlichen Anforderungen wie Ihrer eigenen.
SS44
1
bitbucket.org/nikratio/s3ql macht so ziemlich das, was ich will. Leider funktioniert es nicht besonders gut mit Amazon Cloud Drive (hauptsächlich ACDs Fehler,
weil
Ich habe s3ql in der Vergangenheit selbst verwendet, aber die Migration auf ACD für meine Dateien schien die Verwendung mit diesem Anbieter einzuschränken. Probleme mit der Datenkonsistenz mit s3ql bei Datensammlungen> 2 TB. RClone scheint vielversprechend zu sein, aber es fehlt das wichtige Caching-Teil.
SS44
Wenn Sie ernsthaft daran interessiert sind, können wir es mit tmpfs und stat in C ++ schreiben.
GOST

Antworten:

3

Versuchen Sie es mit catfs , einem allgemeinen Fuse-Caching-Dateisystem, an dem ich gerade arbeite.

khc
quelle
1
Nach dem, was ich bis jetzt sehe, wirkt es wie ein Zauber. Vielen Dank!
Alfe
2

Sie können FS-Cache / CacheFS verwenden, um ein System mit eingebauter Sicherung zwischenzuspeichern, indem Sie eine NFS-Indirektion dazwischen hinzufügen.

/fusefs localhost(fsid=0)

Jetzt können Sie dies tun:

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

und / nfs bieten zwischengespeicherten Zugriff auf / fusefs.

Ich benutze diesen Ansatz mit sshfs als Back-FS, es funktioniert gut.

(Leider beschleunigt dies nur den Zugriff auf Dateiinhalte; die Dateimetadaten werden nicht zwischengespeichert statund opensind immer noch langsam).

Erik Carstensen
quelle