AWS - DynamoDB6
DynamoDB로 집계내기
- 문제
DynamoDB는 pure ‘key-value’ NoSQL로 집계와 같은 메서드는 제공하지 않는다.
생각해본 다른 방법
- Apache Hive 연동
- 별도 table 두기
- 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 문으로 해결할 수 있는지 방법 고안해 보는 중.
이 블로그의 모든 글은 CC BY-NC-SA 4.0 라이선스를 따르며, 별도로 명시되지 않는 한 모든 권리를 보유합니다. 재배포 시 출처를 명시해 주세요: StudyYeong.