Comment mettre en cache de manière transparente n'importe quel répertoire ou système de fichiers monté pour les lectures et les réécritures?

22

Supposons que je monte du stockage cloud (Amazon Cloud Drive dans mon cas) avec un client FUSE à l'adresse /mnt/cloud. Mais parce que la lecture et l'écriture de fichiers directement /mnt/cloudest lente car elle doit passer par Internet, je veux mettre en cache les fichiers que je lis et que j'écris sur le stockage cloud. Étant donné que j'écris peut-être beaucoup de données à la fois, le cache doit rester sur mon disque et non dans la RAM. Mais je ne veux pas répliquer l'intégralité du stockage cloud sur mon disque, car mon disque est peut-être trop petit.

Je veux donc avoir une vue en cache dans /mnt/cloudmonté sur /mnt/cloud_cache, qui utilise un autre chemin, par exemple /var/cache/cloudcomme emplacement de mise en cache.

Si je lis maintenant /mnt/cloud_cache/file, je veux que ce qui suit se produise:

Vérifiez si fileest mis en cache à /var/cache/cloud/file.

  1. Si mis en cache: filel'archivage du cache est à jour en récupérant modtime et / ou la somme de contrôle /mnt/cloud. S'il est à jour, servez le fichier du cache, sinon passez à 2.
  2. S'il n'est pas mis en cache ou que le cache est obsolète: copiez-le /mnt/cloud/filedans /var/cache/cloud/filele cache et diffusez-le.

Lorsque j'écris à /mnt/cloud_cache/file, je veux que cela se produise:

  1. Écrire /var/cache/cloud/fileet enregistrer dans un journal qui filedoit être réécrit/mnt/cloud
  2. Attendez que l'écriture /var/cache/cloud/filesoit terminée et / ou que les écritures précédentes /mnt/cloudsoient terminées
  3. Copier /var/cache/cloud/filevers/mnt/cloud

J'ai les exigences et contraintes suivantes:

  • Libre et open source
  • Possibilité de définir le cache un emplacement de cache arbitraire
  • Possibilité de mettre en cache un emplacement arbitraire (probablement un point de montage FUSE)
  • Mise en cache transparente, c'est-à-dire que l'utilisation /mnt/cloud_cacheest transparente pour le mécanisme de mise en cache et fonctionne comme tout autre système de fichiers monté
  • Conserver un enregistrement de ce qui doit être réécrit (le cache peut obtenir beaucoup de données qui doivent être réécrites à l'emplacement de stockage d'origine au cours des jours)
  • Suppression automatique des fichiers mis en cache qui ont été réécrits ou qui n'ont pas été consultés depuis un certain temps
  • La cohérence (c.-à-d. Refléter les changements externes à /mnt/cloud) n'est pas très importante, car je n'aurai probablement qu'un seul client accédant /mnt/cloudà la fois, mais ce serait bien d'avoir.

J'ai passé pas mal de temps à chercher des solutions existantes, mais je n'ai rien trouvé de satisfaisant.

  • FS-Cache et CacheFS ( https://www.kernel.org/doc/Documentation/filesystems/caching/fscache.txt ) semble fonctionner uniquement avec des systèmes de fichiers nfsou afset je ne sais pas comment le faire mettre en cache un autre fichier FUSE système ou tout répertoire général.
  • bcache ( https://bcache.evilpiepirate.org/ ) semble fonctionner uniquement avec des périphériques de bloc, c'est-à-dire qu'il ne peut pas mettre en cache un autre système de fichiers FUSE
  • gcsfuse ( https://github.com/GoogleCloudPlatform/gcsfuse ) Je pense que cela fait exactement ce que je veux, mais il est intégré à Google Cloud Storage. Pour le faire fonctionner en général, je devrais le pirater et changer tous les accès à GCS en accès aux fichiers locaux dans le point de montage donné ou les accès à Amazon Cloud Drive
Flecto
la source
2
Curieux de savoir si vous avez déjà trouvé une solution? La recherche d'une couche de cache similaire avec des exigences similaires est la vôtre.
SS44
1
bitbucket.org/nikratio/s3ql fait à peu près ce que je veux. Cependant, malheureusement, il ne joue pas trop bien avec Amazon Cloud Drive en particulier (principalement la faute d'ACD par manque d'un bon client Linux)
Flecto
J'ai utilisé s3ql dans le passé moi-même, mais avoir migré vers ACD pour mes fichiers semblait limiter son utilisation avec ce fournisseur. A rencontré des problèmes de cohérence des données avec s3ql lorsque les collectes de données> 2 To. RClone semble prometteur mais il manque cette pièce vitale de mise en cache.
SS44
Si cela vous intéresse sérieusement - nous pouvons l'écrire en C ++, en utilisant tmpfs et stat.
GOST

Réponses:

3

Essayez d'utiliser catfs , un système de fichiers générique de mise en cache de fusibles sur lequel je travaille actuellement.

khc
la source
1
D'après ce que je vois jusqu'à présent, cela fonctionne comme un charme. Merci beaucoup!
Alfe
2

Il est possible d'utiliser FS-Cache / CacheFS pour mettre en cache un système monté sur fusible, en ajoutant une indirection NFS entre: Si votre support de fusible est activé / fusefs, alors partagez-le sur nfs en écrivant ceci dans / etc / exportfs:

/fusefs localhost(fsid=0)

Vous pouvez maintenant le faire:

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

et / nfs offrira un accès en cache à / fusefs.

J'utilise cette approche avec sshfs en tant que FS arrière, cela fonctionne bien.

(Malheureusement, cela accélère uniquement l'accès au contenu du fichier; les métadonnées du fichier ne sont donc pas mises en cache statet opensont donc encore lentes).

Erik Carstensen
la source