
Digamos que eu monte algum armazenamento em nuvem (Amazon Cloud Drive no meu caso) com um cliente FUSE em /mnt/cloud
. Mas como ler e gravar arquivos diretamente /mnt/cloud
é lento porque precisa passar pela Internet, quero armazenar em cache os arquivos que estou lendo e gravando no armazenamento em nuvem. Como posso estar gravando muitos dados por vez, o cache deve ficar 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 visualização em cache /mnt/cloud
montada em /mnt/cloud_cache
, que usa outro caminho, digamos, /var/cache/cloud
como o local de cache.
Se eu ler agora /mnt/cloud_cache/file
, quero que aconteça o seguinte:
Verifique se file
está armazenado em cache em /var/cache/cloud/file
.
- Se estiver em cache: o check
file
-in do cache está atualizado buscando modtime e/ou checksum de/mnt/cloud
. Se estiver atualizado, sirva o arquivo do cache, caso contrário, vá para 2. - Se não estiver armazenado em cache ou se o cache estiver desatualizado: copie
/mnt/cloud/file
e/var/cache/cloud/file
sirva a partir do cache.
Quando escrevo para /mnt/cloud_cache/file
, quero que isso aconteça:
- Escreva
/var/cache/cloud/file
e registre em um diário quefile
precisa ser escrito de volta/mnt/cloud
- Aguarde a
/var/cache/cloud/file
conclusão da escrita e/ou a/mnt/cloud
conclusão dos write-backs anteriores - Copiar
/var/cache/cloud/file
para/mnt/cloud
Tenho os seguintes requisitos e restrições:
- Gratuito e de código aberto
- Capacidade de definir o cache em um local de cache arbitrário
- Capacidade de armazenar em cache um local arbitrário (provavelmente algum ponto de montagem do FUSE)
- Cache transparente, ou seja, o uso
/mnt/cloud_cache
é transparente para o mecanismo de cache e funciona como qualquer outro sistema de arquivos montado - Manter um registro do que precisa ser gravado (o cache pode receber muitos dados que precisam ser gravados no local de armazenamento original ao longo dos dias)
- Exclusão automática de arquivos em cache que foram gravados ou não acessados há algum tempo
- Consistência (ou seja, refletir alterações externas em
/mnt/cloud
) não é muito importante, pois provavelmente terei apenas um cliente acessando/mnt/cloud
por vez, mas seria bom ter.
Passei algum tempo procurando soluções existentes, mas não encontrei nada satisfatório.
- FS-Cache e CacheFS (https://www.kernel.org/doc/Documentation/filesystems/caching/fscache.txt) parece funcionar apenas com sistemas de arquivos
nfs
ouafs
e não sei como fazer com que ele armazene em cache outro sistema de arquivos FUSE ou qualquer diretório geral. - 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 faz exatamente o que quero, mas está integrado ao Google Cloud Storage. Para fazê-lo funcionar em geral, eu teria que hackeá-lo e alterar quaisquer acessos ao GCS para acessos a arquivos locais no ponto de montagem fornecido ou acessos ao Amazon Cloud Drive
Responder1
Tente usargatos, um sistema de arquivos genérico de cache de fusível no qual estou trabalhando atualmente.
Responder2
É possível usar FS-Cache/CacheFS para armazenar em cache um sistema montado em fusível, adicionando uma indireção NFS no meio: Se sua montagem de fusível estiver em /fusefs, então compartilhe-a consigo mesmo no nfs escrevendo isto em /etc/exportfs:
/fusefs localhost(fsid=0)
Agora você pode fazer isso:
mount -t nfs -o fsc localhost:/fusefs /nfs systemctl start cachefilesd
e /nfs oferecerá acesso em cache a /fusefs.
Estou usando essa abordagem com sshfs como FS traseiro, funciona muito bem.
(Infelizmente, isso apenas acelera o acesso ao conteúdo do arquivo; os metadados do arquivo não são armazenados em cache stat
e open
ainda são lentos).
Responder3
Este é um tipo de resposta ignorante, já que não tenho acesso a um diretório de nuvem da Amazon para testá-lo. Mas no"Como fazer isso"espírito: configuraçãoNuvem Amazon para servir NFS, entãofaça login remotamente nesse servidor NFS usandocachefilesd
.
"Mais fácil falar do que fazer..."