DynamoDB로 집계내기

  • 문제

DynamoDB는 pure ‘key-value’ NoSQL로 집계와 같은 메서드는 제공하지 않는다.

생각해본 다른 방법

  1. Apache Hive 연동
  2. 별도 table 두기
  3. Amazon Redshift 이용

1. Hive 사용

  • 장점 : RDB에서 사용하는 쿼리문을 그대로 사용할 수 있음
  • 단점 : Hive에 저장한 데이터가 항상 최신 데이터임이 보장되지 않는다.

2. 별도의 table 두기

  • 예상했던 시나리오 : append table과 update table을 나눠 append table에 데이터가 추가 될 때마다 stream trigger를 걸어 총 재생수와 같은 갱신되는 항목들의 값을 update table에 저장해두고 요청시 추가 연산 없이 값을 전송하도록 한다.
  • 고려하지 못한 점 : 현재 집계 내야 하는 내용은 date 를 어떻게 설정하느냐에 따라 계속해서 달라지는 값이므로 어느 테이블에 고정되어 변하지 않는 값이 아니다.

-> 잘못된 접근

3. Amazon Redshift

big data를 다루기 위한 aws 서비스이다.

-> Redshift를 사용할 만큼 로그를 분석하여 새로운 데이터를 도출하는 큰 작업은 필요없기 때문에 사용하지 않는게 낫다고 생각했다.

Global Secondary Index 사용하기

기본키

기본키는 테이블의 각 항목을 나타내는 고유 식별자로, DynamoDB 기본키의 종류는 두 가지가 있다.

  • 파티션키(해시키) : 하나의 속성으로 구성되는 단순 기본키. 파티션 키로만 구성되어있는 테이블에서는 어떤 두 개의 테이블 항목도 동일한 파티션 값을 가질 수 없다.
  • 파티션 키 & 정렬 키(범위(range) 속성) : 파티션 키와 정렬 키 두가지 속성으로 구성되는 복합 기본 키이다. 복합키를 사용하는 테이블의 서로 다른 두 항목은 같은 파티션 키 값을 가질 수 있다. 하지만 정렬 키 값은 달라야 한다.

그 외에도 더욱 유연한 쿼리를 위해 보조 인덱스 기능을 제공한다. 기본적으로 쿼리 작업은 기본키에만 가능하기 때문에 다른 속성에 접근하기 위해서는 인덱스를 사용해야 한다.

보조 인덱스

인덱스의 종류는 두 가지가 있다.

  • Global secondary Index : 파티션 키 및 정렬 키가 테이블의 파티션 키 및 정렬키와 다른 인덱스
  • Local secondary Index : 테이블과 파티션 키는 동일하지만 정렬 키는 다른 인덱스

각 테이블당 20개의 global, 5개의 local 보조 인덱스를 만들 수 있다. 일반적으로 로컬 보조 인덱스보다 글로벌 보조 인덱스의 사용을 우선시 해야 한다. 단 쿼리 결과에 높은 일관성이 필요한 경우는 로컬 보조 인덱스를 사용하는게 좋다.

고안한 DB 구조

  • 기본키 : uuid(파티션)
  • 글로벌 보조키 : objectId(파티션) + date(범위키)

uuid를 기준으로 play data가 overwrite 되며 기록된다. 통계에 필요한 데이터는 지정한 날짜 사이에 입력된 데이터를 objectId 별로 집계한 데이터이므로 이 두가지 속성에 접근 할 수 있는 인덱스를 생성했다.

추후 계획

더 나은 구조를 만들 수 있을지 계속해서 고민해보고 일단 고안한 구조 구현해보기. 현재 전체 테이블 scan 하지 않고 query 문으로 해결할 수 있는지 방법 고안해 보는 중.