읽기 및 쓰기를 위해 디렉터리나 마운트된 파일 시스템을 투명하게 캐시하려면 어떻게 해야 합니까?

읽기 및 쓰기를 위해 디렉터리나 마운트된 파일 시스템을 투명하게 캐시하려면 어떻게 해야 합니까?

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

그래서 캐싱 위치와 같은 다른 경로를 사용하는 캐시된 뷰를 에 /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-캐시 및 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

사이에 NFS 간접 참조를 추가하여 FS-Cache/CacheFS를 사용하여 퓨즈 마운트 시스템을 캐시할 수 있습니다. 퓨즈 마운트가 /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를 제공하는 Amazon 클라우드, 그 다음에다음을 사용하여 해당 NFS 서버에 원격으로 로그인하십시오.cachefilesd.

"말이 말보다 쉽다..."

관련 정보