본문 바로가기

AWS

DynamoDB

 

DynamoDB

AWS에서 만든 PAAS (Platform As An Service)로 NoSQL 기반의 완전 관리형 DBMS입니다.

NoSQL은 RDBMS처럼 스키마가 정해져 있지 않고 비정형적인 데이터를 저장하는데 유용합니다.

DynamoDB는 쿼리 형태가 아닌 JSON 형태로 테이블을 저장한다. 조인이 없으므로 무조건 10밀리 초 미만으로 값이 반환이 됩니다.

 

 

 

DynamoDB 특징

- 테이블의 구조를 변경하는데 큰 제약사항이 없어서 설계를 해서 그 데이터베이스를 적용하기까지 오랜 시간이 걸리지 않습니다. 다만 이러한 이유로 스키마 관리가 쉽지 않습니다.

- 시간에 따라 결과 값이 다를 수도 있음 (Eventual Consistency)-

- 수백만 IOPS를 처리할 수 있는 시스템 설계해두었기 때문에 단순한 인터페이스의 조작만으로 규모를 확장시키기 수월합니다.

- 데이터의 손실을 방지하기 위해서 데이터 베이스를 자동으로 백업해서 복사본을 두고 손실율을 낮추고 있습니다.

- I/O를 하는 시간이 빠른 것은 기본이고 아무리 규모가 증가하고 어떤 장애가 와도 일관적인 응답시간을 보여줍니다.

- NoSQL 특성상 관계가 없기 때문에 일반적으로 데이터를 찾기에는 인덱싱이 없으면 속도가 느려지지만 DynamoDB는 보조 인덱스가 있어 그 부분을 해결해줍니다.

- 작은 용량의 데이터를 처리할 경우, DynamoDB는 아주 효과적으로 사용될 수 있습니다.

- 데이터베이스를 확장해야하고 확장하는 과정에서 분산된 데이터베이스를 관리하기에 힘든 경우 사용하면 유리합니다.

- DynamoDB는 Read/Write Thoughput을 직접 지정할 수 있습니다. 트래픽이 증가하여 사용량이 많아지면 처리량을 늘리고, 사용량이 적어지면 처리량을 줄입니다.

 

 

Partition Key

- 내부 해시 함수에 대한 입력으로 파티션 키 값을 사용.

- 해시 함수 출력에 따라 항목을 저장할 파티션(DynamoDB 내부의 물리적 스토리지)이 결정됨

- 파티션 키로만 구성되어 있는 테이블에서는 동일한 파티션 키 값을 가진 항목이 있을 수 없음 (중복 불가능)

 

 

Sort Key

- 파티션 키 값이 동일한 모든 항목은 정렬 키 값을 기준으로 정렬되어 함께 저장됨

- 파티션 키와 정렬 키로 구성되어 있는 테이블에서는 두 개의 항목이 동일한 파티션 키 값을 가질 수 있으나 두 항목의 정렬 키 값은 달라야 함 (중복 불가능)

 

 

Read 방식

DynamoDB는 데이터를 읽을 때, Eventually Consistent Read, Strongly Consistent Read를 사용

 

 

Eventually Consistent Read

읽기 처리량(Read Throughput)을 최대화하지만 읽은 데이터가 최근 완료된 쓰기 결과를 반영하지 못했을 수 있습니다. 쓰기가 데이터의 모든 복사본에 반영되는 것은 1초내에 이루어지는데, 최신 데이터를 얻으려면 짧은 시간 내에 읽기를 반복해야 합니다.

 

Strongly Consistent Read

위의 Eventually Consistent Read 에서 가지는 복사본에 반영되는 데이터의 시간 1초내에 읽기를 요청하는 경우, 데이터를 최신 데이터로 못 가져오는 결과가 있는데 그러한 경우를 없애고 최근 완료된 쓰기 결과가 모두 반영된 데이터를 가져옵니다.

 

 

인덱스

 

LSI(Local secondary index)

- 테이블과 파티션 키는 동일하지만 정렬 키는 다른 인덱스.

- 동일한 파티션 키 값을 가진 테이블 파티션으로 한정된다는 의미에서 "로컬"

- 테이블 생성과 동시에 LSI도 생성 (이후에는 추가 및 삭제 불가)

- 테이블당 최대 5개까지 생성

- Strong Consistency와 Eventual Consistency 모두 지원

- 테이블에 할당된 처리량(RCU/LCU) 소비

- 추가 속성을 가져오려면 기본 테이블에 대해 추가 읽기 작업 수행

 

 

 

 

GSI(Global secondary index)

- 파티션 키 및 정렬 키가 테이블의 파티션 키 및 정렬 키와 다를 수 있는 인덱스.

- 테이블의 모든 파티션에 적용될 수 있으므로 "글로벌"하게 간주

- 크기 제한 없으며 테이블당 최대 20개까지 생성

- Online Indexing : 테이블 생성과 동시에 생성 가능하며 이후에도 추가 및 삭제 가능

