[AWS] Storage: AWS EFS

bluewhale·2021년 6월 10일
0

AWS

목록 보기
7/19

AWS Elastic File System

AWS EFS는 파일 방식으로 데이터를 저장하는 AWS의 대표 fully-managed file storage 서비스이다. 파일 스토리지는 일반적으로 OS에서 이용되는 파일 시스템에 사용되는 비교적 친숙한 방식의 스토리지이다. AWS EFS가 갖는 주요 특징들은 다음과 같다.

계층적 구조

파일 스토리지는 block 혹은 object 방식의 스토리지와 달리, 폴더와 파일로 구성된 계층적 구조를 갖는다.

공유 가능

AWS EFSSAN 방식으로 구현된 AWS EBS와 다르게, NFS(Network File System)를 기반으로 여러 EC2 인스턴스가 동일한 파일 시스템을 공유할 수 있다. AWS EFS는 기본적으로 수 천 여개의 concurrent NFS connection을 지원한다.

유연한 확장

Elastic 이라는 이름처럼, AWS EFS는 파일이 추가/삭제됨에 따라 스토리지의 용량이 탄력적으로 증가/감소하게 된다. 이러한 특징은 적절한 용량IOPS 등을 예측하기 힘든 공유 파일 스토리지를 운영의 번거로움을 크게 줄여줄 뿐만 아니라 비용을 최소화할 수 있다는 장점이 있다.

다양한 성능 옵션

Throughtput, IOPS 등과 같이 디스크 성능과 관련된 다양한 옵션을 제공한다. 사용자는 어플리케이션의 요구에 맞춘 최적의 file storage를 구성할 수 있다. 주요 옵션으로 General PurposeMax I/O 모드를 지원한다. General Purpose모드와 Max I/O 모드는 각각 low-latencyhigh throughput & high IOPS에 최적화 되어있다. 따라서, latency-sensitive한 어플리케이션의 경우 General Purpose, Large-scale and data-heavy 어플리케이션은 Max I/O가 좋은 선택지가 될 수 있다.

고가용성

AWS EFS는 서로 다른 AZ에 데이터를 복제하는 방식으로 높은 데이터의 안정성과 가용성을 보장한다.

보안 정책

AWS EFS는 VPC security groupnetwork ACL을 기반으로 네트워크 정책을 구성할 수 있다. 추가적으로, IAM을 통한 권한 제어가 가능하다. AWS EFS를 마운트한 이후에는 일반적인 파일 시스템과 동일하게 POSIX permission 설정을 지원한다.

Architecture

NFS client

NFS server에 해당하는 AWS EFS를 마운트하여 사용하는 EC2 인스턴스에 해당한다. NFS clientmount point를 통해 AWS EFS에 접근할 수 있다. 그림 상에서는 모든 AZ에서 AWS EFS를 사용할 수 있는 것으로 표현되었으나, 실제로는 storage class에 따라서 AWS EFS에 접근할 수 있는 AZ의 수가 제한될 수 있다.

Mount target

NFS clientAWS EFS를 마운트하기 위해 필요한 NFSv4 endpoint로 IP 주소와 DNS를 제공한다. Standard storage class를 사용하는 경우, 각 AZ마다 1개의 mount taget을 생성할 수 있다. One Zone storage class를 사용하는 경우, AWS EFS가 위치한 AZ에만 제한적으로 1개의 mount point를 생성할 수 있다.

DNS name/ File System ID

NFS client가 편리하게 AWS EFS에 접근하기 위해 제공되는 DNS 서비스이다.

Kernel version

공식 문서에 따르면 AWS EFS 성능을 최대화하기 위해 NFSv4 프로토콜을 지원하는 4.0 버전 이상의 리눅스 커널이 설치된 OS 사용을 권장한다. 대표적으로 Ubuntu의 경우, 16.04 버전 이후로 4.0버전 이상의 리눅스 커널을 탑재하고 있다.

추가적으로, AWS EFSAmazon Linux OS를 제외한 기타 리눅스 계열 OS(ex, Ubuntu, Redhat)에서 AWS EFS를 편리하게 마운트하기 위한 유틸리티 라이브러리(amazon-efs-utils)를 제공한다.

아래는 Standard NFS mount를 사용하여 NFS client에서 AWS EFS를 마운트하기 위한 명령어의 예시이다.

$ sudo mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport file-system-DNS-name:/ ~/efs-mount-point 

NFS Mount Helper(amazon-efs-utils)를 사용하면 위 과정을 단순화 할 수 있다.

mount -t efs -o tls file-system-id efs-mount-point

Tip 01: NFSv4.1을 사용하기
동일한 NFSv4 내에서도 NFS 버전에 따른 성능 차이가 존재한다. AWS 웨비나에서 진행한 PoC 테스트에서는 NFSv4.1이 약 3배 정도 높은 성능을 보이는 것을 확인할 수 있다.

Tip 02: 여러 directory에 분산하여 데이터를 저장하기
멀티 스레딩 환경에서 여러 디렉토리에서 분산하여 파일을 저장할 때, 더 좋은 성능을 보인다.
(영상에서는 이 부분은 리눅스의 inode와 관련이 있다고 언급하고 있는데 어떻게 관련이 있는지에 대해서는 이해하지 못 하였습니다. 관련 내용을 댓글로 남겨주시면 정말 큰 도움이 될 것 같습니다. 감사합니다.)

Tip 03: 데이터를 복사할 때에는 multi-threaded 명령어를 사용하기
EFS는 multi-threaded + large I/O size로 데이터를 주고받을 때 가장 좋은 성능을 보인다.

Tip 04: Connection time out
Connection time out이 발생하는 원인은 NFS client에서 mount target에 접근할 수 없기 때문이다. 이 경우, nfs 기본 포트(2049)에 대한 네트워크 설정(ex, security group)를 확인해보는 것이 해결책이 될 수 있다.

Summary

References

Amazon EFS (Elastic File System) 이해하고 사용하기 - 김일호 (AWS 솔루션즈아키텍트)

공식문서: Amazon EFS: How it works

profile
안녕하세요

0개의 댓글