Amazon DynamoDB
: 완벽하게 관리되는 고가용성의 NoSQL 데이터베이스
- DynamoDB는 프로비저닝, 패치 또는 관리할 서버와 설치, 유지 관리 또는 운영할 소프트웨어가 없는 서버리스이다. 용량을 조정하고 성능을 유지하기 위해 테이블을 자동으로 확장 및 축소한다. 프로비저닝된(RCU 및 WCU 지정) 및 온디맨드(사용한 만큼 지불) 용량 모드를 모두 제공한다.
Basics
- 테이블로 구성
- 각 테이블은 기본 키를 가지고 있다.
- 각 항목에는 속성이 있다.(테이블의 열과 비슷)
- 각 항목, 행의 데이터의 최대 크기는 400KB로 제한
Primary Keys
- 좋은 파티션 키를 선택하기 위해서는 충분히 분산되어야 한다.
Partition Key(HASH)
: 항목마다 고유해야 한다.
Partition Key + Sort Key(HASH+RANGE)
: 항목마다 고유해야하며, 데이터틑 파티션 키에 의해 그룹으로 묶인다.
Read/Write Capacity Modes
Provisioned Mode(default)
: 초당 읽기/쓰기를 지정한다.
- 프로비저닝한 것보다 더 많이 소비했다면 "Burst Capacity"를 일시적으로 사용할 수 있다.
- 만약 버스트 용량을 다 소진하면 "ProvisionedThroughputExceededException"라는 예외가 발생한다.
- 이런 예외가 발생하면 지수 백오프 전략을 사용한다.
Write Capacity Units(WCU)
: 쓰기 처리량
- 최대 1KB 항목에 대해 초당 1개의 쓰기를 의미한다.
- WCU를 계산할 때는 항상 올림한다.
Read Capacity Units(RCU)
: 읽기 처리량
Strongly Consistent Read vs Eventually Consistent Read(default)
Eventually Consistent Read의 경우 쓰기 후에 릭기를 한다면 오래된 데이터를 얻을 가능성이 있다. Strongly Consistent Read라면 쓰기 이후에 데이터를 읽기 원하면 막 쓰인 데이터를 올바르게 읽을 수 있다. 대신, RCU를 2번 소비하기 때문에 더 비싼 쿼리가 될 성이고 지연 시간도 좀 더 높다.
- 읽기 용량 유닛은 크기가 최대 4KB인 항목마다 초당 강력한 일관된 읽기 1개 또는 초당 최종적 읽기 1개를 의미한다.
On-Demand Mode
: 워크로드에 기반해서 읽기와 쓰기를 자동으로 스케일 업/다운 한다.
Partitions Internal
: 파티션 키만이 해싱 알고리즘을 통해 어느 파티션으로 이동해야 하는지 알 수 있다.
- 각 파티션에 1WCU와 1RCU가 고르게 분배된다.
Throttling
: 파티셔닝 수준에서 RCU와 WCU를 초과할 때 프로비저닝 처리량 초과 예외가 발생한다.
Reasons
- Hot Keys
- Hot Partitions
- 너무 큰 항목
solutions
- 지수 백오프 사용
- 파티션 키를 최대한 분산
- 만약 하나의 데이터 포인트를 읽거나 하나의 파티션을 집중적으로 읽어서 생긴 RCU 문제라면 DynamoDB Accelerator(DAX)라능 기능을 사용한다.
Write Data
- PutItem: 기본 키가 같은 새 항목을 만들거나 완전히 교체한다.
- UpdateItem: 기존 항목의 속성을 편집하거나, 기존 항목이 없으면 새 항목을 추가한다.
- Conditional Writes: 조건이 충족되었을 때에만 쓰기/압데이트/삭제가 수락된다.
Reading Data
- GetItem: 기본 키에 기반하여 읽는다(HASH or HASH+RANGE). ProjectionExpression을 통해 DynamoDB의 속성 몇가지만을 받을 수 있다.
- Query: KeyConditionExpression, FilterExpression
SCAN
: 전체 테이블을 내보내고 각 Scan은 최대 1MB의 데이터를 반환한다.
- 성능을 빠르게 하려면 병렬 스캔을 사용
- ProjectionExpression, FilterExpression
Deleting Data
- DeleteItem: 개별 항목 삭제 시 사용하고 조건부 삭제도 가능하다.
- DeleteTable: 테이블에 있는 모든 걸 삭제한다.
Batch Operations
- BatchWriteItem: 호출 한번으로 최대 25번의 PutItem 또는 DeleteItem을 수행할 수 있다. 항목을 작성알 수 없는 경우 UnprocessedItems라는 것이 반환된다.
- BatchGetItem: 하나 이상의 테이블에서 항목이 반환된다. 일부 항목이 누락될 경우, 용량이 부족해서 읽기 작업에 실패하고 UnprecessedKeys가 반환된다.
PartiQL
: SQL 형식의 구문을 사용해 DynamoDB 테이블을 조작할 수 있다.
Conditional Writes
: 쓰기 작업
- PutItem, UpdateItem, DeleteItem, BatchWriteItem
- 수정해야 할 항목을 결정할 조건 표현식을 지정할 수 있다.
- 필터 표현식은 읽기 쿼리와 관련이 있지만, 조건 표현식은 쓰기 작업에만 관련된다.
Example on Delete Item
- attribute_not_exists: 값이 없어 속성이 아직 존재하지 않을 때만 성공
- attribute_exists: 속성이 존재하는 것을 확인
Example of String Comparisons
Local Secondary Index(LSI)
: 테이블에 대체 정렬 키를 제공한다.
- 반드시 테이블 생성 시점에 정의돼야 한다.
- LSI에서는 메인테이블로부터 일부 또는 전체 속성을 얻을 수 있다.
Global Secondary Index(GSI)
: 대체 기본 키를 제공한다.
- 인덱스에서 프로젝션할 속성을 지정할 수 있다.
- 테이블 생성 후에도 추가나 생성이 가능하다.
Indexes and Throttling
- GSI가 있을 때 쓰기가 GSI에서 스로틀 되면 멩인테이블도 스로틀 된다.
Optimistic Locking
: DynamoDB에서 업데이트하거나 삭제하기 전에 항목이 변경되지 않도록 한다. 특정 조건이 충족되었을 때만 쓴다(조건부 쓰기).
DynamoDB Accelerator(DAX)
: DynamoDB를 위한 왅전 관리형, 고가용성, 무결절성 인메모리 캐시
- DynamoDB에서 가장 인기 있는 항목이나 쿼리의 캐시를 용이하게 한다.
- DynamoDB Accelerator(DAX)는 최대 10배의 성능 향상을 제공하는 DynamoDB용 완전 관리형 고가용성 인메모리 캐시이다. 가장 자주 사용되는 데이터를 캐싱하여 DynamoDB 테이블의 핫 키에 대한 대량 읽기를 오프로드하여 "ProvisionedThroughputExceededException" 예외를 방지한다.
DynamoDB Accelerator(DAX) vs ElastiCache
DynamoDB Streams
: 테이블에서 발생하는 생성, 업데이트, 삭제와 같은 항목 수준 수정의 정렬된 목록
- 스트림 레코드는 Kinesis Data Streams로 보내지고, AWS Lambda, Kiinesis Client Library applications 로 읽는다.
- DynamoDB 스트림을 사용하면 DynamoDB 테이블에서 항목 수준 수정의 시간 순서 시퀀스를 캡처할 수 있다. AWS Lambda와 통합되어 실시간으로 이벤트에 자동으로 응답하는 트리거를 생성한다.
- KEYS_ONLY: 수정된 모든 키 속성의 리스트를 보여준다.
- NEW_IMAGE: 수정된 새 항목을 나타낸다.
- OLD_IMAGE: 수정 전의 모든 항목을 나타낸다.
- NEW_AND_OLD_IMAGES: 전체 정보를 얻을 수 있다.
- DynamoDB Streams을 활성화하면 레코드는 스트림에 소급해서 보낼 수 없다.
DynamoDB Streams & AWS Lambda
: DynamoB Streams에서 읽기 위해서 이벤트 소스 매핑을 정의해야 하고 람다 함수가 DynamoDB Streams에서 폴링할 수 있는 적합한 권한이 있는지 확인하면 람다 함수가 동시에 호출된다.
TimeToLive(TTL)
: 타임 투 리브를 사용하면 타임스탬프 만료 이후에 자동으로 아이템을 삭제할 수 있다.
- 타임스탬프 값은 Unix Epoch 타임스탬프의 값을 나타내는 숫자여야 한다.
DynamoDB CLI - Good to Know
- --projection-expression: 한 개 이상의 속성을 지정해서 가져올 수 있다.
- --filter-expression: 반환되는 아이템을 필터링한다.
- --page-size: 더 많은 API 호출이 가능해지고 시간 초과를 방지한다.
- --max-items: CLI 호출 결과에 대해서 재한된 숫자의 아이템을 보여준다.
- --starting-token: NextToken을 통해 다음 셋을 받는다.
DynamoDB Transactions
: 트랜잭션을 사용하면 하나 이상 테이블의 여러 아이템에 양단간 작업을 할 수 있게 된다.
- Read Modes: 최종 일관성, 강력한 일관성, 트랜잭션 일관성
- Write Mdoes: 표준, 트랜잭션
- 트랜잭션 기능은 필요한 쓰기 및 읽기 용량 단위의 두 배를 소비한다.
Capacity Computations
DynamoDB as Session State Cache
vs ElastiCache
- ElastiCache는 인메모리, DynamoDB는 서버리스
- 모두 키/값 스토어이다.
vs EFS
- EFS는 네트워크 드라이브로 EC2 인스턴스에 연결되어야 한다.
vs EBS & Instance Store
- EBS & Instance Store은 로컬 캐싱에만 사용할 수 있고 공유 캐싱에는 불가능하다.
vs S3
- 세션 상태로서 S3 캐시는 지연 시간이 높기 때문에 유용하지 않다.
DynamoDB Write Sharding
: 파티션 키 값에 접미사나 접두사를 추가하여 파티션 키를 더 많이 분배시킬 수 있다.
Write Types
Concurrent Writes
Atomic Writes
Batch Writes
Large Objects Pattern
: 큰 객체를 DynamoDB에 저장한다.
DynamoDB Operation
Table Cleanup
- Scan + DelteItem
- Drop Table + Recreate table
Copying a DynamoDB Table
- Using AWS Data Pipeline
- Backup and restore into a new tavle
- Scan + PutItem or batchWriteItem
Security & Other Features
Security
Backup and Restore feature available
Global Tables
DynamoDB Local
Users Interact with DynamoDB Directly
: 사용자들이 신분 제공자들을 통해 로그인을 하면 일시적인 AWS 자격 증명을 위해서 이들이 제공받은 자격 증명을 교환한다.
Fine-Grained Access Control
: 연결 로그인을 이용해서 파인 그레인 액세스 제어가 가능하며 LeadingKeys로 조건을 지정함으로써 row 레벨에서의 제한이 가능하고 속성, 즉 컬럼 레벨에서 제한을 하려면 속성 조건을 지정할 수 있다.
- 연합 로그인을 통해서 일시적 자격 증명이 주어지고 IAM 역할이 생성된다.
- LeadingKeys: 기본 키 값을 기반으로 해서 사용자들에게 row 수준의 액세스만을 제한한다.