¿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

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.


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).


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.