Go로 S3 마운트
따라서 기존의 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.ymlbucket: ""
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
Reference
이 문제에 관하여(Go로 S3 마운트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/juntaki/items/64c69691acd2e00b2915
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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>
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
Reference
이 문제에 관하여(Go로 S3 마운트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/juntaki/items/64c69691acd2e00b2915
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
juntaki/bucketsync: S3 backed FUSE Filesystem written in Go with dedup and encryption.
Understanding Filesystem using go-fuse, from scratch // Speaker Deck
Reference
이 문제에 관하여(Go로 S3 마운트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/juntaki/items/64c69691acd2e00b2915텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)