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

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

Digamos que monto 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 conectarse a Internet, quiero almacenar en caché los archivos que leo y escribo en el almacenamiento en la nube. Dado que es posible que esté escribiendo una gran cantidad de datos a la vez, el caché debería ubicarse 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 usa otra ruta, por ejemplo, /var/cache/cloudcomo ubicación de almacenamiento en caché.

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

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

  1. Si está almacenado en caché: verifique fileque el caché esté actualizado obteniendo modtime y/o checksum de /mnt/cloud. Si está actualizado, entregue el archivo desde la memoria caché; de lo contrario, vaya a 2.
  2. Si no está almacenado en caché o el caché está desactualizado: cópielo /mnt/cloud/filey /var/cache/cloud/filesírvalo desde el caché.

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

  1. Escribir /var/cache/cloud/filey registrar en un diario en el que filees necesario volver a escribir./mnt/cloud
  2. Espere a que se complete la escritura y/o que se completen /var/cache/cloud/filelas reescrituras anteriores./mnt/cloud
  3. Copiar /var/cache/cloud/filea/mnt/cloud

Tengo los siguientes requisitos y limitaciones:

  • Gratis y de código abierto
  • Capacidad de configurar el caché en una ubicación de caché arbitraria
  • Capacidad 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 una gran cantidad de datos que se deben volver a escribir en la ubicación de almacenamiento original a lo largo de los días)
  • Eliminación automática de archivos en caché que se han reescrito o a los que no se ha accedido por un tiempo
  • La coherencia (es decir, reflejar cambios externos en /mnt/cloud) no es muy importante, ya que probablemente solo tendré acceso a un cliente /mnt/clouda la vez, pero sería bueno tenerlo.

Pasé bastante tiempo buscando soluciones existentes, pero no encontré nada satisfactorio.

Respuesta1

Intenta usargatos, un sistema de archivos de almacenamiento en caché de fusibles genérico en el que estoy trabajando actualmente.

Respuesta2

Es posible usar FS-Cache/CacheFS para almacenar en caché un sistema montado en fusibles, agregando una dirección indirecta NFS en el medio: si el montaje de su fusible está en /fusefs, compártalo con usted mismo 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 muy bien.

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

Respuesta3

Esta es una respuesta ignorante, ya que no tengo acceso a un directorio en la nube de Amazon para probarlo. Pero en el"Cómo hacerlo"espíritu: configuraciónNube de Amazon para servir NFS, entoncesinicie sesión de forma remota en ese servidor NFS usandocachefilesd.

"Es más fácil decirlo que hacerlo..."

información relacionada