들어가며: 왜 이 마이그레이션 사례가 중요한가
데이터 엔지니어링 현장에서 가장 두려운 작업 중 하나는 운영 중인 데이터 파이프라인의 아키텍처 교체입니다. 특히 메타(Meta)처럼 전 세계 수십억 사용자의 소셜 그래프 데이터를 처리하는 규모라면, 단 한 시간의 데이터 유실이나 지연도 용납되지 않습니다.
메타의 데이터 수집 시스템은 MySQL 기반의 소셜 그래프에서 매일 **수 페타바이트(PB)**의 데이터를 증분 수집(incremental ingestion)하여 데이터 웨어하우스로 전달합니다. 이 데이터는 분석, 리포팅, ML 모델 학습, 제품 개발 등 전사적으로 사용됩니다. 기존 시스템은 각 팀이 자체 파이프라인을 운영하는 방식이었는데, 규모가 커지면서 안정성과 효율성에 한계가 드러났습니다.
이 글에서는 메타 엔지니어링 팀이 발표한 대규모 데이터 수집 시스템 마이그레이션 사례를 바탕으로, 실제로 어떻게 수천 개의 잡(Job)을 무중단으로 전환했는지 그 핵심 전략과 아키텍처 결정 요인을 상세히 분석합니다.
본 사례의 원문은 Meta Engineering Blog에서 확인하실 수 있습니다. 이 글은 원문의 기술적 내용을 한국 개발자 생태계 맥락에 맞게 재구성한 인사이트 해설입니다.

마이그레이션 3단계 라이프사이클: Shadow → Reverse Shadow → Cleanup
메타 팀이 설계한 마이그레이션 프로세스는 크게 세 단계로 구성됩니다. 각 단계는 데이터 정합성, 지연 시간(Latency), 리소스 사용률이라는 세 가지 기준을 통과해야만 다음 단계로 넘어갈 수 있습니다.
1단계: Shadow Phase (그림자 단계)
목표: 새로운 시스템이 실제 운영 데이터를 안전하게 처리할 수 있는지 검증합니다.
- 새로운 시스템에서 Shadow Job을 생성하여 프리-프로덕션(pre-production) 환경에서 실행합니다.
- Shadow Job은 운영 잡과 동일한 소스(Source)를 읽지만, 데이터를 Shadow Table이라는 별도 테이블에 기록합니다.
- 운영 잡(Production Job)과 Shadow Job이 생성한 데이터의 Row Count와 Checksum을 지속적으로 비교합니다.
# 개념적 예시: Shadow 단계의 데이터 정합성 검증 로직
import hashlib
def verify_data_consistency(production_table, shadow_table, partition_date):
"""
운영 테이블과 섀도우 테이블의 데이터 정합성을 검증합니다.
Args:
production_table: 기존 시스템이 기록하는 운영 테이블
shadow_table: 새 시스템이 기록하는 섀도우 테이블
partition_date: 검증할 파티션 날짜
"""
# Row Count 비교
prod_row_count = get_row_count(production_table, partition_date)
shadow_row_count = get_row_count(shadow_table, partition_date)
if prod_row_count != shadow_row_count:
raise DataMismatchError(f"Row count mismatch: prod={prod_row_count}, shadow={shadow_row_count}")
# Checksum 비교 (전체 데이터의 해시값)
prod_checksum = compute_table_checksum(production_table, partition_date)
shadow_checksum = compute_table_checksum(shadow_table, partition_date)
if prod_checksum != shadow_checksum:
raise DataMismatchError(f"Checksum mismatch for partition {partition_date}")
return True # 정합성 통과
이 단계에서는 불일치가 발견되면 프리-프로덕션 환경에서 빠르게 원인을 분석하고 수정할 수 있습니다. 운영 환경에 영향을 주지 않는다는 점이 가장 큰 장점입니다.
2단계: Reverse Shadow Phase (역그림자 단계)
이 단계가 이 마이그레이션 전략의 핵심입니다. 역할을 뒤바꿉니다:
- Shadow Job의 데이터 → 운영 테이블(Production Table)에 기록 (즉, Shadow Job이 새로운 운영 잡이 됩니다)
- 기존 운영 잡의 데이터 → Shadow Table에 기록 (기존 운영 잡이 그림자 역할을 합니다)
이렇게 하면 두 가지 이점이 생깁니다:
- 지속적인 데이터 품질 신호 확보: 두 시스템의 출력을 계속 비교할 수 있어 롤아웃 후에도 문제를 조기에 감지할 수 있습니다.
- 빠른 롤백 가능: 문제가 발견되면 기존 시스템(현재 Shadow 역할)으로 즉시 전환할 수 있습니다. 시스템을 재구성할 필요가 없습니다.
# Reverse Shadow 단계의 롤백 로직 개념
class ReverseShadowManager:
"""역그림자 단계에서의 롤백 제어"""
def __init__(self, new_system_job, legacy_system_job):
self.active_job = new_system_job # 현재 운영 중인 새 시스템 잡
self.standby_job = legacy_system_job # 대기 중인 기존 시스템 잡
def check_and_rollback_if_needed(self, partition_id):
"""
데이터 품질 문제가 감지되면 즉시 롤백합니다.
"""
if self.detect_data_quality_issue(partition_id):
# 롤백: standby 잡을 다시 active로 전환
self.active_job, self.standby_job = self.standby_job, self.active_job
self.standby_job.stop_writing_to_production()
self.active_job.resume_writing_to_production()
# 문제 파티션 메타데이터에 'bad_quality' 플래그 설정
mark_partition_as_bad(partition_id)
logging.warning(f"Rollback triggered for partition {partition_id}. "
f"Active job switched to legacy system.")
return True
return False
3단계: Migration Cleanup (마이그레이션 정리)
Reverse Shadow 단계에서 일정 기간 이상 문제가 없으면, 기존 시스템의 Shadow Job을 제거합니다. 새 시스템이 완전히 운영을 인계받은 것입니다.
핵심 포인트: 이 3단계 접근법은 단순히 '데이터만 옮기는 것'이 아니라, 운영 중인 시스템의 신뢰성을 유지하면서 점진적으로 전환할 수 있도록 설계되었습니다. 국내 SI/플랫폼 환경에서도 레거시 시스템을 대체할 때 이 패턴을 그대로 적용할 수 있습니다.

