Как можно прозрачно кэшировать любой каталог или смонтированную файловую систему для чтения и обратной записи?

Как можно прозрачно кэшировать любой каталог или смонтированную файловую систему для чтения и обратной записи?

Допустим, я монтирую какое-то облачное хранилище (в моем случае Amazon Cloud Drive) с клиентом FUSE в /mnt/cloud. Но поскольку чтение и запись файлов напрямую в /mnt/cloudмедленно, так как это должно проходить через интернет, я хочу кэшировать файлы, которые я читаю и записываю в облачное хранилище. Поскольку я могу записывать много данных за раз, кэш должен находиться на моем диске, а не в оперативной памяти. Но я не хочу реплицировать все облачное хранилище на свой диск, потому что мой диск может быть слишком мал.

Поэтому я хочу иметь кэшированное представление в /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в каждый момент времени, но было бы неплохо ее иметь.

Я потратил довольно много времени на поиск существующих решений, но ничего удовлетворительного не нашел.

  • FS-Cache и CacheFS (https://www.kernel.org/doc/Documentation/filesystems/caching/fscache.txt) похоже работает только с файловыми системами nfsFUSE или другими afs, и я не знаю, как заставить его кэшировать другую файловую систему FUSE или любой общий каталог.
  • bcache (https://bcache.evilpiepirate.org/) похоже работает только с блочными устройствами, т.е. не может кэшировать другую файловую систему FUSE
  • gcsfuse (https://github.com/GoogleCloudPlatform/gcsfuse) Я думаю, что это делает именно то, что я хочу, но это интегрировано с Google Cloud Storage. Чтобы заставить это работать в целом, мне пришлось бы взломать его и изменить все доступы к GCS на локальные доступы к файлам в данной точке монтирования или доступы к Amazon Cloud Drive

решение1

Попробуйте использоватькоты, универсальная кэширующая файловая система Fuse, над которой я сейчас работаю.

решение2

Можно использовать FS-Cache/CacheFS для кэширования системы, смонтированной с помощью fuse, добавив между ними косвенное указание NFS: если ваш fuse-смонтирован на /fusefs, то предоставьте к нему общий доступ на nfs, записав следующее в /etc/exportfs:

/fusefs localhost(fsid=0)

Теперь вы можете сделать это:

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

а /nfs предложит кэшированный доступ к /fusefs.

Я использую этот подход с sshfs в качестве резервной файловой системы, он отлично работает.

(К сожалению, это только ускоряет доступ к содержимому файла; метаданные файла не кэшируются statи поэтому openпо-прежнему работают медленно).

решение3

Это невежественный ответ, поскольку у меня нет доступа к облачному каталогу Amazon, чтобы протестировать его. Но в"Как это сделать"дух: настройкаОблако Amazon будет обслуживать NFS, затемвойдите удаленно на этот сервер NFS, используяcachefilesd.

"Легче сказать, чем сделать..."

Связанный контент