- Eventual Consistency만 지원

- 테이블에 할당된 처리량(RCU/LCU)과 별도로 소비

- 추가 속성을 가져오려면 Query를 2번 수행해야함 (인덱스에서 대상 Item을 가져와서 테이블에 한번 더 조회)

- 테이블과 다르게 GSI는 Partition 값의 중복 허용

- DynamoDB는 속성에 값이 없을 경우 인덱스에서 제외되기 때문에 Sparse Index을 사용하여 비공통적인 속성을 효율적으로 활용

 

 

 

처리 용량

 

 

읽기 용량 단위(RCU)

1 Strongly Consistent Read per second

0.5 Eventually Consistent Reads per second

Items up to 4KB in size

 

쓰기 용량 단위(WCU)

1 Write per second

Items up to 1KB in size

 

 

Partition

- 파티션에는 최대 10GB의 데이터 포함 가능. 항목의 크기 제한이 400KB 인 경우 하나의 파티션에 약 25,000개(= 10GB / 400KB)의 항목을 저장할 수 있음.

- 데이터의 크기에 관계없이 파티션은 최대 3000개의 읽기 용량 단위(RCU) 또는 1000개의 쓰기 용량 단위(WCU) 를 지원함.

- 시간이 지나면 파티션이 새 항목으로 채워지고 데이터 크기가 파티션의 최대 제한 인 10GB를 초과하면 DynamoDB는 파티션을 두 개의 파티션으로 분할함.

- 파티션 분할이 발생하면, 기존의 파티션 항목이 내부 해시 함수에 의해 새 파티션으로 이동할 수 있음 (=rebalancing)

 

 

Burst 와 Throttling

- DynamoDB는 Burst 용량을 제공해 파티션당 처리량 프로비저닝에서 어느 정도 유연성을 제공.

- 나중에 사용량 급증을 처리하기 위해 처리량 버스트에 5분(300초)까지 사용하지 않은 용량 일부를 예약해 둠.

- 경우에 따라 읽기 또는 쓰기 작업이 폭증하는 경우 이 추가 용량 유닛은 매우 빨리 소비될 수 있음.

- Burst 용량으로도 처리량을 수용하지 못할 경우 성능 지연 대신 요청 거부(Throttling) 발생되며, Burst는 파티션 별로 적용됨

 

 

TTL(Time To Live)

- 현재 시간이 속성에 저장된 epoch 시간 값을 지나면 해당 항목이 만료된 것으로 표시된 후 삭제

- 특정 기간이 지나면 관련성이 없어지는 데이터가 지속적으로 축적되는 경우 유용

- 세션 데이터, 이벤트 로그, 사용 패턴, 기타 임시 데이터. 규제 의무에 따라 기밀 데이터를 특정 기간 동안만 보관해야 할 경우

- DynamoDB는 일반적으로 항목 만료 후 48시간 내에 항목을 삭제. 항목이 만료된 후 실제로 삭제되는 정확한 기간은 워크로드 특성과 테이블 크기에 따라 다를 수 있으며 만료된 후 삭제되지 않은 항목은 읽기, 쿼리, 스캔 작업에서 계속 표시됨

 

 

CreateTable

{

TableName : "테이블이름",

KeySchema: [

{

AttributeName: "속성명",

KeyType: "HASH", //Partition key, 파티션 방식

},

{

AttributeName: "속성명",

KeyType: "RANGE" //Sort key, 파티션 방식

}

],

AttributeDefinitions: [

{

AttributeName: "속성명",

AttributeType: "데이터타입"

},

],

ProvisionedThroughput: { // 프로비져닝할 RCU, WCU 지정

ReadCapacityUnits: 1,

WriteCapacityUnits: 1

}

}

 

 

DescribeTable // 테이블 설명

 

 

PutItem

{

TableName: "테이블명",

Item: {

"속성명":"값",

"속성명": {

"속성리스트": [

"값1",

"값2",

.....

],

}

}

}

 

 

GetItem

{

TableName: "테이블명",

Key: {

"키_속성명": "값",

}

}

 

 

Query

{

TableName: "테이블명",

KeyConditionExpression: "속성명 = :변수1 and 속성명 = :변수2",

ExpressionAttributeValues: {

":변수1": "값",

":변수2": "값"

}

}

 

 

 

Scan

// 모든 속성을 읽음

{

TableName: "테이블명"

}

 

// 특정 속성의 값만 읽어옴

{

TableName: "테이블명",

ProjectionExpression: "속성명1, 속성명2"

}

 

 

 

 

 

'AWS' 카테고리의 다른 글

AWS 예상치 못한 비용 환불(Refund) 받기  (1) 2021.04.12
Amazon CloudWatch  (0) 2021.04.12
Amazon Simple Storage Service (Amazon S3)  (0) 2021.04.12
Amazon RDS  (0) 2021.04.12
AWS Aurora  (0) 2021.04.12