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


22

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

2
해결책을 찾았다면 궁금하십니까? 자신과 비슷한 요구를 가진 유사한 캐시 레이어를 찾으십시오.
SS44

1
bitbucket.org/nikratio/s3ql 은 내가 원하는 것을 거의 수행합니다. 그러나 안타깝게도 특히 Amazon Cloud Drive에서 제대로 작동하지 않습니다 (주로 Linux 클라이언트가 부족하여 ACD의 결함)
Flecto

과거에는 s3ql을 사용했지만 파일에 대해 ACD로 마이그레이션하면 해당 공급자와의 사용이 제한되는 것처럼 보입니다. 데이터 수집이 2TB를 초과 할 때 s3ql과의 데이터 일관성 문제가 발생했습니다. RClone은 유망한 것처럼 보이지만 중요한 캐싱 조각이 누락되었습니다.
SS44

그것에 관심이 있다면 tmpfs와 stat를 사용하여 C ++로 작성할 수 있습니다.
GOST

답변:


3

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


1
내가 지금까지 본 것에서 그것은 매력처럼 작동합니다. 고마워요!
Alfe

2

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

/fusefs localhost(fsid=0)

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

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

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

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

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.