Digamos que eu monte algum armazenamento em nuvem (Amazon Cloud Drive no meu caso) com um cliente FUSE em /mnt/cloud. Mas como a leitura e a gravação direta de arquivos /mnt/cloudsão lentas porque precisam passar pela Internet, desejo armazenar em cache os arquivos que estou lendo e gravando no armazenamento em nuvem. Como eu posso estar gravando muitos dados de cada vez, o cache deve estar no meu disco e não na RAM. Mas não quero replicar todo o armazenamento em nuvem no meu disco, porque meu disco pode ser muito pequeno.
Então, eu quero ter uma exibição em cache /mnt/cloudmontada em /mnt/cloud_cache, que usa outro caminho, /var/cache/cloudcomo local de armazenamento em cache.
Se agora eu ler /mnt/cloud_cache/file, quero que aconteça o seguinte:
Verifique se fileestá armazenado em cache em /var/cache/cloud/file.
- Se armazenado
fileem cache : o cache de check- in está atualizado, buscando modtime e / ou soma de verificação de/mnt/cloud. Se estiver atualizado, envie o arquivo do cache, caso contrário, vá para 2. - Se não cache ou cache é out-of-date: Copiar
/mnt/cloud/filepara/var/cache/cloud/filee servi-lo a partir do cache.
Quando escrevo para /mnt/cloud_cache/file, quero que isso aconteça:
- Escreva
/var/cache/cloud/filee grave em um diário quefileprecise ser gravado de volta para/mnt/cloud - Aguarde até
/var/cache/cloud/fileque a gravação seja concluída e / ou as gravações anteriores/mnt/cloudsejam concluídas - Copiar
/var/cache/cloud/filepara/mnt/cloud
Eu tenho os seguintes requisitos e restrições:
- Fonte livre e aberta
- Capacidade de definir o cache em um local arbitrário do cache
- Capacidade de armazenar em cache um local arbitrário (provavelmente algum ponto de montagem do FUSE)
- Armazenamento em cache transparente, ou seja, o uso
/mnt/cloud_cacheé transparente ao mecanismo de armazenamento em cache e funciona como qualquer outro sistema de arquivos montado - Manter um registro do que precisa ser gravado de volta (o cache pode receber muitos dados que precisam ser gravados de volta no local de armazenamento original ao longo dos dias)
- Exclusão automática de arquivos em cache que foram gravados de volta ou que não foram acessados por um tempo
- A consistência (ou seja, refletir mudanças externas no
/mnt/cloud) não é muito importante, pois provavelmente terei apenas um cliente acessando/mnt/cloudpor vez, mas seria bom ter isso.
Passei bastante tempo procurando soluções existentes, mas não encontrei nada satisfatório.
- O FS-Cache e o CacheFS ( https://www.kernel.org/doc/Documentation/filesystems/caching/fscache.txt ) parecem funcionar apenas com sistemas de arquivos
nfsouafsnão sei como fazê-lo armazenar em cache outro arquivo FUSE sistema ou qualquer diretório geral. - O bcache ( https://bcache.evilpiepirate.org/ ) parece funcionar apenas com dispositivos de bloco, ou seja, não foi possível armazenar em cache outro sistema de arquivos FUSE
- gcsfuse ( https://github.com/GoogleCloudPlatform/gcsfuse ) Acho que isso faz exatamente o que eu quero, mas está integrado ao Google Cloud Storage. Para fazê-lo funcionar em geral, eu precisaria hackear e alterar os acessos ao GCS para acessos a arquivos locais no ponto de montagem especificado ou acessos ao Amazon Cloud Drive