AWS EFS
는 파일 방식으로 데이터를 저장하는 AWS의 대표 fully-managed file storage
서비스이다. 파일 스토리지는 일반적으로 OS에서 이용되는 파일 시스템에 사용되는 비교적 친숙한 방식의 스토리지이다. AWS EFS
가 갖는 주요 특징들은 다음과 같다.
파일 스토리지는 block
혹은 object
방식의 스토리지와 달리, 폴더와 파일로 구성된 계층적 구조를 갖는다.
AWS EFS
는 SAN
방식으로 구현된 AWS EBS
와 다르게, NFS
(Network File System)를 기반으로 여러 EC2
인스턴스가 동일한 파일 시스템을 공유할 수 있다. AWS EFS
는 기본적으로 수 천 여개의 concurrent NFS connection
을 지원한다.
Elastic
이라는 이름처럼, AWS EFS
는 파일이 추가/삭제됨에 따라 스토리지의 용량이 탄력적으로 증가/감소하게 된다. 이러한 특징은 적절한 용량
과 IOPS
등을 예측하기 힘든 공유 파일 스토리지를 운영의 번거로움을 크게 줄여줄 뿐만 아니라 비용을 최소화할 수 있다는 장점이 있다.
Throughtput
, IOPS
등과 같이 디스크 성능과 관련된 다양한 옵션을 제공한다. 사용자는 어플리케이션의 요구에 맞춘 최적의 file storage
를 구성할 수 있다. 주요 옵션으로 General Purpose
와 Max I/O
모드를 지원한다. General Purpose
모드와 Max I/O
모드는 각각 low-latency
와 high throughput
& high IOPS
에 최적화 되어있다. 따라서, latency-sensitive
한 어플리케이션의 경우 General Purpose
, Large-scale and data-heavy
어플리케이션은 Max I/O
가 좋은 선택지가 될 수 있다.
AWS EFS
는 서로 다른 AZ
에 데이터를 복제하는 방식으로 높은 데이터의 안정성과 가용성을 보장한다.
AWS EFS
는 VPC security group
과 network ACL
을 기반으로 네트워크 정책을 구성할 수 있다. 추가적으로, IAM
을 통한 권한 제어가 가능하다. AWS EFS
를 마운트한 이후에는 일반적인 파일 시스템과 동일하게 POSIX permission
설정을 지원한다.
NFS server
에 해당하는 AWS EFS
를 마운트하여 사용하는 EC2
인스턴스에 해당한다. NFS client
는 mount point
를 통해 AWS EFS
에 접근할 수 있다. 그림 상에서는 모든 AZ
에서 AWS EFS
를 사용할 수 있는 것으로 표현되었으나, 실제로는 storage class
에 따라서 AWS EFS
에 접근할 수 있는 AZ
의 수가 제한될 수 있다.
NFS client
가 AWS EFS
를 마운트하기 위해 필요한 NFSv4 endpoint
로 IP 주소와 DNS를 제공한다. Standard storage class
를 사용하는 경우, 각 AZ
마다 1개의 mount taget
을 생성할 수 있다. One Zone storage class
를 사용하는 경우, AWS EFS
가 위치한 AZ
에만 제한적으로 1개의 mount point
를 생성할 수 있다.
NFS client
가 편리하게 AWS EFS
에 접근하기 위해 제공되는 DNS
서비스이다.
공식 문서에 따르면 AWS EFS
성능을 최대화하기 위해 NFSv4
프로토콜을 지원하는 4.0
버전 이상의 리눅스 커널이 설치된 OS 사용을 권장한다. 대표적으로 Ubuntu
의 경우, 16.04
버전 이후로 4.0
버전 이상의 리눅스 커널을 탑재하고 있다.
추가적으로, AWS EFS
는 Amazon 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
)를 확인해보는 것이 해결책이 될 수 있다.
Amazon EFS (Elastic File System) 이해하고 사용하기 - 김일호 (AWS 솔루션즈아키텍트)