대규모 자동화와 한계 용량 극복 전략
수천 개의 잡을 수동으로 마이그레이션하는 것은 불가능에 가깝습니다. 메타 팀은 다음과 같은 자동화와 최적화 전략을 사용했습니다.
자동화된 모니터링 및 승격/강등 시스템
- 각 잡의 마이그레이션 라이프사이클 상태와 기준 충족 여부를 Scuba (메타의 실시간 데이터 관리 시스템)에 지속적으로 전송합니다.
- 외부 마이그레이션 도구가 Scuba의 신호를 모니터링하여, 기준을 충족하는 잡은 자동으로 다음 단계로 **승격(Promotion)**시키고, 기준을 위반한 잡은 **강등(Demotion)**시킵니다.
- 시스템 레벨과 잡 레벨의 대시보드를 제공하여 엔지니어가 전체 진행 상황과 개별 잡을 동시에 추적할 수 있게 했습니다.
한정된 용량에서의 배치(Batch) 전략
마이그레이션을 위한 프리-프로덕션 환경의 용량이 한정적이었기 때문에, 모든 잡을 한 번에 Shadow Job으로 만들 수 없었습니다. 다음과 같은 배치 최적화를 적용했습니다:
| 전략 | 설명 | 효과 |
|---|---|---|
| 특성 기반 분류 | 처리량(Throughput), 우선순위, 특수 케이스별로 잡을 분류 | 리소스를 중요한 잡에 우선 할당 |
| 알려진 이슈 제외 | 아직 해결되지 않은 버그가 있는 잡은 배치에서 제외 | 불필요한 Full Dump 중복 방지 |
| 스냅샷 재사용 | 기존 시스템이 생성한 스냅샷 파티션을 새 시스템이 초기 데이터로 재사용 | Full Dump 부하 대폭 감소 |
CDC(Change Data Capture) 기반 시스템의 특성상, 새 잡의 첫 번째 스냅샷은 Full Dump를 통해 생성되는데, 이는 매우 느리고 비용이 큽니다. 알려진 버그가 있는 상태에서 Shadow Job을 생성하면, 잡 생성 시점과 버그 수정 후 재생성 시점에 두 번의 Full Dump가 발생합니다. 이를 사전에 차단함으로써 대량의 불필요한 Full Dump 작업을 방지했습니다.
데이터 품질 분석 도구의 지속적 활용
마이그레이션 기간 동안 개발된 데이터 품질 분석 도구는 이후 릴리스 검증 프로세스의 일부로 계속 사용되고 있습니다. 이는 일회성 도구가 아니라 장기적인 운영 안정성에 기여하는 자산이 되었습니다.
국내 적용 맥락: 많은 한국 기업들이 데이터 플랫폼을 교체할 때 '빅뱅(Big Bang) 방식'을 시도했다가 실패하는 경우가 많습니다. 메타의 Shadow/Reverse Shadow 패턴은 **점진적 이관(Incremental Migration)**의 모범 사례를 보여줍니다. 특히 CDC 기반 시스템(예: Debezium + Kafka)을 사용 중이라면, 이 전략을 거의 그대로 차용할 수 있습니다.

