읽기 및 쓰기를 위해 디렉토리 또는 마운트 된 파일 시스템을 투명하게 캐시하려면 어떻게해야합니까? 가져 와서 캐시 체크인 이 최신 상태입니다

에 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-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에 대한 액세스로 변경해야합니다


답변

현재 작업중인 일반 퓨즈 캐싱 파일 시스템 인 catfs를 사용해보십시오 .


답변

FS-Cache / CacheFS를 사용하여 다음과 같은 NFS 간접 연결을 추가하여 퓨즈 마운트 시스템을 캐시 할 수 있습니다.

/fusefs localhost(fsid=0)

이제 당신은 이것을 할 수 있습니다 :

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

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

sshfs와 함께이 방법을 백 FS로 사용하고 있습니다.

(불행히도, 이것은 단지 파일 내용의 액세스 속도, 파일 메타 데이터 그래서 캐시되지 statopen느린 여전히).


답변

테스트 할 Amazon 클라우드 디렉토리에 액세스 할 수 없기 때문에 무지한 대답입니다. 그러나 “방법” 정신에서 : Amazon 클라우드가 NFS를 제공하도록 설정 한 다음을 사용하여 해당 NFS 서버에 원격으로 로그인하십시오cachefilesd .

“보다 말이 쉬웠다 …”


답변