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


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 кеша оновлена, отримуючи мод час та / або контрольну суму з /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

2
Цікаво, чи знайшли ви колись рішення? Шукати схожий шар кешування з подібними потребами, як і ваш власний.
SS44

1
bitbucket.org/nikratio/s3ql робить те, що я хочу. Однак, на жаль, це не дуже добре грає з Amazon Cloud Drive, зокрема (в основному вини ACD через відсутність хорошого клієнта Linux)
Flecto

Я раніше використовував s3ql раніше, але перейшов на ACD для своїх файлів, здавалося, обмежував його використання з цим провайдером. Виникли проблеми з узгодженістю даних з s3ql при зборі даних> 2 ТБ. RClone здається багатообіцяючим, але відсутній цей життєвий елемент кешування.
SS44

Якщо ви серйозно зацікавлені в цьому - ми можемо написати це на C ++, використовуючи tmpfs та stat.
ГОСТ

Відповіді:


3

Спробуйте використовувати catfs , загальну файлову систему кешування запобіжників, над якою я зараз працюю.


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 як задній FS, він працює чудово.

(На жаль, це лише прискорює доступ до вмісту файлу; метадані файлів не кешовані таким чином statі openвсе ще повільні).


1

Це невідома відповідь, оскільки я не маю доступу до хмарного каталогу Amazon, за допомогою якого його можна перевірити. Але в дусі "Як це зробити" : налаштувати хмару Amazon для обслуговування NFS , а потім віддалено увійти до цього сервера NFS, використовуючиcachefilesd .

"Простіше сказати, ніж зробити ..."

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.