💡 핵심 인사이트 변경 데이터 캡처(CDC, Change Data Capture)는 "데이터베이스의 변경 사항(INSERT, UPDATE, DELETE)을 실시간 또는 준실시간으로 파악하여, 이를 다른 시스템이나 데이터 저장소로 전달하는" 데이터 통합 기법입니다. 기존 방식인 **ETL(Extract-Transform-Load)이夜間 배치로 전체 데이터를 다시 이동**했다면, CDC는 **변경된 부분만 선별적으로捕獲하여 대용량 데이터 이동의 효율성을 극대화**합니다. 데이터 웨어하우스, 데이터 레이크, 이벤트 스트리밍, 마이크로서비스 간 데이터 동기화 등 다양한 시나리오에서 핵심적인 역할을 합니다.
Ⅰ. CDC의诞生 배경: 배치 vs 실시간의 격차
전통적인 데이터 동기화 방식인 배치 ETL에는 몇 가지 근본적 한계가 있습니다:
[배치 ETL 방식의 문제점]
source DB ──[,夜间 batch 1회]──> Data Warehouse
문제 1: 데이터 지연
- source에서 발생한 변경이 DW에 반영되기까지 최대 24시간 소요
- "_오늘 오전에 주문한 고객이 이미 출고된 商品을 오후에 취소했다면?_
_DW에서는 해당 취소가 잡히지 않아 재고 수량이 틀어질 수 있음_"
문제 2: 대용량 데이터 이동 부담
- 매번 전체 테이블을 추출/이동해야 함
- 수십억 건의 테이블이 있으면夜間 batch도 감당하기 어려움
- 네트워크와 DW에 큰 부하
문제 3: source 시스템에 미치는 영향
- 대량 읽기(Full Table Scan)가 source DB의 성능에 영향
- "_ OLTP 시스템을夜间에도 느리게 만든다_"
CDC는 이러한 문제를 해결합니다. 변경된 데이터만 선별적으로捕獲하여, **거의 실시간에 가까운 데이터 동기화**와 **source 시스템에 대한 최소한의 영향**을 동시에 달성합니다.
Ⅱ. CDC의 작동 원리: 다양한 구현 방식
CDC는 여러 기술적 접근법을 통해 구현됩니다.
[CDC 구현 방식 분류]
┌─────────────────────────────────────────────────────────────────┐
│ CDC 구현 방식 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. 로그 기반 CDC (Log-Based CDC) │
│ - DB의 트랜잭션 로그(WAL)를 읽어 변경사항 추출 │
│ - 비침범적(Non-invasive), 거의 실시간 │
│ 예: Debezium, AWS DMS, Oracle GoldenGate │
│ │
│ 2. 트리거 기반 CDC (Trigger-Based CDC) │
│ - DB 테이블에 변경 감지 트리거 생성 │
│ - 구현이 간단하나, source DB에 약간의 오버헤드 │
│ 예: 사용자 정의 트리거 + 변경 로그 테이블 │
│ │
│ 3. 타임스탬프 기반 CDC (Timestamp-Based CDC) │
│ - updated_at, modified_date 등 타임스탬프 컬럼 활용 │
│ - LastSyncTime 이후 변경된 레코드만 추출 │
│ - 가장 간단하나, DELETE捕捉不可 │
│ │
│ 4. 스냅샷 비교 CDC (Snapshot Comparison CDC) │
│ - 이전 스냅샷과 현재 스냅샷을 비교하여 차이 계산 │
│ - 구현 간단하나, 리소스 많이 사용 │
│ │
└─────────────────────────────────────────────────────────────────┘
로그 기반 CDC의 상세 작동 흐름:
[로그 기반 CDC 처리 흐름]
┌─────────────────────────────────────────────────────────────────┐
│ 로그 기반 CDC 아키텍처 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Source Database (OLTP) │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 사용자가 UPDATE customers SET name='Kim' WHERE id=1 │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ 트랜잭션 로그 (WAL / Redo Log) │ │ │
│ │ │ LSN=1000: UPDATE customers SET name='Kim' │ │ │
│ │ │ WHERE id=1 │ │ │
│ │ │ (Before: name='Lee', After: name='Kim') │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ (Debezium Connector가 로그를 읽음) │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Kafka / Pulsar 등 메시지 큐 │ │
│ │ Topic: dbserver1.customers.CDC │ │
│ │ Message: { │ │
│ │ "before": {"id":1, "name":"Lee"}, │ │
│ │ "after": {"id":1, "name":"Kim"}, │ │
│ │ "op": "U", // Update │ │
│ │ "ts_ms": 1705123456789 │ │
│ │ } │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ (Consumer가 메시지를 처리) │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Target Systems │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Data Lake │ │ Data Warehouse│ │ Analytics │ │ │
│ │ │ (S3/ADLS) │ │ (Snowflake) │ │ (ES/Kibana) │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
Ⅲ. 주요 CDC 도구와 특성
1. Debezium (오픈소스)
가장 널리 사용되는 로그 기반 CDC 오픈소스 도구입니다.
- 지원 DB: MySQL, PostgreSQL, MongoDB, SQL Server, Oracle, Db2
- 출력: Kafka, Kinesis 등 메시지 스트림
- 특징: CDC 레코드에서 before/after image 모두 제공, 스키마 변경 감지
[Debezium CDC 메시지 예시]
{
"schema": {...},
"payload": {
"before": {"id": 1, "name": "Lee", "email": "lee@example.com"},
"after": {"id": 1, "name": "Kim", "email": "lee@example.com"},
"op": "u", // u=update, c=create, d=delete, r=snapshot
"ts_ms": 1705123456789,
"transaction": null
}
}
2. AWS Database Migration Service (DMS)
AWS의 관리형 CDC 서비스입니다.
- 지원 소스: Oracle, SQL Server, PostgreSQL, MySQL, MariaDB, SAP
- 특징: 완전 관리형, 소스 DB에 에이전트 설치 불필요
- 사용 사례: 온프레미스 → AWS로의 migration, cross-region 복제
3. Oracle GoldenGate
Oracle의エンタープ라이즈급 CDC/복제 솔루션입니다.
- 지원: Oracle, SQL Server, DB2, Big Data 등
- 특징:HA 구성, 데이터 변환 기능, 양방향 복제 지원
- 사용 비용: 상당히 고가이지만,エンタープ라이즈 환경에 적합
Ⅳ. CDC의 활용 사례
1. 데이터 웨어하우스로의 실시간 적재
[사용 사례: OLTP → DW 실시간 동기화]
OLTP (source) CDC Kafka ETL/ELT DW
┌─────────────┐ ┌──────────┐ ┌─────────┐ ┌────────┐ ┌─────────┐
│ Orders │───>│ Debezium │───>│ Orders │───>│ SCD │──>│ Fact │
│ customers │ │ │ │ Topics │ │ Type 2 │ │ Tables │
│ Products │ │ │ │ │ │ Upsert │ │ │
└─────────────┘ └──────────┘ └─────────┘ └────────┘ └─────────┘
│ │
│ 변경 로그 스트림 │ 변화량 적용
└──────────────────────────────────────────────┘
장점:
- DW가 거의 실시간으로 최신 데이터 반영
- 전체 테이블 추출 불필요 (변경분만 이동)
- OLTP에 대한 영향 최소화
2. 마이크로서비스 간 데이터 동기화
[사용 사례: 모놀리스 → 마이크로서비스 전환]
기존: 하나의 큰 DB를 여러 서비스가 공유
변환: 각 서비스가 Own하는 DB를 가지되, CDC로 동기화
┌────────────┐ ┌────────────┐ ┌────────────┐
│ Order │ │ Customer │ │ Inventory │
│ Service DB │<─────>│ Service DB │<─────>│ Service DB │
└─────┬──────┘ └─────┬──────┘ └─────┬──────┘
│ │ │
└────────────────────┼────────────────────┘
│
┌──────┴──────┐
│ CDC (Event) │
│ Bus │
└─────────────┘
이벤트 주도 아키텍처에서 CDC는 기존 모놀리스 DB의 변경을
마이크로서비스들이 구독하는 이벤트로 변환하는 역할을 함
Ⅴ. CDC 적용 시 고려사항과 📢 비유
기술적 고려사항:
- 로그 보존 정책: CDC는 트랜잭션 로그를 읽으므로, source DB의 **로그 보존 기간**이 CDC 지연 시간보다 길어야 합니다.
- 초기 로드(Initial Load): CDC는 실시간 변경만捕獲하므로, **기존 데이터의 한꺼번에 이동(초기 로드)**이 필요합니다.
- 스키마 변경: 테이블 구조(컬럼 추가/삭제) 변경 시 CDC 메시지 포맷에 영향 → 스키마 변경 감지 메커니즘 필요
- 순서 보장: 분산 시스템에서 메시지 순서가 바뀔 수 있음 → 同一个 Partition 내 순서 보장 또는 어플리케이션 수준에서 정렬 필요
CDC와 Audit의 관계: CDC는 데이터 복제의 목적이 아니더라도, "어떤 데이터가 언제, 누가, 어떤 값으로 변경되었는지"を追跡하는 Audit/Compliance 목적으로도 활용됩니다.
📢 섹션 요약 비유: CDC는 **"우리의 몸의 면역 시스템에 비유"**할 수 있습니다.全身의 세포에서 일어나는 모든 변화를 중앙 뇌에報告하지 않고, **변화가 생긴 곳(원본 데이터베이스)에서 바로 신호(변경 로그)를 보내" 다른 장기(타겟 시스템)에 전달하는 것입니다. 전체 몸을スキャン해서(배치 ETL) 변화를 감지하는 것보다 (효율적이고, 실시간에 가깝고, 원래 시스템에 부담이 적음)입니다. 다만 "감염된 세포의 오류를 어떻게 감지하고 대응할 것인가(데이터 품질/오류 처리)"는 별도의 메커니즘이 필요합니다.