DynamoDB의 숨겨진 제약을 극복하고, GSI를 독립 테이블로 전향하며 스로틀링 0회를 구현해낸 대용량 데이터 마이그레이션 실무 노하우
이 아티클은 대규모 실시간 사용자 데이터를 관리하는 채널톡 백엔드 엔지니어링 팀이 DynamoDB GSI의 핫 파티션 성능 한계를 극복하기 위해 수행한 아키텍처 다각화 및 실무 구축기를 다룹니다. 기존 GSI 구조를 탈피하여 신규 인덱스 테이블을 별도로 구성하고 무중단 데이터를 이관하는 5단계 배포 여정을 구체적인 수치로 다룹니다. 특히 Token Bucket의 트래픽 버스트로 인해 발생한 예기치 못한 병목과 SQS 부하 상황을 Leaky Bucket 적용을 포함한 점진적인 튜닝을 통해 매끄럽게 극복해 나가는 해결 과정을 고스란히 엿볼 수 있습니다.
DynamoDB를 핵심 아키텍처로 사용하며 트래픽 스케일업에 따른 핫 파티션 제약이나 GSI 쓰기 스로틀링의 연쇄 정체 문제를 미리 대응하려는 시니어 백엔드 아키텍트 및 데이터 인프라 엔지니어들에게 모범적인 가이드가 될 것입니다.
DynamoDB의 Managed GSI에서 발생하는 특정 파티션의 쓰기 부하(핫 파티션)가 원본 User 테이블 전체의 쓰기 실패로 이어지는 문제가 발생했습니다. 서비스 운영 중 중단 없이 약 22억 건의 방대한 기존 데이터를 안전하게 신규 테이블로 마이그레이션하고, 이후 발생하는 실시간 변경 사항을 일관성 있게 동기화해야 하는 도전 과제가 있었습니다.
DynamoDB Export, AWS Glue ETL, DynamoDB Import 파이프라인을 구축하여 대규모 스냅샷 데이터를 새로운 인덱스 테이블 구조로 성공적으로 이관했습니다. 실시간 변경분은 Kinesis Data Stream과 자사 애플리케이션(ch-flow-shard)을 통해 동기화하였으며, DynamoDB 내부 복제 동작을 모방한 커스텀 생성·변경·삭제 조건 제어 및 Leaky Bucket 기반의 Rate Limiter 알고리즘을 도입해 쓰기 속도를 제어했습니다.
마이그레이션 및 신규 인덱스 테이블 구조 전환 완료 후, 4월 한 달 운영 기준 기존의 110만 회에 달하던 GSI 쓰기 스로틀링 현상(WriteThrottleEvents)을 0회로 완전히 제거했습니다. 또한 신규 인덱스 테이블의 실시간 변경 전파 지연 시간을 P95 기준 500ms, P99 기준 950ms 내외의 고도로 안정적인 수준으로 인프라를 유지 및 입증하는 데 성공했습니다.
Trade-off
DynamoDB가 백그라운드에서 전적으로 제어해 주던 인덱스 복제 작업을 애플리케이션 레이어로 직접 올리게 되면서, 생성·삭제 조건이나 이벤트 버저닝, 에러 처리 등의 데이터 복제 일관성 보장 로직을 직접 구현하고 유지보수해야 하는 추가적인 소프트웨어적 관리 오버헤드가 발생했습니다. 또한, 비동기 파이프라인 전파 특성상 쓰기 직후 즉각적인 강한 일관성을 보장하지 못하며 최종 일관성 제어 모델에 의존해야 하는 한계가 존재합니다.
Amazon S3에 보관된 대형 JSON 또는 파케(Parquet) 원천 데이터를 기반으로 DynamoDB 쓰기 용량(WCU)을 극적으로 낭비하지 않으며 신규 테이블을 즉석에서 벌크로 로드하고 생성하는 관리형 기능입니다.
불규칙하고 급격하게 인입되는 트래픽의 버스트를 허용하지 않고 고정된 속도의 깔때기 파이프라인처럼 정해진 레이트만큼만 일정하게 다운스트림으로 데이터를 방류하여 보호하는 트래픽 쉐이핑 알고리즘입니다.
DynamoDB 테이블 내부의 데이터 레코드가 수정되거나 삭제될 때, 변경 전의 원본 상태(Old)와 변경 후의 최신 상태(New)를 동시에 스트림 메시지 페이로드에 모두 실어 전달하는 DynamoDB Streams 설정 모델입니다.