Como posso fazer cache de forma transparente de qualquer diretório ou sistema de arquivos montado para leituras e write-back?

18

Digamos que eu monte algum armazenamento em nuvem (no meu caso, o Amazon Cloud Drive) com um cliente FUSE em /mnt/cloud . Mas como ler e gravar arquivos diretamente em /mnt/cloud é lento porque precisa passar pela Internet, quero armazenar em cache os arquivos dos quais estou lendo e gravando no armazenamento em nuvem. Como posso estar escrevendo muitos dados por vez, o cache deve ficar no meu disco e não na RAM. Mas eu não quero replicar todo o armazenamento em nuvem no meu disco, porque meu disco pode ser muito pequeno.

Portanto, quero ter uma exibição armazenada em cache em /mnt/cloud montado em /mnt/cloud_cache , que usa outro caminho, digamos /var/cache/cloud como o local de armazenamento em cache.

Se eu agora leio /mnt/cloud_cache/file , quero que o seguinte aconteça:

Verifique se file está em cache em /var/cache/cloud/file .

  1. Se estiver em cache: Verifique se file no cache está atualizando, 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 estiver em cache ou o cache estiver desatualizado: copie /mnt/cloud/file para /var/cache/cloud/file e exiba-o no cache.

Quando escrevo para /mnt/cloud_cache/file , quero que isso aconteça:

  1. Escreva para /var/cache/cloud/file e registre em um diário que file precisa ser gravado novamente em /mnt/cloud
  2. Aguarde até que a gravação em /var/cache/cloud/file seja feita e / ou faça as gravações anteriores em /mnt/cloud a serem concluídas
  3. Copie /var/cache/cloud/file para /mnt/cloud

Eu tenho os seguintes requisitos e restrições:

  • Fonte livre e aberta
  • Capacidade de definir um local de cache arbitrário em cache
  • Capacidade de armazenar em cache uma localização arbitrária (provavelmente algum ponto de montagem do FUSE)
  • O armazenamento em cache transparente, ou seja, usando /mnt/cloud_cache é transparente para o 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 obter 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 de volta ou que não foram acessados em algum momento
  • 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 ( link ) parece funcionar apenas com nfs ou afs sistemas de arquivos e eu não sei como fazer cache de outro sistema de arquivos FUSE ou qualquer diretório geral.
  • O
  • bcache ( link ) parece funcionar apenas com dispositivos de bloco, ou seja, não é possível armazenar em cache outro sistema de arquivos FUSE
  • gcsfuse ( link ) Acho que isso é exatamente o que eu quero, mas está integrado ao Google Cloud Storage. Para fazê-lo funcionar em geral, eu teria que hackear e alterar quaisquer acessos ao GCS para acessos a arquivos locais no ponto de montagem ou acessos ao Amazon Cloud Drive.
por Flecto 22.09.2016 / 18:44

3 respostas

1

Tente usar o catfs , um sistema de arquivos em cache com fusível genérico no qual estou trabalhando atualmente.

    
por 27.07.2017 / 22:16
1

É possível usar o FS-Cache / CacheFS para armazenar em cache um sistema montado por fusível, adicionando uma indireta NFS entre: Se a sua montagem de fusível estiver em / fusefs, compartilhe-a em 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ão acesso em cache a / fusefs.

Eu estou usando essa abordagem com o sshfs como back FS, funciona muito bem.

(Infelizmente, isso só acelera o acesso ao conteúdo do arquivo; os metadados do arquivo não são armazenados em cache, então stat e open ainda são lentos).

    
por 29.03.2018 / 17:40
0

Este é um tipo de resposta ignorante, já que não tenho acesso a um diretório de nuvem da Amazon com o qual testá-lo. Mas no "Como Fazer" spirit: setup Nuvem da Amazon para servir NFS , então faça login remotamente no servidor NFS usando cachefilesd .

"Mais fácil falar do que fazer ..."

    
por 06.03.2017 / 15:54