데이터베이스 기반 애플리케이션의 가용성 및 성능은 결국 데이터베이스와 환경설정 내용에 영향을 받는다. 데이터베이스는 관계형 및 비관계형, 두 가지 유형이 있으며, 여러분이 데이터를 어떤 방식으로 저장, 조직화, 인출할 것인지에 따라 적합한 데이터베이스를 결정할 수 있다.
5장에서 살펴볼 AWS의 세 가지 관리형 데이터베이스 서비스는 다음과 같습니다.
- Amazon Relational Database Service (RDS)
- Amazon Redshift
- DynamoDB
관계형 데이터베이스는 데이터의 빈번하면서도 빠른 입출력에 최적화하거나, 대용량의 복잡한 쿼리 작업에 최적화할 수 있으며, 이를 위해 환경 구성 방식에 따라 온라인 입출력 처리
(OLTP, OnLine Transaction Processing) 또는 온라인 분석 처리
(OLAP, OnLine Analytic Processing)등 두 가지 유형으로 나눠서 사용할 수 있다.
대규모 OLAP 데이터베이스의 경우 여러 개의 서버를 두고 복잡한 쿼리 작업의 처리를 나눠서 처리하며 이러한 파티셔닝(partitioning) 또는 샤딩(sharding) 작업을 통해 각 서버가 처리해야 할 부분만 맡아서 처리하도록 할 수 있다.
RDS가 제공하는 데이터베이스 엔진은 총 6가지이다.
데이터베이스 엔진이란, 데이터베이스에 데이터를 저장, 조직화, 인출하는 소프트웨어이며, 각 데이터베이스 인스턴스는 오직 하나의 데이터베이스에 엔진만 실행한다. 종류에는 MySQL
, MariaDB
, Oracle
, PostgreSQL
, Amazon Aurora
등이 있다.
RDS는 데이터베이스 인스턴스 클래스의 종류로 스탠다드
, 메모리 최적화
, 성능 가속
등 세 가지 타입의 데이터베이스 인스턴스를 제공한다.
대부분의 사용자의 데이터베이스에 대한 요구 수준에 맞춘 클래스로서 최신의 인스턴스 클래스인 db.m5는 다음과 같은 성능을 지닌다.
- 384GB 메모리
- 96vCPU
- 25Gbps 네트워크 대역폭
- 19,000Mbps (2,375MBps) 디스크 처리용량
메모리 최적화 타입은 높은 수준의 성능을 요구하는 데이터베이스에 적합한 인스턴스 타입이다.
성능 가속 데이터베이스 인스턴스는 개발, 테스트, 비상용화를 고려한 데이터베이스 인스턴스이며, 최신의 클래스인 db.t3는 다음과 같은 성능을 지닌다.
- 32GB of 메모리
- 8vCPU
- 5Gbps 네트워크 대역폭
- 2,048Mbps(256MBps) 디스크 처리용량
AWS는 스토리지의 성능을 초당 입출력 작업량, 즉 IOPS(Input/Output operations Per Second)
로 측정한다. IOPS 수치가 높을수록 데이터베이스가 더욱 빨리 데이터를 저장하고 인출할 수 있다.
단일 I/O 작업에서 전송할 수 있는 데이터의 양은 데이터베이스 엔진이 사용하는 페이지 크기만큼 달라지는데 예를 들어, 여러분이 초당
102,400KB(100MB)
의 데이터를 읽어야 하는데 페이지 크기가16KB
라면, 여러분의 데이터베이스는 초당 6400개의 16KB 페이지를 읽어들일 수 있어야 한다. 각 페이지 읽기 작업이 하나의 I/O 작업으로 간주되므로 여러분의 인스턴스 클래스는 최소6,400 IOPS
의 성능을 필요로 한다고 할 수 있다.
여러분의 데이터베이스 인스턴스가 요구 성능 수준에 미치지 못할 경우 수직적 확장(scale up)
또는 수평적 확장(scale out)
옵션으로 성능 수준을 높일 수 있다.
즉 수직적 확장
이란 인스턴스의 클래스를 업그레이드하는 이와 같은 방식을 수직적 확장 또는 스케일 업이라 부른다.
수평적 확장
은 읽기 전용 복제본(read replicas)
이라 부르는 데이터베이스 인스턴스를 추가하는 방법으로 구현 가능하다. Microsoft SQL Server를 제외한 모든 데이터베이스 엔진이 읽기 전용 복제본을 지원하며, Aurora의 경우 독자적인 읽기 전용 복제본인 Aurora replica를 제공한다.
읽기 전용 복제본은 말 그대로 데이터베이스에 대한 쿼리 작업만 가능한 또 다른 형태의 데이터베이스 인스턴스이며, 마스터 데이터베이스 인스턴스의 쿼리 작업 부담을 줄여 주어 마스터 데이터베이스 인스턴스가 쓰기 작업에 집중할 수 있도록 도와준다.
하지만 마스터의 데이터는 비동기적으로(asynchronously)
읽기 전용 복제본에 저장되므로 마스터에 데이터가 기록된 시점과 읽기 전용 복제본에서 해당 데이터를 읽을 수 있는 시점에는 약간의 차이가 발생한다.
따라서 데이터 유실의 문제가 중요한 이슈인 경우, 읽기 전용 복제본은 재난 복구용으로 적합하지 않다.
데이터베이스 인스턴스 중단 상태가 발생하더라도 데이터베이스가 문제 없이 실행되도록 하려면, 다수의 AZ에 다수의 데이터베이스 인스턴스를 배포하는 것이 좋으며 RDS에서는 이를 멀티 AZ 배포라고 부른다.
하나의 AZ에 기본 또는
프라이머리(primary)
데이터베이스 인스턴스를 두어 읽기 및 쓰기 작업을 담당하도록 하고, 또 다른 AZ에 대기 또는스탠바이(standby)
데이터베이스 인스턴스를 두는 방식이다. 프라이머리 인스턴스가 중단되면, 2분 내에 스탠바이 인스턴스로 데이터베이스를 복구하게 된다.
앞서 OLAP 데이터베이스가 고성능의 컴퓨팅 파워가 요구되는 복잡한 쿼리를 위해 여러 개의 데이터베이스가 하나의 큰 데이터베이스로 통합된 데이터 웨어하우스 애플리케이션이라고 설명한 것이 기억날 것이다. Amazon Redshift
는 바로 그런 목적으로 만들어진 관리형 데이터베이스 웨어하우스 서비스이며, PostgreSQL을 기반으로 하지만 RDS와는 별개로 존재한다. Redshift는 칼럼 단위로 데이터를 저장하는 칼럼형 스토리지(columnar storage)로서 저장 속도가 빠르고 효율적이며, 개별 칼럼에서 신속하게 쿼리 작업을 수행한다.
Redshift는 스토리지에서 소요되는 칼럼의 수를 줄이기 위해 압축 인코딩(compression encodings)
기법을 사용하며, 사용자가 수동으로 칼럼 단위로 압축할 수도 있다.
Redshift 클러스터는 하나 이상의 컴퓨터 노드를 지니며, 컴퓨터 노드는 덴스
및 리더
, 두 가지 종류가 있다.
Redshift 데이터베이스의 행은 다수의 컴퓨터 노드에 분산 저장되며, 데이터 분산 방식으로는 EVEN
, KEY
, ALL
등의 유형이 있다.
EVEN
: 리더 노드가 모든 컴퓨터 노드에 균일하게 분산되는 형태KEY
: 단일 칼럼 내 값에 따라 데이터가 분산되는 형태ALL
: 각각의 테이블이 모든 컴퓨터 노드에 분산 저장되는 형태
DynamoDB
는 각종 관리 업무를 지원하는 비관계형 데이터베이스 서비스로서 다수의 파티션에 분산된 데이터 구조를 이용해서 초당 수천 회의 읽기 및 쓰기 작업을 처리한다. 여기서 파티션(partiton)이란 테이블을 위한 스토리지 할당 영역이며, 다수의 AZ에 존재하는 SSD 장치를 이용한다.
DynamoDB는 스캔
과 쿼리
, 두 가지의 테이블 읽기 방식을 제공한다.
스캔 (scan)
먼저 스캔(scan)은 테이블 내 모든 아이템을 반환한다. 스캔은 읽기 집약적인(read-intensive)방식이므로 여러분의 읽기 유닛을 모두 소진할 수 있다.
쿼리 (query)
다음, 쿼리(query)는 파티션 키 값에 따라 아이템을 반환한다. 쿼리 실행 시 파티션 키와 정확하게 일치하는 아이템만 반환된다.