如何透明地缓存任何目录或装入的文件系统以进行读取和回写?


22

假设我使用的FUSE客户端挂载了一些云存储(在我的情况下为Amazon Cloud Drive)/mnt/cloud。但是,由于直接读写文件的/mnt/cloud速度很慢,因为它必须通过Internet进行传输,因此我想缓存正在读取并写入云存储的文件。由于我可能一次写入大量数据,因此缓存应位于磁盘上而不是RAM中。但是我不想在磁盘上复制整个云存储,因为磁盘可能太小。

因此,我想将缓存视图装入/mnt/cloud挂载在/mnt/cloud_cache,该视图使用另一条路径,例如/var/cache/cloud作为缓存位置。

如果我现在阅读/mnt/cloud_cache/file,我希望发生以下情况:

检查是否file在缓存/var/cache/cloud/file

  1. 如果已缓存:file通过从中获取modtime和/或校验和,来检入缓存是最新的/mnt/cloud。如果是最新版本,请从缓存中提供文件,否则转到2。
  2. 如果未缓存或缓存已过期:复制/mnt/cloud/file/var/cache/cloud/file缓存并从缓存中提供。

当我写信给时/mnt/cloud_cache/file,我希望发生这种情况:

  1. 写入/var/cache/cloud/file并记录在file需要回写的日记中/mnt/cloud
  2. 等待写入/var/cache/cloud/file完成和/或之前的回写操作/mnt/cloud完成
  3. 复制/var/cache/cloud/file/mnt/cloud

我有以下要求和约束:

  • 免费和开源
  • 能够将缓存设置为任意缓存位置
  • 能够缓存任意位置(可能是一些FUSE挂载点)
  • 透明缓存,即使用/mnt/cloud_cache对缓存机制是透明的,并且像任何其他已挂载文件系统一样工作
  • 记录需要回写的内容(缓存可能会在几天内将很多数据需要回写到原始存储位置)
  • 自动删除已写回或一段时间未访问的缓存文件
  • 一致性(即反映对的外部更改/mnt/cloud)并不是非常重要,因为我一次可能只有一个客户端访问/mnt/cloud,但是拥有它会很好。

我花了很多时间寻找现有的解决方案,但还没有找到令人满意的解决方案。


2
好奇是否找到解决方案?寻找具有与您自己相似的需求的相似缓存层。
SS44

1
bitbucket.org/nikratio/s3ql几乎完成了我想要的。但是,不幸的是,它尤其不适用于Amazon Cloud Drive(主要是ACD的故障,因为它缺乏良好的Linux客户端)
Flecto

我过去曾使用过s3ql,但已将其文件迁移到ACD似乎限制了它在该提供程序中的使用。当数据收集> 2TB时,s3ql确实遇到了数据一致性问题。RClone看起来很有希望,但缺少这一重要的缓存部分。
SS44

如果您对此非常感兴趣-我们可以使用tmpfs和stat用C ++编写它。
GOST

Answers:


3

尝试使用catfs,这是我目前正在使用的通用保险丝缓存文件系统。


1
从我所看到的到现在,它就像一种魅力。非常感谢!
Alfe

2

通过在两者之间添加NFS间接访问,可以使用FS-Cache / CacheFS来缓存安装有熔断器的系统:如果熔断器安装在/ fusefs上,则可以通过在/ etc / exportfs中写入以下内容在nfs上将其共享给自己:

/fusefs localhost(fsid=0)

现在您可以执行以下操作:

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

/ nfs将提供对/ fusefs的缓存访问。

我将sshfs作为后台FS使用这种方法,效果很好。

(不幸的是,这只是加快了文件内容的访问;文件元数据不缓存,以便statopen仍然慢)。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.