DynamoDB 쓰로틀링과 GSI 백프레셔를 잡기 위한 채널톡의 대규모 아키텍처 현대화 전략
폭발적인 메시지 트래픽 속에서 시스템 안정성을 확보하기 위해 거대해진 User 테이블을 분리한 엔지니어링 기록입니다. 단순한 기능 분리를 넘어, DynamoDB의 내부 동작 원리와 핫 파티션 문제를 해결하며 16억 건의 데이터를 안전하게 옮기기 위한 고군분투를 담고 있습니다.
DynamoDB를 사용하며 급격한 트래픽 스파이크로 인한 쓰로틀링을 겪고 있거나, 대규모 NoSQL 데이터 마이그레이션을 고민하는 백엔드 엔지니어에게 적극 추천합니다.
16억 8천만 건의 레코드를 보유한 DynamoDB User 테이블에서 스파이크성 뱃지 업데이트 트래픽(1500 TPS 이상)이 발생하여 서비스 핵심 기능인 '부트'가 마비되는 현상이 발생했습니다. 원인은 업데이트 시 아이템 전체 크기 기준의 WCU 소모와 GSI 핫 파티션으로 인한 백프레셔(Back-Pressure)로 분석되었습니다.
성격과 쓰기 패턴이 다른 뱃지 데이터를 별도의 UserBadge 테이블로 물리적으로 분리하는 결정을 내렸습니다. 대규모 데이터를 안전하게 이전하기 위해 Java 스크립트 기반 방식 대신 RCU/WCU 소모가 없는 DynamoDB Export/Import와 AWS Glue를 조합한 무중단 마이그레이션 파이프라인을 설계했습니다.
GSI를 제거한 독립 테이블 구성을 통해 백프레셔 문제를 근본적으로 차단할 수 있는 아키텍처를 확보했습니다. 또한 1.8TB 규모의 데이터를 수동 작업 대비 비용과 리스크를 최소화하며 이전할 수 있는 자동화된 ETL 기반의 마이그레이션 전략을 수립했습니다.
Trade-off
테이블 분리로 인해 데이터 조회 시 추가적인 쿼리가 필요할 수 있으며, 마이그레이션 중 데이터 정합성을 유지하기 위한 동기식 이중 쓰기(Dual-Write)와 임시 버퍼 테이블(TmpUserBadge) 운영에 따른 시스템 복잡도가 일시적으로 증가했습니다.
DynamoDB GSI의 특정 파티션에 쓰기 부하가 집중되어 처리가 지연될 때, 데이터 정합성을 위해 메인 테이블의 쓰기 요청까지 거부되는 현상입니다.
PITR(지점 복구) 스냅샷을 활용하여 테이블 데이터를 S3로 내보내고, 다시 새 테이블로 가져오는 AWS 관리형 기능입니다.
다양한 소스의 데이터를 추출, 변환, 로드하는 서버리스 ETL 서비스로 복잡한 데이터 파이프라인 구성을 자동화합니다.