
Допустим, я монтирую какое-то облачное хранилище (в моем случае 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
.
- Если кэширован: проверьте,
file
актуален ли кэш, извлекая modtime и/или контрольную сумму из/mnt/cloud
. Если он актуален, отдайте файл из кэша, в противном случае перейдите к 2. - Если данные не кэшированы или устарели: скопируйте их
/mnt/cloud/file
в/var/cache/cloud/file
кэш и используйте из него.
Когда я пишу /mnt/cloud_cache/file
, я хочу, чтобы произошло следующее:
- Пишите
/var/cache/cloud/file
и записывайте в журнале, кудаfile
нужно будет писать ответ./mnt/cloud
- Дождитесь завершения записи и/или завершения
/var/cache/cloud/file
предыдущих обратных записей./mnt/cloud
- Скопировать
/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) похоже работает только с файловыми системами
nfs
FUSE или другими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
.
"Легче сказать, чем сделать..."