DevLog

엔지니어링 블로그를 한 곳에서 탐색하고, 최근 발행 흐름을 빠르게 파악할 수 있는 서비스 입니다.

Quick Links

  • Latest Feed
  • Engineering Directory

Support

  • 소개
  • 개인정보처리방침

Contribute

  • 원하는 블로그 추가 (준비 중)
  • Feedback

© 2026 DevLog Inc. All rights reserved.

본 사이트는 공개 RSS 피드를 통해 콘텐츠를 수집하며, 모든 콘텐츠의 저작권은 원저작자에게 있습니다.

Back to Feed
Read Original

Contents

Continue Reading

  • More from 채널 톡
  • Related reads#DynamoDB
#Backend

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

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

Summary

16억 레코드 마이그레이션을 7일에서 6시간으로 단축시킨 비결

AWS Glue와 DynamoDB Import로 완성한 무중단 대규모 데이터 분리 전략

본 아티클은 채널톡의 1.8TB 규모 User 테이블에서 Badge 기능을 분리하며 겪은 기술적 여정을 담고 있습니다. 단순히 데이터를 옮기는 것을 넘어 AWS 관리형 서비스를 활용해 비용과 성능, 안정성을 모두 잡은 실전 마이그레이션 아키텍처와 상세한 튜닝 포인트를 공유합니다.

  • 01DynamoDB Export/Import를 활용해 프로덕션 RCU/WCU 소모 없이 데이터 이전
  • 02AWS Glue(PySpark)를 이용한 대규모 JSON 데이터 필터링 및 변환 기법
  • 03LWW(Last Writer Wins) 전략을 통한 온라인 마이그레이션 중 데이터 정합성 보장
  • 04Worker 수 최적화와 CloudWatch 메트릭을 활용한 Glue Job 성능 튜닝
  • 05트랜잭션 충돌 및 GSI Back-Pressure 해결을 통한 시스템 안정성 확보

+RECOMMENDATION

수억 건 이상의 대규모 테이블 마이그레이션을 준비하는 백엔드 엔지니어에게 추천하며, 특히 읽기 패턴뿐만 아니라 쓰기 패턴에 기반한 테이블 설계의 중요성을 시사합니다.

The Problem

16억 8천만 개의 레코드를 보유한 거대 User 테이블에서 Badge 업데이트 트래픽이 전체 성능을 저하시키는 문제를 해결하기 위해, 서비스 중단 없이 데이터를 분리하는 온라인 마이그레이션이 필요했습니다. 기존 Java 애플리케이션 기반 마이그레이션 방식은 예상 소요 시간이 7일에 달하고 프로덕션 DB에 RCU/WCU 부하를 직접적으로 주는 위험이 있었습니다.

The Solution

DynamoDB PITR을 활용한 Export로 프로덕션 부하를 제거하고, AWS Glue ETL을 통해 데이터를 변환한 뒤 DynamoDB Import 기능을 사용하여 새 테이블을 생성하는 파이프라인을 구축했습니다. 데이터 정합성을 위해 Last Writer Wins(LWW) 전략과 ConditionExpression을 적용한 Dual Write 및 TmpUserBadge를 활용한 3단계 병합 프로세스를 수행했습니다.

The Result

마이그레이션 시간을 7일에서 6시간으로 약 96% 단축했으며, 비용 또한 기존 방식 대비 약 36% 절감하는 성과를 거두었습니다. 기술적으로는 User 테이블과 Badge 업데이트 트래픽을 완전히 격리하여 트랜잭션 충돌을 분당 10,000건에서 80건 수준으로 급감시켰으며 GSI Back-Pressure 문제를 근본적으로 해결했습니다.

Trade-off

AWS Glue ETL 과정에서 Spark의 NULL 처리 방식과 DynamoDB의 데이터 모델 차이로 인해 별도의 커스텀 스크립트 작성이 필요했으며, PK+SK 구조의 테이블일 경우 데이터 정렬 순서에 따른 Rolling Hot Partition 이슈가 발생할 수 있음을 확인했습니다.

03

Key Concepts

Concept · 01

Last Writer Wins (LWW)

분산 시스템에서 데이터 충돌이 발생했을 때 가장 최신 버전 또는 타임스탬프를 가진 데이터를 최종 상태로 수용하는 전략입니다.

  • TmpUserBadge 및 UserBadge 테이블 업데이트 시 userVersion을 비교하여 최신 데이터만 반영하도록 구현함
  • ConditionExpression을 통해 'attribute_not_exists OR 기존 버전 <= 새 버전' 조건으로 데이터 정합성 유지
Concept · 02

AWS Glue DynamicFrame

Apache Spark DataFrame을 확장한 AWS 전용 데이터 구조로, 스키마가 고정되지 않은 NoSQL 데이터를 유연하게 처리할 수 있는 기능을 제공합니다.

  • 1.8TB의 대용량 DynamoDB Export 데이터를 읽어와 필요한 필드만 추출하고 변환하는 ETL 작업의 핵심으로 사용함
  • Spark DataFrame과 달리 스키마 추론 및 비정형 데이터 처리에 강점이 있어 16억 레코드 처리에 활용됨
Concept · 03

GSI Back-Pressure

DynamoDB의 글로벌 보조 인덱스(GSI)에서 특정 파티션의 쓰기 처리량이 제한치를 초과할 경우, 메인 테이블의 쓰기 작업까지 지연되거나 실패하게 만드는 현상입니다.

  • 기존 User 테이블에서 channelId 기반 GSI가 겪던 병목 현상을 분석함
  • UserBadge 테이블을 분리하고 GSI를 제거함으로써 쓰기 집중 상황에서의 시스템 전체 전파 문제를 해결함
Continue reading · same source

채널 톡More from 채널 톡

View all posts from 채널 톡
  • [신청 중] AI Product Frontiers: AI 시대, 최전선에서 방향을 만드는 사람들

    MeetupAI InfrastructureArtificial Intelligence
    2일 전
  • 채널콘 2026 디자인 비하인드

    FramerGenerative AILocalization
    2일 전
  • Swift 6 어때요? (1): 스레드, 블록, 태스크

    Swift ConcurrencyGCDRxSwift
    2일 전
  • 5년, 340개의 이야기로 이어온 개발 문화

    Developer RelationsKnowledge SharingEngineering Culture
    3일 전
  • 유저챗 개인정보 마스킹 개발기

    RegexRE2ReDoS
    4일 전

Related reads#DynamoDB

Explore #DynamoDB
채널 톡

[신청 중] 핫파티션과 트래픽 폭주, 우리는 이렇게 넘었습니다

#DynamoDB2주 전
채널 톡

DynamoDB 핫 파티션을 해결하는 3가지 방법 (3): 조회를 인덱스 테이블로 옮기기

#DynamoDB3주 전
우아한형제들·AWS NACL

멀티 어카운트 NACL 차단 자동화 도구 운영 및 개선 경험

#DynamoDB1개월 전
채널 톡

DynamoDB 핫 파티션을 해결하는 3가지 방법 (2): 인덱스 테이블로 GSI 떼어내기 구현편

#DynamoDB1개월 전
채널 톡

AWS가 DynamoDB를 만든 방법

#DynamoDB2개월 전

Source

채널 톡
채널 톡
Engineering Blog

Published · February 26, 2026

Topics

DynamoDBAWS GlueOnline MigrationETLLast Writer Wins