(출처: https://www.youtube.com/watch?v=U_GJYMUjiwA&t=2s )
DynamoDB
- Key-Value 형식의 NoSQL
- 다수의 서비스들과 컴퓨팅이 결합된 분산 시스템 구조
- 3 AZ - 3 copy / 수백만의 요청에 한자리 ms 지연시간(모든 규모에서 10ms 미만)
- Data types: String, Number, Binary, Bool, Null, List, Set of String/Number, Map
동작 방식
- Item: 테이블에 저장되는 레코드
- 각 Item들은 RDBMS에서 Column 이라 부르는 Attributes로 구성
- 하나의 테이블은 Partition Key를 기준으로 분산됨
- Partition Key 필수(사용자 ID와 같은 unique한 데이터)
- 결국 Partition Key는 물리적인 공간인 파티션을 특정하는 키
- Partition Key + Sort Key = PK(Primary Key)
- PK는 유일 조건을 만족해야 함
- Sort Key: 파티션 내에서 정렬하는 기준 값
- DynamoDB Secondary Index:
- LSI(Local Secondary Indexes): 원본 테이블과 파티션 키를 같이 가져감 → 테이블에 속한 인덱스
- GSI(Global Secondary Indexes): 원본 테이블로부터 복사본을 갖는 별도의 테이블(원본 테이블과 다른 파티션 키를 생성 가능) → Item을 조회하기 위한 또 다른 (PK + SK)를 추가할 수 있음!!
- DynamoDB의 성능: RCU / WCU
SQL / NoSQL
- RDBMS와 다르게 정규화 과정이 없으며 액세스 패턴에 따라 Item의 Attribute들이 달라질 수 있음
- 기존에 테이블들로 분리했던 데이터들은 Document 형식으로 데이터 처리 가능
DynamoDB 테이블
- partition key에 의해 분산되며 같은 노드에서 sort key로 정렬됨
- 각 Item의 Attribute들은 schemaless 방식으로 순서 및 개수에 상관 없이 저장 가능
Partitioning
- OrderId가 Partition Key, 해당 OrderId는 해시함수에 의해 물리적으로 Partition된 노드로 전환
- 요청 받은 파티션 키를 파라미터로 Hash Value를 도출하여 파티션이 결정되기 때문에 테이블이 아무리 커져도 Hash Value를 도출해 빠른 속도로 해당 데이터에 접근하기 때문에 일관된 응답 시간을 제공할 수 있음!!
- Partition Key 연산은 "Equal" 만 가능!!
- 설정된 용량은 각 노드에 균등하게 배분되어 리소스로 사용됨
- 1 Partition 의 크기 = 10GB / 1 Item = Max 400 KB / 1 Partition에는 25000개의 Item이 들어감
- 1 Partition의 최고 RCU = 3000 / 최고 WCU = 1000
- Sort Key는 동일 파티션 키에 대해서 정렬 기준으로 사용 됨
- 연산: 선택, 범위 연산 가능(>, >=, <, <=, begin_withs, between)
- Customer#가 같은 애들은 같은 파티션에 저장되며 Order#에 대해 정렬됨
LSI(Local secondary index)
- Table과 같은 파티션 키를 가지고 sort key를 별도로 구성이 가능하다
- 용량은 10GB(테이블당 5개)
- Projection: 인덱스에 어떤 Attribute를 추가할지 결정하는 것
- KEYS_ONLY / INCLUDE / ALL
- 최대한 안쓰는 걸 추천!
- LSI는 파티션 키를 테이블의 파티션 키와 동일하게 설정해야하기 떄문에 두 파티션 키가 같은 데이터를 바라보고 연산한다는 점에서 별루.. 또, 테이블 생성 시에만 생성 가능하고, 삭제 불가능
GSI(Global secondary index)
- Table과 다른 파티션 키를 가질 수 있음 → Item을 조회하기 위한 또다른 (PK + SK) 추가
- 원본 Table로 부터 새로운 테이블을 만드는 방식(원본 테이블 변경되면 GSI의 테이블도 동기화 되는 구조)
- 별도의 저장공간 필요(용량 제한 없음)하기 때문에 RCUs/WCUs 설정해야함
- 원본 Table의 저장 성능을 보장하기 위해 같은 Capacity설정 권장
- 중요한게... Eventual Consistent Read / Strong Consistent Read 가 있는데 GSI는 Strong Consistent Read 불가!!
- Eventual Consistent Read: 응답 속도는 빠르지만 최근 완료된 쓰기 작업 결과가 반영되지 않아 최종적인 데이터를 가져오지 않음(3 AZ에서 젤 빠른거 가져옴)
- Strong Consistent Read: 응답 속도는 느리지만 최근 완료된 쓰기 작업 결과가 반영됨(3 AZ 변경 다 하고 나서 가져옴, GSI 사용 불가)
Burst capacity
- Partition당 사용되지 않는 용량을 최대 5분동안 저장
- 설정된 용량 이상의 요청이 들어올 경우 저장된 용량을 사용할 수 있음
- Partition 1,2,3에 미사용 용량이 Partition 4로 넘어가 초과되는 용량을 커버쳐줌
- 커버를 치지 못할 경우 Throttling 발생 → "Hot Partition"
- 500 Error 리턴 후 write 요청 실패
- 특정 파티션에 지속적으로 예기치 않은 요청이 오는 것을 막을 수 있도록 파티션 키의 변경이 필요함
- 만약 워크로드가 예상된다면, provisioned 모드에서 on-demand 모드로 변경
테이블 설계 예시
- ProductID 2에 대해 type을 보면, albumID의 track에 대해 Attributes가 존재하도록 구성 가능
- 하나의 ProductID에 대해서 Attribute에 document 형식으로 데이터 관리 가능
❗ 아래의 링크는 DynamoDB 데이터 설계할 때 도움이 많이 될만한 블로그 이다.. ❗
'Cloud > AWS' 카테고리의 다른 글
[AWS] Serverless Service - DynamoDB 편(3) (0) | 2022.12.07 |
---|---|
[AWS] Serverless Service - DynamoDB 편(2) (0) | 2022.12.05 |
[AWS] AppStream 2.0 (0) | 2022.11.26 |
[AWS] Amazon QuickSight 개념 및 실습 (0) | 2022.11.20 |
[AWS] Amazon Athena 사용법 -3 (0) | 2022.11.20 |