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/cloud
est 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/cloud
monté sur /mnt/cloud_cache
, qui utilise un autre chemin, par exemple /var/cache/cloud
comme emplacement de mise en cache.
Si je lis maintenant /mnt/cloud_cache/file
, je veux que ce qui suit se produise:
Vérifiez si file
est mis en cache à /var/cache/cloud/file
.
- Si mis en cache:
file
l'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/file
dans/var/cache/cloud/file
le cache et diffusez-le.
Lorsque j'écris à /mnt/cloud_cache/file
, je veux que cela se produise:
- Écrire
/var/cache/cloud/file
et enregistrer dans un journal quifile
doit être réécrit/mnt/cloud
- Attendez que l'écriture
/var/cache/cloud/file
soit terminée et / ou que les écritures précédentes/mnt/cloud
soient terminées - Copier
/var/cache/cloud/file
vers/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_cache
est 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
nfs
ouafs
et 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