안녕하세요. 현재 DynamoDB의 단일 테이블에 약 1TB 정도의 데이터를 쌓아두고…

안녕하세요.

현재 DynamoDB의 단일 테이블에 약 1TB 정도의 데이터를 쌓아두고 있는 이용자입니다. 첫 저장 이후에 수정될 일은 없는, append-only log입니다. 많은 용량을 차지하고는 있지만, 이 중에서 주로 쓰이는 데이터는 최근 한달 정도의 데이터인데요. 그래서 한달보다 오래된 데이터는 모두 Glacier에 백업한 뒤에 지우고 싶습니다.

그래서 어떻게 옮길 수 있을까 알아봤지만, Data Pipeline에서는 DynamoDB를 소스로 지원하지 않는 것 같습니다. Lambda도 고려해 봤지만, 실행 시간이 길어질 듯하여, 결국에는 DynamoDB → Glacier 데이터 이전 스크립트를 파이썬과 boto3 라이브러리를 이용해서 1회성으로 작성했습니다. 그런데 DynamoDB의 read capacity를 100 정도로 높였는데도 빠르게 복사하다보면 금방 ProvisionedThroughputExceededException 오류가 나더군요.

그래서 request rate를 낮춰보니 이번에는 속도가 너무 느립니다. 거의 해당 테이블에 새롭게 데이터가 추가되는 속도로 읽는 것 같습니다. (정확한 측정은 아니라서 과장일 수도 있습니다.)

그 이후로 방법을 못 찾아서 포럼에 질문을 올려봅니다. 분명 저 말고도 다른 이용자도 비슷한 문제를 마주했을 듯하고, 그렇다면 해결책도 있을 법한데, 제가 찾지 못하는 것 같습니다. 조언 부탁드립니다.

감사합니다.

3 thoughts on “안녕하세요. 현재 DynamoDB의 단일 테이블에 약 1TB 정도의 데이터를 쌓아두고…

  1. 최근 한달 데이터만 의미 있고 과거 데이터는 의미가 없는 경우, 일반적으로는 ddb table을 월단위로 새로 만듭니다. 이유는 여러가지가 있는데, 가장 기본적으로 ddb table의 파티션은 증가만 하기 때문에 capacity를 효율적으로 사용하기 어렵다는 문제가 있구요.(capacity는 파티션에 N분할 됩니다) glacier로 보관하려 하시는걸로 봐서 과거 데이터의 access는 사실상 매우 드물것이라는 가정을 하는것 같은데, 테이블을 매월 새로 만드시는게 제일 좋아 보입니다. 저라면, 3월 테이블을 새로 만들고 dynamodb stream+lambda를 이용해 기존 테이블+신규 테이블 2중 쓰기를 하고, 기존 테이블에서 3.1~3.3의 데이터를 신규 테이블로 옮기고(이건 적은 capacity로도 가능할 것입니다) 이전이 완료되면 2중쓰기를 종료한 후, 과거 테이블은 dynamodb exports등을 이용해서 백업 후 삭제 할 것 같네요.

  2. 기존에 있는 데이터는 export 로 한번에 옮기더라도 매번 그렇게 하는것은 아무래도 부담이 될 수 있으므로… 막 드는 생각은 다이나모디비에 이벤트 트리거로 람다를 호출하되 이 람다가 kinesis stream 을 만들고 firehose 로 s3 에 넣어 이를 s3의 라이프사이클로 glacier 에 넣으면 어떨까 하는 생각이 드네요. 근데 로그 데이터가 애초에 ddb 에서 사용성이 없다면 그냥 kinesis 로 바로 쏘아서 firehose 처리 하시는 것이 나을것 같아요. “왜 다이나모에 저장을 먼저 하는가. Kinesis 스트림이 낫지 않을까” 싶습니다. 아물론 ddb를 통해 다른 서비스에 로그 데이터 참조가 이루어 진다면 의존성을 확인해 보셔야겠지만… 그것도 kinesis 를 사용하시면 스트림을 직접 참조하는 추가 컨슈머를 붙이기 용이하다는 장점이 있을수도 있지 않을까요. https://github.com/awslabs/lambda-streams-to-firehose

  3. 참고로 그냥 단순 쿼리가 많은 정도라면, 향후에 그냥 S3에 쌓고 Athena를 쓰는 것도 고려해 보시길… (우선 버지니아에서 테스트해보시고 Athena가 도쿄 리전에 들어올 때쯤 이전하는 방식으로.)

Comments are closed.