
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/cloud
es 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/cloud
montada en /mnt/cloud_cache
, que usa otra ruta, por ejemplo, /var/cache/cloud
como ubicación de almacenamiento en caché.
Si ahora leo /mnt/cloud_cache/file
, quiero que suceda lo siguiente:
Compruebe si file
está almacenado en caché en /var/cache/cloud/file
.
- Si está almacenado en caché: verifique
file
que 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. - Si no está almacenado en caché o el caché está desactualizado: cópielo
/mnt/cloud/file
y/var/cache/cloud/file
sírvalo desde el caché.
Cuando escribo a /mnt/cloud_cache/file
, quiero que suceda esto:
- Escribir
/var/cache/cloud/file
y registrar en un diario en el quefile
es necesario volver a escribir./mnt/cloud
- Espere a que se complete la escritura y/o que se completen
/var/cache/cloud/file
las reescrituras anteriores./mnt/cloud
- Copiar
/var/cache/cloud/file
a/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_cache
es 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/cloud
a la vez, pero sería bueno tenerlo.
Pasé bastante tiempo buscando soluciones existentes, pero no encontré nada satisfactorio.
- FS-Cache y CacheFS (https://www.kernel.org/doc/Documentation/filesystems/caching/fscache.txt) parece funcionar solo con sistemas de archivos
nfs
oafs
y no sé cómo hacer que almacene en caché otro sistema de archivos FUSE o cualquier directorio general. - bcache (https://bcache.evilpiepirate.org/) parece funcionar sólo con dispositivos de bloque, es decir, no se puede almacenar en caché otro sistema de archivos FUSE
- gcsfusible (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 hackearlo y cambiar cualquier acceso a GCS a accesos a archivos locales en el punto de montaje dado o accesos a Amazon Cloud Drive.
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é stat
y open
siguen 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..."