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/cloud
sã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/cloud
montada em /mnt/cloud_cache
, que usa outro caminho, /var/cache/cloud
como local de armazenamento em cache.
Se agora eu ler /mnt/cloud_cache/file
, quero que aconteça o seguinte:
Verifique se file
está armazenado em cache em /var/cache/cloud/file
.
- Se armazenado
file
em 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/file
para/var/cache/cloud/file
e servi-lo a partir do cache.
Quando escrevo para /mnt/cloud_cache/file
, quero que isso aconteça:
- Escreva
/var/cache/cloud/file
e grave em um diário quefile
precise ser gravado de volta para/mnt/cloud
- Aguarde até
/var/cache/cloud/file
que a gravação seja concluída e / ou as gravações anteriores/mnt/cloud
sejam concluídas - Copiar
/var/cache/cloud/file
para/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/cloud
por 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
nfs
ouafs
nã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