결론: 실무에 적용할 수 있는 핵심 교훈
메타의 데이터 수집 시스템 마이그레이션 사례에서 얻을 수 있는 실무 교훈은 다음과 같습니다.
-
Shadow → Reverse Shadow → Cleanup의 3단계는 검증된 패턴입니다.
- 이 패턴은 단순히 '테스트 후 전환'이 아니라, 운영 중에도 지속적인 데이터 품질 검증이 가능하게 합니다.
- 롤백이 매우 빠르고 안전합니다. (Reverse Shadow 단계에서는 설정 변경 없이 즉시 전환 가능)
-
자동화는 선택이 아닌 필수입니다.
- 수천 개의 잡을 수동으로 관리하는 것은 현실적으로 불가능합니다.
- 잡의 상태를 중앙에서 모니터링하고, 기준에 따라 자동 승격/강등하는 시스템을 구축하세요.
-
용량 계획이 마이그레이션 속도를 결정합니다.
- 한정된 프리-프로덕션 환경에서 최대 효율을 내려면, 잡을 특성별로 분류하고 알려진 이슈를 사전에 차단해야 합니다.
- 스냅샷 재사용과 같은 창의적인 최적화가 큰 효과를 발휘할 수 있습니다.
-
데이터 품질 검증 도구는 마이그레이션 이후에도 가치 있습니다.
- 마이그레이션 기간에 만든 도구를 릴리스 검증, 일일 모니터링 등에 재사용하면 투자 대비 효과가 큽니다.
이 기술의 한계 및 주의사항
- 이 마이그레이션 전략은 CDC 기반 시스템에 최적화되어 있습니다. 배치(Batch) 기반 시스템이나 스트리밍(Streaming) 시스템에는 다른 접근이 필요할 수 있습니다.
- Reverse Shadow 단계에서는 두 시스템이 동시에 운영 테이블에 쓰기를 시도하지 않도록 정확한 역할 전환 로직이 필요합니다. 잘못 구현하면 데이터 충돌이 발생할 수 있습니다.
- Shadow Job을 위한 프리-프로덕션 환경의 리소스가 충분히 확보되어야 합니다. 그렇지 않으면 Shadow Job 자체가 병목이 될 수 있습니다.
다음 단계 학습 방향
- CDC(Change Data Capture) 심화: Debezium, Kafka Connect를 활용한 CDC 파이프라인 구축 방법을 학습해보세요.
- 대규모 데이터 파이프라인 모니터링: 데이터 정합성 검증 자동화, 알림 시스템 구축에 관심이 있다면 Apache Griffin, Great Expectations 같은 데이터 품질 도구를 살펴보세요.
- 분산 시스템 마이그레이션 패턴: Strangler Fig 패턴, Blue-Green Deployment 등 다른 마이그레이션 전략과 비교해보는 것도 도움이 됩니다.
함께 보면 좋은 글
- PyTorch 분산 학습 완벽 가이드: Point-to-Point과 Collective Operations 실전 코드 - 대규모 시스템에서의 분산 처리 개념을 이해하는 데 도움이 됩니다.
- 스포티파이가 광고 플랫폼을 멀티 에이전트 아키텍처로 재구축한 이유: Cloudflare Browser Run 사례 분석 - 다른 대규모 아키텍처 전환 사례와 비교해보세요.