Pinterest, CDC 기반 데이터 파이프라인으로 데이터 지연 시간 단축!
기존 배치 기반 인제션 시스템의 높은 지연 시간(High Data Latency), 비효율성, 데이터 규정 준수(Data Compliance) 문제 해결을 위해 CDC 기반 프레임워크(CDC-based Framework)를 도입
MySQL, KVStore, TiDB 등 다양한 데이터베이스(Database)를 지원하며, Kafka, Flink, Spark, Iceberg를 활용하여 실시간 데이터 파이프라인 구축
CDC 테이블(CDC Table)과 Base 테이블(Base Table)을 분리하여 데이터 변경 사항을 효율적으로 처리하고, Merge-on-Read(MOR) 방식을 통해 스토리지 비용 절감
Bucket Join 및 테이블 파티셔닝(Table Partitioning)을 활용하여 Upsert 연산(Upsert Operation) 성능을 최적화하고, 40% 이상의 컴퓨팅 비용 절감 달성
향후 자동화된 스키마 변경(Schema Evolution) 지원을 통해 데이터 파이프라인의 안정성과 확장성을 더욱 강화할 예정
CDC 기반 아키텍처(Architecture) 설계
Pinterest는 기존 배치 기반 인제션 시스템의 한계를 극복하기 위해 CDC(Change Data Capture) 기반의 통합 프레임워크를 구축했다. 이 아키텍처는 MySQL, TiDB, KVStore 등 다양한 데이터베이스(Database)를 지원하며, 데이터 변경 사항을 실시간으로 감지하여 Kafka로 전송한다.
CDC 레이어(CDC Layer): 데이터베이스 변경 사항을 1초 이내의 지연 시간으로 캡처하여 Kafka에 기록
스트리밍 레이어(Streaming Layer): Flink를 사용하여 CDC 이벤트를 거의 실시간으로 처리하고, Iceberg 테이블에 저장
배치 레이어(Batch Layer): 주기적으로 Spark를 사용하여 CDC 테이블에서 변경 사항을 가져와 Base 테이블에 Upsert 수행
이러한 구조를 통해 데이터 지연 시간을 수 시간에서 수 분으로 단축하고, 데이터 품질 및 운영 효율성을 향상시켰다.
CDC 테이블(Table)과 Base 테이블(Table)의 역할
Pinterest의 데이터 인제션(Ingestion) 시스템은 CDC 테이블과 Base 테이블을 분리하여 운영한다. CDC 테이블은 변경 사항을 기록하는 시간 기반의 append-only ledger 역할을 하며, 5분 이내의 지연 시간으로 데이터에 접근할 수 있다. 반면, Base 테이블은 소스 테이블의 미러(Mirror) 역할을 하며, 모든 히스토리컬 레코드를 보존한다.
CDC 테이블(CDC Table): 변경 사항을 기록하는 시간 기반의 append-only ledger 역할
Base 테이블(Base Table): 소스 테이블의 미러 역할을 하며, 모든 히스토리컬 레코드 보존
Upsert 연산(Upsert Operation): CDC 테이블의 최신 변경 사항을 기반으로 Base 테이블을 업데이트
이러한 구조는 데이터의 일관성을 유지하면서, 효율적인 데이터 처리 및 분석을 가능하게 한다.
Iceberg Merge Into 연산(Operation) 최적화
Pinterest는 Iceberg의 Merge Into 연산을 활용하여 Base 테이블을 업데이트하는 과정에서 성능 최적화를 수행했다. 특히, Merge-on-Read(MOR) 방식을 선택하여 Copy-on-Write(COW) 방식의 스토리지 비용 문제를 해결했다.
Merge-on-Read(MOR): 업데이트 시 데이터 파일을 직접 수정하여 스토리지 비용 절감
Copy-on-Write(COW): 데이터 변경 시 새로운 파일을 생성하여 스토리지 비용 증가
Partitioning by Primary Key Hash: 대용량 테이블의 Upsert 성능 향상을 위해 기본 키(Primary Key) 해시 기반 파티셔닝(Partitioning) 적용
이러한 최적화를 통해 Upsert 연산의 효율성을 높이고, 데이터 처리 속도를 향상시켰다.
Bucket Join을 활용한 성능 개선
Pinterest는 대용량 Base 테이블과 CDC 테이블(Table)을 처리하기 위해 Bucket Join 기법을 도입했다. 기존 Merge Into 연산은 Spark가 Base 테이블 전체를 셔플(Shuffle)해야 하는 문제가 있었지만, Bucket Join을 통해 이를 해결했다.
Bucket Join: CDC 테이블과 Base 테이블의 파티셔닝 스키마(Partitioning Schema) 일치를 통해 셔플(Shuffle) 최소화
임시 테이블(Temporary Table): CDC 데이터를 임시 테이블에 저장한 후, 이를 활용하여 Upsert 연산 수행
40% 이상 컴퓨팅 비용 절감: Bucket Join 도입으로 Upsert 연산의 효율성 향상 및 비용 절감
이러한 최적화를 통해 대용량 데이터 처리 시 성능 저하 문제를 해결하고, 비용 효율성을 높였다.
향후 과제: 자동화된 스키마 변경(Schema Evolution)
Pinterest는 데이터 인제션(Ingestion) 플랫폼의 지속적인 발전을 위해 자동화된 스키마 변경(Schema Evolution) 지원을 계획하고 있다. 이는 업스트림 데이터베이스(Database)의 스키마 변경 사항을 다운스트림 데이터 파이프라인에 안전하고 효율적으로 반영하기 위한 핵심 기능이다.
자동화된 스키마 변경: 업스트림 데이터베이스의 스키마 변경을 자동으로 감지하고, 다운스트림에 반영
데이터 소비자(Data Consumer) 영향 최소화: 스키마 변경으로 인한 데이터 손실 및 오류 방지
수동 개입(Manual Intervention) 최소화: 스키마 변경 과정의 자동화 및 효율성 극대화
자동화된 스키마 변경 지원을 통해 데이터 파이프라인의 안정성과 확장성을 더욱 강화하고, 데이터 엔지니어링(Data Engineering) 생산성을 향상시킬 수 있을 것으로 기대된다.