302. CDC (Change Data Capture)
핵심 인사이트 (3줄 요약)
- 본질: CDC(Change Data Capture)는 데이터베이스의 변경 로그(로그 기반)나 트리거(트리거 기반)를 통해 INSERT, UPDATE, DELETE 연산을 실시간 또는 준실시간으로 캡처하는 기술이다.
- 가치: 운영 시스템에 무부하로 데이터 변경을 추출하여, DW/데이터 레이크로의 실시간 동기화, Microservice 간的事件驱动通信, Audit 추적이 가능하다.
- 융합: Debezium, AWS DMS, Kafka, 데이터 파이프라인, ODS, 스트림 처리, 복제와 밀접하게 연관된다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
개념 정의
CDC(Change Data Capture)는 데이터베이스의 데이터 변경 사항(INSERT, UPDATE, DELETE)을 캡처하여, 이를 다른 시스템(데이터 웨어하우스, 데이터 레이크, 다른 데이터베이스, 메시지 큐 등)으로 실시간 또는 준실시간으로 전달하는 기술이다. CDC는 소스 데이터베이스의 복제 로그(Write-Ahead Log, Redo Log, Binary Log 등)를 활용하거나, 데이터베이스에 설정된 트리거를 통해 변경 사항을 캡처한다. 기존 배치 기반 ETL(야간 일괄 처리)과 달리 CDC는 변경 사항을 실시간에 가깝게 추출하므로,DW/데이터 레이크의 데이터 fresh度를 획기적으로 향상시킨다.
필요성
전통적인 ETL 방식은 야간 배치로大批量 데이터를 DW에 이동시키므로, business 사용자에게 제공되는 데이터의新鲜度가 최대 24시간 전까지 지연될 수 있다. 그러나 modern 비즈니스는より素早い 의사결정을 위해near real-time 데이터 분석을 필요로 한다. CDC는 이러한 문제을 해결하기 위해, 소스 DB의 변경 로그를 실시간으로 캡처하여DW에 지속적으로 동기화함으로써, 데이터 지연을 数시간에서 数분乃至는 数초로 단축시킨다. 또한 CDC는 운영 시스템의 추출 작업을 최소화하여, 24/7 작동하는 OLTP 시스템의 성능에 무부하 또는 최소 부하만 유발한다.
배경
CDC 기술은 Database Replication (복제) 기술에서 비롯되었다. MySQL의 Binary Log, PostgreSQL의 WAL (Write-Ahead Log), Oracle의 Redo Log/Archive Log 등은 원래 데이터 복구를 위해 존재했지만, 이를 활용하면 복제와 동일하게 변경 사항을 캡처할 수 있다. Debezium(2016년 출시)은 Kafka 기반의 오픈소스 CDC 플랫폼으로, MySQL, PostgreSQL, MongoDB, SQL Server 등 다양한 DB의 변경 로그를 캡처하여 Kafka topic으로 전달한다. AWS DMS (Database Migration Service)도 CDC 기능을 提供하여, 소스 DB의 변경을 지속적으로 타겟 DB로 복제한다. 최근에는 Event-driven Architecture와 Microservices에서 CDC의重要性이 더 증가하고 있다.
비유
CDC는大型호텔의 실시간 객실 상태 동기화 시스템과 같다. 기존 방식(배치 ETL)은 매일 아침 총무팀이 各층의 객실 현황을 직접 순회하여 파악하는 것이라면, CDC는 각 객실의ドア 센서가 door 열고 닫을 때마다(변경 발생 시)即時 중앙 시스템에 сообщение하는 것이다. 문을 열 때마다報告하므로 중앙 시스템은 항상 최신 상태를 파악하고 있으며, 총무팀의 직접 방문(운영 시스템 부하)은 불필요하다.
📢 섹션 요약: CDC는 DB 변경 로그를 활용하여 변경 사항을 실시간/準실시간으로 캡처하는 기술로, 운영 시스템 무부하로DW/데이터 레이크 동기화가 가능하다.
Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)
CDC 구현 방식
┌─────────────────────────────────────────────────────────────────────────────┐
│ CDC 구현 방식 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ [1] 로그 기반 CDC (Log-based CDC) │
│ ───────────────────────────────── │
│ • DB의 복제 로그(WAL, Binary Log, Redo Log)를 읽어서 변경을 캡처 │
│ • 운영 시스템에 무부하 (로그는 이미 존재하므로) │
│ • 순서 보장, 완전한 변경 이력 캡처 가능 │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ MySQL Binary Log (binlog) 예시 │ │
│ │ ──────────────────────────────────────────────────────────────── │ │
│ │ │ │
│ │ # Binary Log Format (ROW mode) │ │
│ │ Table: customers │ │
│ │ ════════════════════════════════════════════════════════════════ │ │
│ │ Event Type: UPDATE │ │
│ │ Before: {id:1, name:"김철수", balance:1000} │ │
│ │ After: {id:1, name:"김철수", balance:900} ← 잔액 변경 │ │
│ │ Timestamp: 2024-01-15 10:30:00 │ │
│ │ Position: 12345678 │ │
│ │ │ │
│ │ ※ CDC Agent가 binlog을 모니터링하여 변경 Events를 캡처 │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ [2] 트리거 기반 CDC (Trigger-based CDC) │
│ ───────────────────────────────────── │
│ • DB에 트리거를 설정하여 변경 시 별도 테이블에 기록 │
│ • 로그 기반보다 설정이 간단하지만, 운영 DB에 부하 발생 │
│ • 캡처 범위 제한 (DML만, DDL은 별도 처리 필요) │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ Trigger 예시 (PostgreSQL) │ │
│ │ ──────────────────────────────────────────────────────────────── │ │
│ │ │ │
│ │ CREATE TABLE customers_changes ( │ │
│ │ change_id SERIAL PRIMARY KEY, │ │
│ │ operation CHAR(1), -- I, U, D │ │
│ │ customer_id INT, │ │
│ │ old_data JSONB, │ │
│ │ new_data JSONB, │ │
│ │ changed_at TIMESTAMP DEFAULT NOW() │ │
│ │ ); │ │
│ │ │ │
│ │ CREATE TRIGGER trg_customers_capture │ │
│ │ AFTER INSERT OR UPDATE OR DELETE ON customers │ │
│ │ FOR EACH ROW EXECUTE FUNCTION capture_customers_change(); │ │
│ │ │ │
│ │ ※ 변경이 발생할 때마다 이 테이블에 레코드 INSERT → CDC Agent가 읽음 │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ [3] 시간戳/버전 기반 CDC │
│ ────────────────────────────── │
│ • 원본 테이블에 updated_at TIMESTAMP 컬럼을 활용 │
│ • 마지막 추출 시점 이후 변경된 레코드만 SELECT │
│ • 구현 간단하지만, DELETE 캡처 어려움, UPDATE 판별 어려움 등 제한 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
CDC 기반 데이터 파이프라인
┌─────────────────────────────────────────────────────────────────────────────┐
│ CDC 기반 데이터 파이프라인 아키텍처 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ [CDC + Kafka + DW/데이터 레이크 아키텍처] │
│ │
│ ┌──────────────┐ │
│ │ Source DB │ │
│ │ (MySQL, │ │
│ │ PostgreSQL)│ │
│ └──────┬───────┘ │
│ │ │
│ │ Binlog / WAL │
│ │ (무부하 실시간 복제) │
│ ▼ │
│ ┌──────────────┐ │
│ │ CDC Agent │ │
│ │ (Debezium, │ │
│ │ AWS DMS) │ │
│ └──────┬───────┘ │
│ │ │
│ │ Change Events (JSON) │
│ ▼ │
│ ┌──────────────┐ │
│ │ Apache Kafka │ │
│ │ (Message │ │
│ │ Queue) │ │
│ └──────┬───────┘ │
│ │ │
│ ┌──────┴───────┐ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ │
│ │ Stream │ │ Stream │ │
│ │ Processor│ │ Processor│ │
│ │ (Flink, │ │ (Kafka │ │
│ │ Spark) │ │ Streams)│ │
│ └──────┬────┘ └──────┬────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Data Lake │ │ ODS │ │
│ │ (Bronze/ │ │ (Real-time │ │
│ │ Raw Zone) │ │ Staging) │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ │ ▼ │
│ │ ┌──────────────┐ │
│ │ │ Data │ │
│ │ │ Warehouse │ │
│ │ │ (DW) │ │
│ │ └──────────────┘ │
│ │ │
│ └──────────────────┬─────────────────────────── │
│ ▼ │
│ ┌──────────────┐ │
│ │ BI / ML │ │
│ │ Analytics │ │
│ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
CDC 도구 비교
┌─────────────────────────────────────────────────────────────────────────────┐
│ CDC 도구 비교 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────────┬──────────┬──────────┬──────────┬──────────┐ │
│ │ 특성 │ Debezium │ AWS DMS │ Fivetran │ Oracle │ │
│ │ │ │ │ │ Golden- │ │
│ │ │ │ │ │ Gate │ │
│ ├────────────────┼──────────┼──────────┼──────────┼──────────┤ │
│ │ 기반 기술 │ Kafka │ Kafka │ Cloud │專용Agent │ │
│ │ │ Connect │ │ (SaaS) │ │ │
│ ├────────────────┼──────────┼──────────┼──────────┼──────────┤ │
│ │ 지원 DB │ MySQL, │ MySQL, │ Various │ Oracle, │ │
│ │ │ PostgreSQL│ PostgreSQL│ (20+ │ SQL Server,│ │
│ │ │ MongoDB, │ Oracle, │ sources) │ DB2, etc │ │
│ │ │ SQL Server│ SQL Server│ │ │ │
│ ├────────────────┼──────────┼──────────┼──────────┼──────────┤ │
│ │ 배포 형태 │ On-prem │ Fully │ SaaS │ On-prem │ │
│ │ │ /Cloud │ Managed │ │ /Cloud │ │
│ ├────────────────┼──────────┼──────────┼──────────┼──────────┤ │
│ │ 설정 난이도 │ 중간 │ 낮음 │ 낮음 │ 높음 │ │
│ ├────────────────┼──────────┼──────────┼──────────┼──────────┤ │
│ │ 성능 │ 높음 │ 높음 │ 높음 │ 높음 │ │
│ ├────────────────┼──────────┼──────────┼──────────┼──────────┤ │
│ │ Ordering 보장 │ ✓ │ ✓ │ ✓ │ ✓ │ │
│ ├────────────────┼──────────┼──────────┼──────────┼──────────┤ │
│ │ Schema evolution│ ✓ │ ✓ │ ✓ │ ✓ │ │
│ │ 지원 │ │ │ │ │ │
│ ├────────────────┼──────────┼──────────┼──────────┼──────────┤ │
│ │ 비용 │ 무료 │ 사용량별 │ 구독 기반 │高昂 │ │
│ │ │ (오픈소스)│ 과금 │ │ │ │
│ └────────────────┴──────────┴──────────┴──────────┴──────────┘ │
│ │
│ [CDC 선택 기준] │
│ ───────────── │
│ ✅ Debezium: Kafka 에코시스템 사용 중, 오픈소스 선호 │
│ ✅ AWS DMS: AWS 환경, Managed 서비스 선호 │
│ ✅ Fivetran: 빠른 구축, SaaS 선호, 다양한 소스 필요 │
│ ✅ Oracle GoldenGate: Oracle 환경, 높은 신뢰성 요구 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
CDC의 활용场景
┌─────────────────────────────────────────────────────────────────────────────┐
│ CDC 주요 활용场景 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ [1] DW/데이터 레이크 실시간 동기화 │
│ ───────────────────────────────── │
│ • OLTP → DW로의 배치 ETL을 CDC 기반 실시간 적재로 전환 │
│ • 데이터 fresh度 24시간 → 수분乃至는 수초로 단축 │
│ • 예: AWS DMS를활용한 RDS → Redshift 실시간 복제 │
│ │
│ [2] Microservice 간的事件驱动 통신 │
│ ───────────────────────────────────── │
│ • 직접적인 동기식 API 호출 대신, 각 서비스 DB 변경을 Kafka로 publish │
│ • 서비스 간 느슨한 결합(Loose Coupling) 달성 │
│ • 예: 주문 서비스의 주문 완료 → Kafka topic → 결제 서비스 자동トリガー │
│ │
│ [3] Audit/감사 추적 │
│ ────────────────────── │
│ • 민감 데이터의 변경 이력을 별도 저장하여 감사 추적 │
│ • 예: 개인정보 변경 내역, 금융 거래 기록 감사 로그 │
│ │
│ [4] Cache/읽기 복제본 갱신 │
│ ───────────────────────── │
│ • DB 변경 시 Cache(Redis 등)를 자동으로 무효화/갱신 │
│ • 애플리케이션 코드 수정 불필요 │
│ │
│ [5] Event Sourcing 구현 │
│ ────────────────────── │
│ • 도메인 собы트를 캡처하여CQRS 패턴과 결합 │
│ • 예: 은행 거래 → 거래 Event 저장 → 잔고 Projection 계산 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
[다이어그램 해설] CDC는 로그 기반이 가장 무부하이며 완전한 변경 이력을 캡처할 수 있어 사실상 표준이다. Debezium은 Kafka Connect 기반으로 다양한 DB를 支持하는 대표적 오픈소스 CDC이며, AWS DMS는 fully managed 서비스로 AWS 환경에 최적화되어 있다. CDC는 DW 실시간 동기화뿐 아니라, Microservices 간 event-driven 통신, Audit 추적, Cache 갱신 등 다양한 활용场景이 있다.
📢 섹션 요약: CDC는 로그 기반이 가장 무부하로 완전한 변경 이력을 캡처하며, DW 실시간 동기화, event-driven 통신, 감사 추적 등 다양한 활용场景이 있다.
Ⅲ. 결론
CDC(Change Data Capture)는 DB의 변경 사항을 실시간/準실시간으로 캡처하는 핵심 데이터 엔지니어링 기술이다. 로그 기반 CDC가 가장 무부하이며 완전한 변경 이력을 보장한다. Debezium, AWS DMS, Fivetran 등 다양한 CDC 도구가 있으며, Kafka와 결합하여 스트림 처리 파이프라인의 핵심 역할을 수행한다. CDC는 전통적인 배치 ETL의 한계를 극복하고, modern 데이터 플랫폼에서 실시간 데이터 통합의 핵심 기반 기술로 자리 잡았다.
📢 섹션 요약: CDC는 로그 기반으로 운영 DB 무부하에 변경 사항을 캡처하며, 실시간 DW 동기화, event-driven 통신, 감사 추적 등 다양한 활용场景이 있는 핵심 기술이다.
핵심 인사이트 ASCII 다이어그램 (Concept Map)
┌─────────────────────────────────────────────────────────────────────────────┐
│ CDC Concept Map │
│ │
│ ┌─────────────────────────────────┐ │
│ CDC (Change Data Capture) │ │
│ (변경 데이터 캡처) │ │
└───────────────┬─────────────────┘ │
│ │ │
│ ┌────────────────────┼────────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Log-based │ │Trigger-based│ │ Timestamp- │ │
│ │ CDC │ │ CDC │ │ based CDC │ │
│ │ (WAL/Binlog)│ │ │ │ │ │
│ │ (무부하 ✓) │ │ (부하 발생) │ │ (제한적) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │ │ │
│ └────────────────────┼────────────────────┘ │
│ ▼ │
│ ┌─────────────────────┐ │
│ │ Kafka + Stream │ │
│ │ Processing │ │
│ │ (Flink, Spark) │ │
│ └─────────────────────┘ │
│ │
│ 활용: DW 동기화 | Event-driven | Audit | Cache 갱신 | Event Sourcing │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
참고
- CDC는 DB 변경 사항을 실시간/準실시간으로 캡처하는 기술이다.
- 로그 기반 CDC가 가장 무부하이며 완전한 변경 이력을 보장한다.
- Debezium, AWS DMS, Fivetran 등이 대표적 CDC 도구이다.
- Kafka와 결합하여 스트림 처리 파이프라인의 핵심 역할을 수행한다.
- DW 실시간 동기화, event-driven 통신, 감사 추적 등에 활용된다.
- 배치 ETL의 한계를 극복하는 핵심 기술이다.