읽기와 쓰기 모두를 위해 디렉토리나 마운트된 파일 시스템을 투명하게 캐시하는 방법은 무엇입니까?

읽기와 쓰기 모두를 위해 디렉토리나 마운트된 파일 시스템을 투명하게 캐시하는 방법은 무엇입니까?

FUSE 클라이언트를 사용하여 일부 클라우드 저장소(내 경우에는 Amazon Cloud Drive)를 설치했다고 가정해 보겠습니다 /mnt/cloud. 하지만 파일을 직접 읽고 쓰는 것은 /mnt/cloud인터넷을 거쳐야 하기 때문에 느리기 때문에 읽고 쓰는 파일을 클라우드 스토리지에 캐시하고 싶습니다. 아마도 한 번에 많은 양의 데이터를 쓸 것이기 때문에 캐시는 RAM이 아닌 디스크에 있어야 합니다. 하지만 내 디스크가 너무 작을 수 있기 때문에 전체 클라우드 저장소를 내 디스크에 복사하고 싶지 않습니다.

그래서 캐시 위치 와 같은 다른 경로를 사용하는 /mnt/cloudMounted에서 캐시 보기를 갖고 싶습니다 ./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-캐시 및 CacheFS(https://www.kernel.org/doc/Documentation/filesystems/caching/fscache.txtnfs)은 또는 파일 시스템 에서만 작동하는 것 같습니다 afs. 다른 FUSE 파일 시스템이나 일반 디렉토리를 캐시하는 방법을 모르겠습니다.
  • 은닉처(https://bcache.evilpiepirate.org/)는 블록 장치에서만 작동하는 것 같습니다. 즉, 다른 FUSE 파일 시스템은 캐시할 수 없습니다.
  • GCSFUSE(https://github.com/GoogleCloudPlatform/gcsfuse) 이것이 바로 내가 원하는 것이라고 생각하지만 Google Cloud Storage와 통합되어 있습니다. 작동하려면 해킹하고 GCS에 대한 액세스를 지정된 마운트 지점의 로컬 파일 액세스 또는 Amazon Cloud Drive에 대한 액세스로 변경해야 했습니다.

답변1

사용해 보세요고양이맨, 현재 개발 중인 범용 퓨즈 캐시 파일 시스템입니다.

답변2

FS-Cache/CacheFS를 사용하면 둘 사이에 NFS 간접 참조를 추가하여 퓨즈가 설치된 시스템을 캐시할 수 있습니다. 퓨즈가 /fusefs에 마운트된 경우 /etc/exportfs에 다음을 작성하여 nfs에서 자신에게 공유합니다.

/fusefs localhost(fsid=0)

이제 다음을 수행할 수 있습니다.

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

/nfs는 /fusefs에 대한 캐시 액세스를 제공합니다.

저는 sshfs를 백엔드 FS로 사용하여 이 방법을 사용하는데 훌륭하게 작동합니다.

(안타깝게도 이는 파일 내용에 대한 액세스 속도만 향상시킬 뿐입니다. 파일 메타데이터는 캐시되지 않으므로 stat여전히 open느립니다.)

답변3

테스트에 사용한 Amazon 클라우드 디렉터리에 액세스할 수 없기 때문에 이것은 무지한 답변입니다. 하지만"어떻게 해야 할까요?"정신: 설정아마존 클라우드 서비스 NFS, 그 다음에Telnet을 사용하여 NFS 서버에 로그인cachefilesd.

"말은 쉽지, 실천은 어려워…"

관련 정보