Como posso armazenar em cache de forma transparente qualquer diretório ou sistema de arquivos montado para leitura e gravação?

22

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.

  1. 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.
  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:

  1. Escreva /var/cache/cloud/filee grave em um diário que fileprecise ser gravado de volta para/mnt/cloud
  2. Aguarde até /var/cache/cloud/fileque a gravação seja concluída e / ou as gravações anteriores /mnt/cloudsejam concluídas
  3. 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 nfsou afsnã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
Flecto
fonte
2
Curioso se você já encontrou uma solução? A procura de uma camada de cache semelhante com requisitos semelhantes aos seus.
SS44
1
O bitbucket.org/nikratio/s3ql faz praticamente o que eu quero. No entanto, infelizmente, ele não jogar muito bem com Amazon Cloud Drive, em particular (principalmente culpa do ACD por falta de um bom cliente Linux)
Flecto
Eu já usei o s3ql no passado, mas migrar para o ACD para meus arquivos parecia limitar seu uso com esse provedor. Ocorreu um problema com a consistência dos dados com o s3ql quando a coleta de dados foi superior a 2 TB. O RClone parece promissor, mas falta essa parte vital do cache.
SS44 25/01
Se você está seriamente interessado nisso, podemos escrever em C ++, usando tmpfs e stat.
GOST

Respostas:

3

Tente usar catfs , um sistema de arquivos genérico para cache de fusíveis no qual estou trabalhando atualmente.

khc
fonte
1
Pelo que estou vendo até agora, funciona como um encanto. Muito obrigado!
Alfe
2

É possível usar o FS-Cache / CacheFS para armazenar em cache um sistema montado em fusível, adicionando um indireto NFS entre: Se a montagem do seu fusível estiver em / fusefs, compartilhe-a no nfs escrevendo isso 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ão acesso em cache a / fusefs.

Eu estou usando essa abordagem com sshfs como o FS de volta, 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 state, portanto, openainda são lentos).

Erik Carstensen
fonte