¿Cómo puedo almacenar en caché de forma transparente cualquier directorio o sistema de archivos montado para lecturas y reescrituras?

22

Digamos que monte algo de almacenamiento en la nube (Amazon Cloud Drive en mi caso) con un cliente FUSE en /mnt/cloud. Pero debido a que leer y escribir archivos directamente /mnt/cloudes lento porque tiene que ir a través de Internet, quiero almacenar en caché los archivos que estoy leyendo y escribiendo en el almacenamiento en la nube. Como podría estar escribiendo una gran cantidad de datos a la vez, el caché debería estar en mi disco y no en la RAM. Pero no quiero replicar todo el almacenamiento en la nube en mi disco, porque mi disco puede ser demasiado pequeño.

Por lo tanto, quiero tener una vista en caché /mnt/cloudmontada en /mnt/cloud_cache, que utiliza otra ruta, por ejemplo, /var/cache/cloudcomo la ubicación de almacenamiento en caché.

Si ahora leo /mnt/cloud_cache/file, quiero que suceda lo siguiente:

Compruebe si fileestá almacenado en caché /var/cache/cloud/file.

  1. Si está almacenado fileen caché : el registro de la memoria caché está actualizado al buscar modtime y / o suma de comprobación de /mnt/cloud. Si está actualizado, envíe el archivo desde el caché; de lo contrario, vaya a 2.
  2. Si no se almacena en caché o caché está fuera de fecha: Copiar /mnt/cloud/filea /var/cache/cloud/filey servir desde la caché.

Cuando escribo /mnt/cloud_cache/file, quiero que esto suceda:

  1. Escriba /var/cache/cloud/filey grabe en un diario que filedebe volver a escribirse/mnt/cloud
  2. Espere a que la escritura a /var/cache/cloud/fileser hecho y / o la espalda de escritura anteriores para /mnt/cloudser completados
  3. Copiar /var/cache/cloud/filea/mnt/cloud

Tengo los siguientes requisitos y limitaciones:

  • Gratis y de código abierto
  • Posibilidad de establecer caché en una ubicación de caché arbitraria
  • Posibilidad de almacenar en caché una ubicación arbitraria (probablemente algún punto de montaje FUSE)
  • El almacenamiento en caché transparente, es decir, el uso /mnt/cloud_cachees transparente para el mecanismo de almacenamiento en caché y funciona como cualquier otro sistema de archivos montado
  • Mantener un registro de lo que se debe volver a escribir (la memoria caché puede obtener muchos datos que se deben volver a escribir en la ubicación de almacenamiento original en el transcurso de los días)
  • Eliminación automática de archivos en caché que se han reescrito o no se ha accedido en mucho tiempo
  • La consistencia (es decir, reflejar cambios externos a /mnt/cloud) no es terriblemente importante, ya que probablemente tendré acceso /mnt/clouda un solo cliente a la vez, pero sería bueno tenerla.

He pasado bastante tiempo buscando soluciones existentes, pero no he encontrado nada satisfactorio.

  • Parece que FS-Cache y CacheFS ( https://www.kernel.org/doc/Documentation/filesystems/caching/fscache.txt ) solo funcionan con sistemas de archivos nfso afsy no sé cómo hacer que guarde en la caché otro archivo FUSE sistema o cualquier directorio general.
  • Parece que bcache ( https://bcache.evilpiepirate.org/ ) solo funciona con dispositivos de bloque, es decir, no pudo almacenar en caché otro sistema de archivos FUSE
  • gcsfuse ( https://github.com/GoogleCloudPlatform/gcsfuse ) Creo que esto hace exactamente lo que quiero, pero está integrado con Google Cloud Storage. Para que funcione en general, tendría que piratearlo y cambiar los accesos a GCS a los accesos a archivos locales en el punto de montaje dado o los accesos a Amazon Cloud Drive
Flecto
fuente
2
¿Curioso si alguna vez encontraste una solución? Buscar una capa de caché similar con requisitos similares a los suyos.
SS44
1
bitbucket.org/nikratio/s3ql hace más o menos lo que quiero. Sin embargo, desafortunadamente, no funciona muy bien con Amazon Cloud Drive en particular (principalmente por culpa de ACD por falta de un buen cliente de Linux)
Flecto
Yo mismo he usado s3ql en el pasado, pero haber migrado a ACD para mis archivos parecía limitar su uso con ese proveedor. Encontré problemas con la consistencia de datos con s3ql cuando las colecciones de datos> 2TB. RClone parece prometedor pero le falta esa pieza vital de almacenamiento en caché.
SS44
Si está realmente interesado en eso, podemos escribirlo en C ++, usando tmpfs y stat.
GOST

Respuestas:

3

Intente usar catfs , un sistema genérico de almacenamiento en caché de fusibles en el que estoy trabajando actualmente.

khc
fuente
1
Por lo que estoy viendo hasta ahora, funciona a las mil maravillas. ¡Muchas gracias!
Alfe
2

Es posible usar FS-Cache / CacheFS para almacenar en caché un sistema montado en fusible, agregando una dirección indirecta NFS entre: Si su montaje de fusible está en / fusefs, luego compártelo en nfs escribiendo esto en / etc / exportfs:

/fusefs localhost(fsid=0)

Ahora puedes hacer esto:

mount -t nfs -o fsc localhost:/fusefs /nfs systemctl start cachefilesd

y / nfs ofrecerá acceso en caché a / fusefs.

Estoy usando este enfoque con sshfs como FS posterior, funciona bien.

(Desafortunadamente, esto solo acelera el acceso al contenido del archivo; los metadatos del archivo no se almacenan en caché staty opensiguen siendo lentos).

Erik Carstensen
fuente