16억 레코드 User 테이블 마이그레이션, 7일 -> 6시간, 비용 36% 절감!

by DD
3개월 전
조회수 2

16억 8천만 레코드의 User 테이블에서 Badge 관련 트래픽 증가로 인한 성능 저하 문제를 해결하기 위해 UserBadge 테이블 분리 결정

DynamoDB Export/ImportAWS Glue ETL을 활용한 온라인 마이그레이션 파이프라인 구축 및 수행, LWW(Last Writer Wins) 전략 적용

마이그레이션 결과, 7일 소요되던 작업 시간6시간으로 단축하고, 비용 36% 절감 및 User 테이블의 안정성 확보

온라인 마이그레이션 파이프라인 설계 및 구현

본문에서는 16억 8천만 레코드(Records)에 달하는 User 테이블의 Badge 관련 데이터를 UserBadge 테이블로 분리하기 위한 온라인 마이그레이션 파이프라인을 상세히 설명한다. 파이프라인은 DynamoDB Export, AWS Glue ETL, DynamoDB Import의 세 단계를 거쳐 구현되었다.

LWW(Last Writer Wins) 전략: TmpUserBadge 테이블에 userVersion 속성을 추가하여, 최신 버전의 변경 사항만 반영하는 전략을 사용

DynamoDB Export: PITR(Point-In-Time Recovery) 활성화 후, S3로 Export 진행. 1.8TB 데이터가 gzip 압축을 통해 280GB로 감소, RCU(Read Capacity Units) 소모 없이 30분 만에 완료

AWS Glue ETL: User 테이블의 스키마를 UserBadge 테이블에 맞게 매핑하고, NULL 필드 제거 및 데이터 품질 검증 수행. Worker type, Worker 수, Auto Scaling, Job timeout 설정을 최적화하여 성능 개선

AWS Glue ETL 작업의 기술적 상세

AWS Glue ETL 스크립트 작성 과정에서 겪었던 기술적 어려움과 해결 방안을 제시한다. 특히, DynamoDB에서 NULL 값을 허용하지 않는 점 때문에 발생한 문제를 해결하기 위해, NULL이 아닌 필드만 DynamoDB JSON 포맷으로 구성하는 로직을 추가했다.

DynamicFrame: Glue 전용 데이터 구조로, 스키마가 불완전하거나 필드가 누락된 데이터도 유연하게 처리 가능

NULL 필드 제거: Spark에서 NULL로 처리되는 필드를 DynamoDB Import에 적합한 형태로 변환하는 과정에서 발생한 문제 해결

Worker 설정 최적화: G 2X Worker, 80개 Worker, Auto Scaling, Job timeout 설정을 통해 Glue Job의 성능을 최적화. CloudWatch Metrics의 "Maximum Needed Executors" 그래프를 활용하여 Worker 수 조정

마이그레이션 전후의 성능 및 비용 비교 분석

마이그레이션 전후의 비용 및 성능 변화를 구체적인 수치와 함께 제시하며, AWS 관리형 서비스의 장점을 강조한다. 기존 java-migration 방식 대비, AWS 관리형 서비스를 활용한 결과, 작업 시간과 비용을 대폭 절감했다.

비용 절감: AS-IS(java-migration) 대비 TO-BE(Export+Glue+Import) 방식에서 36% 비용 절감 (총 $140.40 절감)

시간 단축: 7일(168시간) 소요되던 작업 시간을 약 6시간으로 단축, 96% 시간 절감 달성

안정성 향상: 프로덕션 테이블의 RCU/WCU 영향 감소, 쓰로틀링 위험 감소, 휴먼 에러 최소화, 실패 시 재시도 용이

UserBadge 테이블 분리를 통한 시스템 안정성 확보

UserBadge 테이블 분리를 통해 메시지 전송 트래픽 증가에도 유연하게 대응할 수 있는 구조를 확보하고, User 테이블의 안정성을 크게 개선했다. 특히, 트랜잭션 충돌 감소와 WCU 사용량 감소를 통해 성능 향상을 이끌어냈다.

트랜잭션 충돌 감소: Badge 업데이트 관련 트랜잭션 충돌이 User 테이블에서 UserBadge 테이블로 분리되면서 1분에 10,000번에서 80번 내외로 감소

WCU 사용량 감소: User 테이블의 WCU 사용량 25% 절감, UserBadge 테이블 추가로 인한 순 절감 효과는 12~13% 수준

쓰로틀링 문제 해결: UserBadge 테이블에는 GSI(Global Secondary Index)가 없어, Badge 업데이트로 인한 쓰로틀링 문제 해결

향후 과제 및 개선 방향

UserBadge 분리 이후에도 User 테이블의 안정성 및 성능 향상을 위한 추가적인 개선 과제를 제시한다. Profile 필드 분리, GSI Back-Pressure 해결, Badge 트랜잭션 제거 등, 지속적인 시스템 개선을 위한 구체적인 계획을 공유한다.

UserProfile 분리: 고객사 관리 Profile 필드를 별도 테이블로 분리하여 불필요한 WCU 소모를 줄일 계획

GSI Back-Pressure 해결: GSI를 별도 테이블로 분리하고, Kinesis Data Streams For DynamoDB Streams를 통해 비동기 동기화하거나, GSI 해시 키를 샤딩하는 방안 검토

Badge 트랜잭션 제거: DynamoDB Lock Client를 활용한 분산 락 구현 또는 스트리밍 방식을 검토하여, TransactWriteItems로 인한 WCU 낭비 방지

메시지 전송 트래픽 100배에도 끄떡 없는 User 테이블로 뜯어고치기 (2)