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/cloud
es 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/cloud
montada en /mnt/cloud_cache
, que utiliza otra ruta, por ejemplo, /var/cache/cloud
como la 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é /var/cache/cloud/file
.
- Si está almacenado
file
en 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. - Si no se almacena en caché o caché está fuera de fecha: Copiar
/mnt/cloud/file
a/var/cache/cloud/file
y servir desde la caché.
Cuando escribo /mnt/cloud_cache/file
, quiero que esto suceda:
- Escriba
/var/cache/cloud/file
y grabe en un diario quefile
debe volver a escribirse/mnt/cloud
- Espere a que la escritura a
/var/cache/cloud/file
ser hecho y / o la espalda de escritura anteriores para/mnt/cloud
ser completados - Copiar
/var/cache/cloud/file
a/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_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 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/cloud
a 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
nfs
oafs
y 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
Respuestas:
Intente usar catfs , un sistema genérico de almacenamiento en caché de fusibles en el que estoy trabajando actualmente.
fuente
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é
stat
yopen
siguen siendo lentos).fuente
Esta es una respuesta ignorante, ya que no tengo acceso a un directorio en la nube de Amazon con el que probarlo. Pero en el espíritu de "Cómo hacerlo" : configure Amazon Cloud para servir NFS , luego inicie sesión de forma remota en ese servidor NFS utilizando
cachefilesd
."Es más fácil decirlo que hacerlo..."
fuente