Go로 S3 마운트

4641 단어 GoAWSfuse
S3을 파일 시스템으로 마운트하기 위한 데몬을 만들고 있습니다.개발 동기는 전체 메인 디렉터리를 공유할 수 있다면dotfiles 주변에 설정하려고 노력할 필요가 없다는 것이다.
따라서 기존의 S3는 쉽게 볼 수 있다기보다는 안전하고 성능이 가능한 한 (파일과 상관없이) 안정적이고 빠른 파일 시스템을 목표로 한다.
juntaki/bucketsync: S3 backed FUSE Filesystem written in Go with dedup and encryption.

사용법


우선 설정 파일을 작성한다.$HOME/.bucketsync/config.yml에서 파일을 만들 수 있습니다.S3의 신용장은 명문으로 입력된 것이기 때문에 사용할 때 주의해야 한다.출력된 파일은 암호화하고 압축하는 옵션이 있지만 글이 공개될 때 이루어지지 않아 의미가 없다.
bucketsync config --bucket <Bucket name> \
                  --region <Region, e.g. ap-northeast-1> \
                  --accesskey <AWS access key> \
                  --secretkey <AWS secret key> \
                  --password <Password for data encryption>
config.yml
bucket: ""
region: ""
access_key: ""
secret_key: ""
password: ""
logging: production
log_output_path: /home/juntaki/.bucketsync/bucketsync.log
cache_size: 1024
extent_size: 65536
encryption: true
compression: true
그런 다음 해당 디렉토리에만 마운트합니다.
bucketsync mount --dir /path/to/mountpoint
제거하려면 이 명령을 사용합니다.
bucketsync unmount

구조


사용하는 라이브러리를 중심으로 전체적인 디자인을 설명합니다.

FUSE


Linux에서는 FUSE의 구조로 사용자 공간에서 파일 시스템을 제작하고 설치할 수 있다.
커널의 FUSE 모듈의libfuse를 사용하여 실현하는 방법도 있지만 이번 실현은 Go가 쓴 프로그램 라이브러리의 hanwen/go-fuse: FUSE bindings for Go를 사용하고 있다.go-fuse가 정의한 인터페이스를 설치하면 파일 시스템을 간단하게 만들 수 있습니다.
bucketsync에서는 pathwalk 근처를 잘 쓰고 싶어서 pathfs를 사용합니다.따라서 설치된 인터페이스는pathfs.Filesystem이다.

데이터 저장 방법


S3 콘솔 방식의 문제


기존의 S3를 편리하게 보기 위해 FSE로 마운트하려면 (S3의 컨트롤러에서 봐도 이렇게 됩니다) 대상의 키와 파일 경로가 1대1로 대응합니다.예를 들어 마운트 지점dir부터 디렉터리에 여러 파일을 저장하면 여러 개의 키 대상이 있을 수 있다.
/dir/test1.txt
/dir/test2.txt
/dir/test3.txt
/dir/test4.txt
디렉토리dir의 이름을 바꾸려면 해당 개체의 이름을 바꾸어야 합니다.(4개 정도면 괜찮다.)
아래에서 말한 바와 같이 이것은 데이터 구조의 문제로 절차적으로 방법을 생각하는 데도 한계가 있다.
Support for deep directory rename · Issue #312 · s3fs-fuse/s3fs-fuse
이외에도 클라이언트 측에서 대상을 암호화하거나 압축하는 것을 고려할 때 무작위 읽기성을 겸비하려면 이러한 실현 옵션이 상당히 좁아진다.

bucketsync 데이터 구성


파일을 S3 객체로 보는 것을 포기하면 다양한 설정이 가능합니다.bucketsync에서는 일반적인 파일 시스템처럼 메타데이터의 대상과 데이터의 대상을 분리하여 저장합니다.방금 이름 바꾸기 문제는 디렉터리 메타데이터만 바꾸면 됩니다.
메타데이터의 형식은 filesystem.go에 쓰여 있다.

고속화 방법


로컬 캐시


pathwalk에서 메타데이터만 자주 참조되므로 로컬에서 LRU 캐시를 사용합니다.cache.go
또한 S3에 대한 API 액세스는 AWS 공식 SDK를 사용합니다.
aws/aws-sdk-go: AWS SDK for the Go programming language.

산열:murmur3hash


또한 데이터 저장 대상에서 이 데이터의 해시를 키로 하여 중복 배제를 실현할 수 있다.산열은 안전하지 않아도 되기 때문에 고속의murmur3를 채택하였다.
spaolacci/murmur3: Native MurmurHash3 Go implementation

데이터 직렬화


Go의 객체로 메타데이터를 처리하려면 저장하고 읽을 때 빈번한serialize와 Deserialize가 필요하기 때문이다.기준을 보면 JSON과 같은 반사 실현이 필요한 것보다 코드 생성의protocol buffers 등이 더 빠르다.(아니면, 손으로 해도 된다.)
alecthomas/go_serialization_benchmarks: Benchmarks of Go serialization methods
※ 아직 JSON은 설치되지 않았지만

후기


아직 마운트 중!이런 수준이지만 차츰 유용한 것으로 개선될 것이다.

참고 자료


juntaki/bucketsync: S3 backed FUSE Filesystem written in Go with dedup and encryption.
Understanding Filesystem using go-fuse, from scratch // Speaker Deck

좋은 웹페이지 즐겨찾기