본문 바로가기

# Tech/DynamoDB

DynamoDB 깊게 입문하기 (2) - DynamoDB Deep Dive (2)



DynamoDB 주요기능 - Stream

테이블에 조작(추가/삭제/갱신)이 가해질 때 발생하는 비동기적 알림 데이터.

AWS 서비스에서 트리거로써 활용될 수 있다.



어떤 조작이 가해졌는지,

OLD_VALUE와  UPDATED_VALUE에 대한 정보도 들어있다.


dynamodb stream에 대한 이미지 검색결과




DynamoDB 주요기능 - TTL

데이터에 수명을 달아주는 기능.

각 아이템 항목마다 MyTTL 속성이 추가되며, 해당 시각이 자나가면 테이블에서 삭제된다. 

단, 데이터가 생성되고 몇 분 이후에 사라지는 개념이 아니라,

데이터가 생성될 때 애초에 데이터가 사라지는 시각을 정하는 방식이다.


(2020-02-13 추가됨)

TTL이 초과되어 데이터가 삭제되는 경우에는 WCUs도 사용되지 않고 요금도 발생하지 않는다.

수작업으로 데이터를 삭제하지 않아도 되고, 요금도 싸게 먹힌다.



(2020-02-13 추가됨)

TTL이 지난 데이터가 삭제되기까지 딜레이가 있을 수 있다.

즉, 데이터를 조회했을 때 TTL이 지난 데이터가 포함될 수 있다는 것이다.

이러한 불상사를 막으려면, 만료된 항목을 필터링하는 조건식을 포함하여 조회해야 한다. 


dynamodb ttl에 대한 이미지 검색결과




DynamoDB 주요기능 - DAX (DynamoDB Accelerator)

인 메모리 캐싱 서비스.

이 기능을 활성화하면 자동적으로 캐싱이 제공된다.

시간당으로 추가적인 온디멘드 요금이 청구되므로 주의.



(2020-02-13 추가됨)

아직 서울리전에서는 지원하지 않는다.

캐싱이 꼭 필요하다면 일본리전으로 옮겨서 사용하거나,

반드시 서울리전에서 서비스해야 한다면 DAX를 제외한 다른 캐싱전략을 사용해야 한다.


dynamodb dax에 대한 이미지 검색결과




DynamoDB 주요기능 - Transaction

원자성 연산의 단위.

NoSQL에서는 트랜잭션 미지원이 대표적인 단점이였지만,

DynamoDB에서는 이 문제를 해결했다고 셀링 포인트로 홍보하고 있다.


dynamodb transaction에 대한 이미지 검색결과




데이터 모델링 기본


타입을 결정하는 속성을 두고,

타입에 따라 추가속성이 결정되도록 계층적 구조로 관리.



(2020-02-13 추가됨)

TYPE === 1 (또는 book_ID !== null)이라면 BOOK 데이터이고,

book_title, total_page, ... 와 같은 속성이 있을것이고.

TYPE === 2 (또는 video_ID !== null)이라면 VIDEO 데이터이고,

video_title, total_time, ... 와 같은 속성이 있을것이라는 이야기이다.


Data modeling: Hierarchical data structures as items
• Use composite sort key to define a hierarchy
• Highly selective res...




모델링 예제 (1) : 데이팅 어플

요구사항

> 내가 LIKE한 사람을 알 수 있어야 함.

> 누가 나를 LIKE했는지 알 수 있어야 함.

> LIKE는 90일이 지나면 만료됨.

> 1시간마다 매치가 된 사람을 처리해야 함.

> LIKE 정보와 MATCH 정보는 각각의 테이블에 저장되어야 함.



LIKE 디자인

> 자신의 아이디를 Hash Key로 지정.

> 내가 좋아한 사람을 Range Key로 지정.

> 누가 자신을 좋아했는지 알 수 있도록, GSI로 역방향 인덱스를 구성.

> 90일이 지나면 만료되도록 TTL 서비스를 활성화한다.



MATCH 디자인

> 매치 이벤트에 고유 아이디를 부여하고 Hash Key로 설정.

> 좌측, 우측 유저의 관점으로 각각 GSI를 생성.





비효율적인 MATCH 감지 알고리즘

1. 매 시간마다 새롭게 생성된 LIKE를 가져온다.

2. 각 LIKE에 대해, 다른 사람도 나를 LIKE하는지 검사한다.

3. 매칭되었다면 MATCH 테이블에 저장한다.


> 특정 시간에 한꺼번에 LIKE 테이블에 읽기 접근이 발생하므로,

> 쓰로틀이 발생할 확률이 급증함.




개선된 MATCH 알고리즘

1. LIKE가 발생하는 즉시, 다른 사람도 날 LIKE하는지 검사한다.

2. 매칭되었다면 MATH 테이블에 저장한다.


> LIKE 테이블에 Stream를 활성화하여 Match를 발생시키는 API를 트리거한다. 

> 인 메모리 캐싱 기능인 DAX을 활성화하면 더욱 효과적이다.





모델링 예제 (2) : IoT

요구사항

> 각 사용자는 여러개의 센서를 가지고 있음.

> 센서에서 취득된 데이터가 DB에 저장됨.

> 언제 데이터가 취득되었는지 (시계열 순서)가 중요함.

> 90일이 지나면 S3 스토리지로 이동할 것.



스키마 디자인

> 시계열 정렬을 할 수 있도록 Timestamp를 Range Key로 설정함.

> 90일이 지나면 만료되도록 TTL 기능을 활성화한다.

> TTL이 지나서 삭제된 데이터를 감지할 수 있도록 Stream 기능을 활성화 한다.

> Stream에 삭제 이벤트로 전달된 데이터는 S3 버킷에 집어넣는다.



성능 이슈

> 디바이스 ID가 파티션키이므로, 

> 같은 디바이스에서 수집된 데이터는 같은 파티션에 존재한다. 

> 다른 얘들보다 데이터를 많이 수집하는 센서가 문제인데,

> Heavy하게 데이터를 수집하는 센서의 파티션은 쓰로틀링이 발생할 수 있다.




다이나믹 샤딩 (Dynamic Sharding)

> 동적으로 데이터가 저장될 파티션을 결정하는 기법.

> 분산 저장과 가장 의미가 비슷할 듯.

> 여기서는 랜덤함수로 저장될 파티션을 지정한다.  (라운드 로빈도 가능!)

> 원래 Data 테이블의 파티션키에 ShardId를 덧붙인다.





다이나믹 샤딩수준 결정

> 각 기기마다 다이나믹 샤딩 수준을 별개로 결정하는 것이 좋다.

> Cold Device에서는 샤딩 수준이 높아도 별 소용이 없기 때문이다.

> 각 디바이스의 다이나믹 샤딩수준을 결정하는 SHARD 테이블을 생성한다.

> 만약 이래도 쓰로틀이 발생한다면, 해당 기기의 ShardCount를 더 크게 잡는다.




최종 설계도