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.
- 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. - 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:
- Écrire
/var/cache/cloud/fileet enregistrer dans un journal quifiledoit être réécrit/mnt/cloud - Attendez que l'écriture
/var/cache/cloud/filesoit terminée et / ou que les écritures précédentes/mnt/cloudsoient terminées - 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
nfsouafset 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