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

22

Скажем, я смонтировал некоторое облачное хранилище (в моем случае 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 ), похоже, работают только с файловыми системами nfsили с ними afs, и я не знаю, как заставить его кэшировать другой файл FUSE. Система или любой общий каталог.
  • Похоже, что bcache ( https://bcache.evilpiepirate.org/ ) работает только с блочными устройствами, т.е. не может кэшировать другую файловую систему FUSE.
  • gcsfuse ( https://github.com/GoogleCloudPlatform/gcsfuse ) Я думаю, что это именно то, что я хочу, но оно интегрировано с Google Cloud Storage. Чтобы заставить его работать в целом, мне придется взломать его и изменить любой доступ к GCS на локальный доступ к файлам в заданной точке монтирования или доступ к Amazon Cloud Drive.
Flecto
источник
2
Любопытно, если вы когда-нибудь нашли решение? Поиск аналогичного слоя кэширования с аналогичными требованиями требует вашего собственного.
SS44
1
bitbucket.org/nikratio/s3ql делает в основном то, что я хочу. Однако, к сожалению, это не слишком хорошо работает с Amazon Cloud Drive, в частности (в основном из-за ошибки ACD из-за отсутствия хорошего Linux-клиента)
Flecto
Я сам использовал s3ql в прошлом, но переход на ACD для моих файлов, казалось, ограничивал его использование с этим провайдером. Проблемы с согласованностью данных с s3ql, когда сбор данных> 2TB. RClone кажется многообещающим, но упускает этот важный элемент кэширования.
SS44
Если вы серьезно заинтересованы в этом - мы можем написать это на C ++, используя tmpfs и stat.
ГОСТ

Ответы:

3

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

KHC
источник
1
От того, что я вижу до сих пор, это работает как шарм. Большое спасибо!
Алфе
2

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

/fusefs localhost(fsid=0)

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

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

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

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

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

Эрик Карстенсен
источник
1

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

"Проще сказать, чем сделать..."

АРУ
источник