Postgres CDC 데이터 미러링 2026, Snowflake 복제·비용·운영 기준

Postgres CDC 데이터 미러링을 찾는 팀은 대개 두 갈래 압박을 동시에 받는다.
운영 DB의 변경을 분석 플랫폼에 빨리 보내야 하지만 Kafka Connect, Debezium, Airflow 배치, 수동 적재를 계속 늘리는 방식은 장애 지점이 많다.
Snowflake가 공개한 Data Mirroring은 이 고민을 Postgres 내부 확장, Apache Iceberg 변경 로그, Snowflake 적용 프로세스로 다시 묶는 접근이다.
다만 이 기능을 “커넥터 없이 된다”는 한 줄로 받아들이면 위험하다.
실제 도입 판단은 지연 시간, 스키마 변경 처리, 삭제·삽입 적용 방식, Warehouse credit, 보안 경계, 프리뷰 기능 리스크를 같이 봐야 한다.
- Snowflake Data Mirroring은 Snowflake Postgres 변경분을 Apache Iceberg 테이블로 보내고 Snowflake 쪽에서 적용하는 공개 미리보기 기능이다.
- 공식 설명 기준 snowflake_cdc 확장은 Postgres 내부 상태를 보며 스냅샷, DML, DDL, 트랜잭션 경계를 조정한다.
- 비용은 별도 CDC 서버 유무만이 아니라 Snowflake credit, Warehouse 실행 시간, 저장소 증가, Live View 쿼리, 데이터 이동 정책에서 갈린다.
- 운영 파일럿은 전체 DB 복제보다 테이블 3~5개, 지연 SLO, 비용 예산, 스키마 변경 훈련, 보안 제외 테이블부터 작게 시작해야 한다.
이 글이 필요한 사람
- Postgres 운영 DB를 Snowflake 분석 환경으로 거의 실시간 복제하려는 데이터 플랫폼 담당자
- Debezium, Kafka Connect, Airbyte, Fivetran 같은 외부 CDC 계층을 줄일 수 있는지 검토하는 팀
- Snowflake 비용 최적화 글을 읽고도 CDC 적용 비용을 별도 산정해야 하는 FinOps 담당자
- 스키마 변경, 삭제 이벤트, 트랜잭션 경계가 분석 테이블에서 틀어지는 사고를 줄이고 싶은 SRE
- 개인정보가 섞인 운영 DB를 분석 플랫폼으로 보내기 전에 보안 제외 범위와 감사 증거를 정해야 하는 보안팀
먼저 결론: Postgres CDC 데이터 미러링은 배치 대체가 아니라 복제 운영 모델이다
Snowflake Engineering 글의 핵심은 CDC를 외부 소비자에게만 맡기면 Postgres 내부 상태를 모르는 계층이 너무 많은 판단을 떠안는다는 점이다.
논리 디코딩은 WAL을 행 단위 변경 스트림으로 바꿔 주지만, 이후 스냅샷 충돌, 스키마 변경, 장애 재시작, 트랜잭션 정렬은 보통 외부 도구가 처리한다.
Data Mirroring은 이 일부를 Snowflake Postgres 쪽 확장과 Snowflake 쪽 적용 프로세스로 당겨서 복제 흐름을 단순화하려는 설계다.
그래서 비교 기준도 “Debezium보다 편한가”로 끝나면 부족하다.
이 조건이면 검토한다.
운영 DB가 Snowflake Postgres이고, 분석 대상이 Snowflake이며, 팀이 미리보기 기능을 제한된 범위에서 검증할 수 있어야 한다.
이 경우는 보류한다.
소스가 일반 PostgreSQL/RDS/Aurora이고, 여러 분석 목적지로 동시에 내보내야 하며, 이미 안정된 CDC 관제와 재처리 체계가 있다면 전환 이득이 작다.
공식 구조: snowflake_cdc, Iceberg 변경 로그, 적용 프로세스
Snowflake 설명 기준 Data Mirroring은 Snowflake Postgres에서 Snowflake로 데이터를 낮은 지연으로 옮기는 공개 미리보기 기능이다.
변경분은 Apache Iceberg 변경 로그에 배치 단위로 기록되고, Snowflake가 이를 서버리스 또는 관리형 적용 프로세스로 대상 테이블에 반영한다.
중간에는 객체 저장소가 놓인다.
이 구조는 생산자인 Postgres 확장과 소비자인 Snowflake 적용 계층을 분리해 네트워크 장애와 적용 장애를 같은 프로세스 안에 묶지 않게 한다.
PostgreSQL 공식 문서의 logical decoding은 WAL 레코드를 논리적 변경으로 풀어내는 기반 기능이다.
Snowflake의 차별점은 논리 디코딩 자체보다 스냅샷, 메타 로그, 트랜잭션 경계, Live Views를 운영형 복제 제품 안에 묶는 방향이다.
| 구성 요소 | 역할 | 운영자가 확인할 질문 | 실패 시 영향 |
|---|---|---|---|
| snowflake_cdc 확장 | Postgres 내부에서 변경 로그와 메타 로그를 만든다 | 지원 버전, 권한, 대상 테이블 범위가 공식 가이드와 맞는가 | WAL 보존, 스키마 변경, 캡처 지연이 동시에 흔들린다 |
| 객체 저장소 | 변경 배치와 메타 정보를 생산자·소비자 사이에 둔다 | 버킷 권한, 암호화, 보관 기간, 리전이 통제되는가 | 적용 지연과 재처리 비용이 증가한다 |
| Snowflake 적용 계층 | Iceberg 변경 로그를 대상 테이블에 반영한다 | 적용 주기, Warehouse credit, 실패 재시도가 관측되는가 | 분석 테이블이 특정 트랜잭션 시점에 멈춘다 |
| Live Views | 미적용 변경분과 대상 테이블을 함께 조회한다 | 지연 단축이 쿼리 비용과 복잡도를 정당화하는가 | 최신성 착시와 예상 밖 스캔 비용이 생긴다 |
비용 구조: 커넥터 서버를 지워도 Snowflake credit은 남는다
CDC 비용을 “커넥터 서버 월 비용”만으로 보면 잘못된 결론이 나온다.
Snowflake 공식 비용 문서는 총비용을 compute, storage, data transfer로 나누고, compute는 credit 소비량과 credit 단가의 곱으로 계산한다고 설명한다.
Warehouse 문서는 Gen1 Standard 기준 X-Small 1 credit/hour, Small 2, Medium 4, Large 8, X-Large 16, 2X-Large 32 credit/hour 구조를 제시한다.
또한 Warehouse 과금은 초 단위지만 시작할 때마다 60초 minimum이 붙는다.
Cloud Services 계층은 하루 Warehouse 사용량의 10%를 넘는 경우에만 별도 과금될 수 있다고 공식 비용 문서가 설명한다.
| 비용 항목 | 공식 숫자·단위 | CDC 미러링에서 보는 방식 | 파일럿 기준 |
|---|---|---|---|
| Warehouse compute | X-Small 1, Small 2, Medium 4, Large 8 credits/hour | 적용 작업과 검증 쿼리가 어느 크기에서 도는지 본다 | 처음은 X-Small 또는 Small로 제한해 credit/hour를 기록한다 |
| 초 단위 과금 | Per-second billing, 60-second minimum | 짧은 적용 작업을 자주 깨우면 minimum이 누적된다 | 적용 주기와 쿼리 주기를 함께 바꿔 credit 변화를 본다 |
| Cloud Services | Daily warehouse usage의 10% 초과분 과금 가능 | 메타데이터, 권한, 관리 작업이 급증하는지 본다 | 계정 usage view에서 cloud services 비율을 주간 확인한다 |
| Storage | 평균 on-disk bytes를 월 단위로 계산 | 변경 로그, 대상 테이블, 스냅샷성 데이터가 함께 늘 수 있다 | GB/day 증가량과 보관 기간을 비용 owner에게 보고한다 |
| Data transfer | Ingress는 과금하지 않고 egress는 리전·클라우드별 TB 단위 정책 확인 | 다른 리전이나 다른 클라우드로 나가면 CDC와 별개 비용이 생긴다 | 소스·타깃 리전을 같은 정책권에 두는지 먼저 확인한다 |
이 표의 숫자는 Snowflake 공식 문서에 있는 credit 단위와 과금 조건을 운영 검토용으로 바꾼 것이다.
실제 원화 예산은 조직의 Snowflake edition, cloud provider, region, 계약 credit price, 환율에 따라 달라진다.
참고로 이 글은 LLM API 가격표가 아니므로 입력 토큰, 출력 토큰, USD 토큰 단가가 아니라 Snowflake credit/hour와 storage/data transfer 단위로 본다.
외부 CDC, 배치 ETL, zero-ETL과 비교할 항목
Postgres CDC 데이터 미러링은 기존 도구를 전부 밀어내는 만능 대안이 아니다.
목적지가 Snowflake 하나인지, 여러 소비자가 있는지, 소스가 Snowflake Postgres인지, 장애 재처리를 누가 책임질지가 선택을 가른다.
| 선택지 | 맞는 상황 | 주의할 점 | 보안·운영 질문 |
|---|---|---|---|
| Snowflake Data Mirroring | Snowflake Postgres에서 Snowflake 분석 테이블로 가는 단일 경로 | 공개 미리보기와 지원 범위를 확인해야 한다 | 미러링 권한과 제외 테이블 정책이 있는가 |
| Debezium 또는 Kafka Connect | 여러 목적지와 이벤트 소비자가 필요한 환경 | 커넥터, Kafka, schema registry 운영이 필요하다 | 토픽 권한과 PII 마스킹 계층이 분리되는가 |
| Airflow·dbt 배치 | 지연 요구가 시간 단위이고 변환 로직이 더 중요한 환경 | 삭제 이벤트와 순서 보존이 약할 수 있다 | 재실행이 멱등하게 설계됐는가 |
| Aurora zero-ETL 계열 | AWS 관리형 DB와 분석 서비스 결합을 우선하는 환경 | 클라우드 종속성과 지원 리전이 판단 포인트다 | 데이터 주권과 리전 정책이 맞는가 |
이 조건이면 Data Mirroring을 파일럿한다.
소스와 타깃이 Snowflake 생태계 안에 있고, 분석 신선도 SLO가 분 단위이며, 테이블 범위를 작게 시작할 수 있어야 한다.
이 경우는 기존 CDC를 유지한다.
동일 변경 스트림을 검색, ML feature store, 감사 로그, 외부 파트너까지 보내야 한다면 중앙 이벤트 로그가 더 낫다.
실무 시나리오 1: 결제 이벤트를 분 단위 분석으로 보내는 SaaS
구독형 SaaS는 결제 실패, 환불, 플랜 변경 이벤트를 운영 DB에서 분석 테이블로 자주 보낸다.
배치가 1시간마다 돌면 고객지원팀은 이미 늦은 정보를 보고, 실시간 스트리밍을 직접 운영하면 작은 팀에 Kafka 운영 부담이 붙는다.
이 조건이면 Postgres CDC 데이터 미러링을 검토한다.
orders, order_events, subscription_status처럼 분석 가치가 높고 개인정보 원문이 적은 테이블 3개부터 시작한다.
파일럿 성공 기준은 “복제가 됐다”가 아니라 p95 지연 5분 이하, 일일 credit 예산 초과 0회, 스키마 변경 테스트 1회 통과로 둔다.
실무 시나리오 2: 스키마 변경이 잦은 제품 조직
외부 CDC에서 자주 깨지는 지점은 새 컬럼, 타입 변경, 테이블 추가, 삭제 이벤트가 스냅샷과 변경분 사이에 끼는 순간이다.
Snowflake 글은 Data Mirroring이 Postgres 내부 상태를 보며 스키마 변경과 DML·DDL 트랜잭션을 정렬한다고 설명한다.
이 설명이 곧 운영 면제가 되지는 않는다.
실무에서는 배포 전 migration 이름, 적용 시간, 미러링 대상 테이블, 롤백 가능 여부를 배포 체크리스트에 넣어야 한다.
스키마 변경이 주 3회 이상인 조직은 “미러링 장애”보다 “미러링에 맞지 않는 배포 관행”을 먼저 고쳐야 한다.
실무 시나리오 3: 비용팀이 반대하는 저빈도 분석 워크로드
하루 한 번 매출 리포트를 만들 뿐인 팀에는 분 단위 CDC가 과하다.
이 경우는 보류한다.
Snowflake credit, storage, 관제 알림, 권한 리뷰까지 포함하면 단순 배치보다 운영비가 커질 수 있다.
반대로 고객지원, 이상거래, 재고, 과금 상태처럼 최신성이 고객 경험이나 손실로 이어지는 테이블은 다른 계산을 해야 한다.
비용팀과 합의할 문장은 “실시간이 필요하다”가 아니라 “지연 15분을 넘으면 어떤 손실이 생기는가”여야 한다.
파일럿 순서: 전체 DB가 아니라 실패 가능한 작은 범위로 시작한다
- 공식 문서에서 Snowflake Postgres, Data Mirroring 공개 미리보기, 지원 리전, 계정 권한, 대상 데이터베이스 조건을 먼저 확인한다.
- 미러링 대상 테이블을 3~5개로 제한하고 개인정보 원문, 인증 토큰, 원본 결제 payload 같은 테이블은 제외한다.
- Snowflake 개발자 가이드의 설정 절차를 따라 소스와 타깃을 연결하되 운영 계정이 아니라 파일럿 계정에서 시작한다.
- 적용 지연, 테이블별 row count, Warehouse credit, storage 증가량, 실패 재시도 로그를 같은 대시보드로 묶는다.
- 스키마 변경 리허설을 한 번 실행하고 새 컬럼 추가, nullable 변경, 테이블 추가가 분석 테이블에 어떻게 보이는지 기록한다.
- 파일럿 종료 조건을 정한다. 지연, 비용, 권한, 프리뷰 제약 중 하나라도 기준을 넘으면 운영 전환을 멈춘다.
설정 글처럼 메뉴명을 지어내면 안 된다.
Snowflake 공식 가이드가 계정별로 요구하는 화면과 권한이 다를 수 있으므로, 운영 문서에는 실제 콘솔 캡처 대신 확인한 문서 URL과 실행 담당자를 남긴다.
보안 기준: 미러링 권한은 읽기 권한보다 넓게 본다
CDC는 일반 조회보다 민감하다.
삭제된 행, 변경 전후 상태, 스키마 변화, 운영 DB의 내부 시간이 분석 계층으로 이동할 수 있기 때문이다.
보안팀은 “SELECT 권한이면 되는가”보다 “변경 이력 전체를 볼 권한을 누구에게 주는가”를 물어야 한다.
| 보안 항목 | 확인 질문 | 권장 처리 | 증적 |
|---|---|---|---|
| 권한 분리 | 복제 설정자와 분석 사용자가 같은 역할인가 | replication owner, apply owner, analyst role을 분리한다 | 역할 매트릭스와 승인 티켓 |
| 데이터 분류 | PII와 결제 원문이 미러링 범위에 들어가는가 | 제외하거나 마스킹 후 별도 승인한다 | 테이블 분류표와 제외 사유 |
| 객체 저장소 | 변경 로그 저장 위치 권한이 넓지 않은가 | 전용 버킷, 암호화, 최소 권한, 수명 주기를 둔다 | 버킷 정책과 접근 로그 |
| 스키마 변경 | 새 컬럼이 자동으로 민감정보를 포함할 수 있는가 | 배포 전 데이터 분류 체크를 release gate로 둔다 | migration review 기록 |
| 장애 대응 | 복제 중단 시 누가 멈추고 되돌리는가 | stop condition과 rollback owner를 운영 문서에 둔다 | incident runbook과 모의훈련 결과 |
운영 스켈레톤: 미러링 전 점검 YAML
아래 YAML은 실제 Snowflake 설정 파일이 아니라 운영 전 점검 항목을 고정하는 템플릿이다.
공식 가이드에서 확인한 계정 조건과 내부 보안 정책을 이 문서에 옮긴 뒤 파일럿 승인 기준으로 쓴다.
# cdc-mirroring-preflight.yaml
# 목적: Postgres CDC 데이터 미러링을 바로 운영에 넣기 전 소유권과 실패 기준을 고정한다.
# 실제 계정, 데이터베이스, 테이블 범위, 리전, 보관 기간은 조직 정책에 맞게 바꾼다.
mirror_candidate:
owner: data-platform-lead
source_engine: snowflake-postgres
target: snowflake-analytics
workload: product-events-and-billing-ledger
required_freshness_minutes: 5
max_accepted_lag_minutes: 15
launch_stage: preview-pilot-only
scope_control:
include_tables:
- public.orders
- public.order_events
- public.subscription_status
exclude_tables:
- public.raw_payment_payloads
- public.user_secrets
schema_change_policy: review-before-production
pii_policy: mask-or-exclude-before-mirror
cost_guardrail:
warehouse_size_for_apply_test: x-small
initial_runtime_budget_hours_per_week: 10
storage_growth_alert_gb_per_day: 50
live_view_query_budget_minutes_per_day: 30
stop_condition:
- lag_p95_minutes_above_15_for_2_days
- credit_usage_above_budget_for_3_days
- schema_change_incident_without_runbook
security_gate:
required:
- least_privilege_replication_role
- object_storage_access_isolated
- audit_log_enabled
- incident_rollback_owner_named
- data_classification_completed
관측 스켈레톤: 지연과 credit을 같은 화면에서 본다
미러링 파일럿은 데이터 freshness만 보지 말고 비용과 테이블 증가량을 같은 화면에 놓아야 한다.
아래 SQL은 실제 계정 view 이름을 조직 표준에 맞게 바꾸는 전제의 예시다.
-- snowflake-replication-monitor.sql
-- 목적: 미러링 파일럿에서 지연, 적용량, 쿼리 비용을 같은 대시보드로 본다.
-- 실제 뷰 이름은 Snowflake 공식 문서와 계정 구성에 맞게 바꾼다.
select
current_timestamp as checked_at,
'mirror_health' as check_name,
max(replication_lag_seconds) as max_lag_seconds,
count(*) as mirrored_table_count
from platform_mirror_status
where source_database = 'APP_POSTGRES';
select
date_trunc('hour', start_time) as hour_bucket,
warehouse_name,
sum(credits_used) as credits_used
from snowflake.account_usage.warehouse_metering_history
where start_time >= dateadd(day, -7, current_timestamp())
group by 1, 2
order by 1 desc, 2;
select
table_name,
row_count,
bytes,
last_altered
from information_schema.tables
where table_schema = 'MIRRORED_PUBLIC'
order by bytes desc;
운영 전환 전에는 이 쿼리 결과를 하루 단위 리포트로 저장한다.
지연이 낮아도 credit이 급증하면 적용 주기, Warehouse 크기, Live View 사용 범위를 다시 줄인다.
검증 스크립트: 지연 SLO를 코드로 실패시킨다
대시보드는 사람이 보는 도구이고, 배포 게이트는 실패를 자동으로 만들 수 있어야 한다.
아래 Python 스켈레톤은 실제 연결 코드를 빼고 지연과 row count 기준만 남긴 예시다.
# cdc_lag_check.py
# 목적: 운영 대시보드 전에 적용 지연과 누락 테이블을 실패 조건으로 바꾸는 검증 스켈레톤이다.
# 실제 연결 코드는 내부 시크릿 관리와 Snowflake Python Connector 정책을 따른다.
from dataclasses import dataclass
@dataclass
class MirrorTable:
name: str
lag_seconds: int
row_count: int
expected_min_rows: int
MAX_LAG_SECONDS = 900
sample = [
MirrorTable('orders', 420, 1200000, 1000000),
MirrorTable('order_events', 780, 4400000, 4000000),
MirrorTable('subscription_status', 120, 350000, 300000),
]
failures = []
for table in sample:
if table.lag_seconds > MAX_LAG_SECONDS:
failures.append(f'{table.name}: lag {table.lag_seconds}s')
if table.row_count < table.expected_min_rows:
failures.append(f'{table.name}: row count below floor')
if failures:
raise SystemExit('mirror gate failed: ' + ', '.join(failures))
print('mirror gate passed')
이 스크립트의 목적은 복잡한 자동화가 아니라 “좋아 보인다”는 감각을 실패 조건으로 바꾸는 것이다.
CI나 운영 점검 job에 붙일 때는 비밀값을 코드에 넣지 말고 조직의 secret manager와 감사 로그를 기준으로 연결한다.
도입 전 체크리스트
- 공식 문서 기준 Data Mirroring이 공개 미리보기인지, 운영 SLA와 지원 범위가 조직 요구와 맞는지 확인한다.
- 소스 테이블별 primary key, 삭제 이벤트, update 빈도, 스키마 변경 빈도를 파일럿 전에 표로 만든다.
- Warehouse credit/hour, 60초 minimum, storage 증가량, cloud services 비율, egress 정책을 비용표에 넣는다.
- 민감정보 테이블은 기본 제외로 두고, 반드시 필요한 경우 마스킹·토큰화·별도 승인을 요구한다.
- 지연 SLO, row count 바닥값, 실패 재처리 절차, 중단 조건을 운영 문서에 쓴다.
- 미러링이 멈췄을 때 분석 사용자에게 어떤 데이터 freshness 경고를 보여줄지 정한다.
- 스키마 변경 리허설과 장애 재시작 리허설을 운영 전 최소 1회씩 실행한다.
함께 보면 좋은 글
자주 묻는 질문
Postgres CDC 데이터 미러링은 Debezium을 바로 대체하나요?
목적지가 Snowflake 하나이고 소스가 Snowflake Postgres인 파일럿에서는 검토할 수 있지만, 여러 목적지로 이벤트를 배포하는 구조라면 Debezium이나 Kafka 계층이 여전히 맞을 수 있다.
Snowflake Data Mirroring은 운영 DB 부하를 없애나요?
공식 구조는 외부 커넥터 일부를 줄이지만 Postgres 내부 확장, WAL, 스냅샷, 객체 저장소 전송이 남으므로 소스 DB 영향 측정은 반드시 필요하다.
비용은 외부 CDC 서버보다 무조건 낮아지나요?
아니다.
커넥터 서버가 줄어도 Warehouse credit, storage, Live View 쿼리, 관측 비용이 남으므로 파일럿에서 실제 credit과 지연을 같이 기록해야 한다.
삭제 이벤트와 스키마 변경은 안전하게 처리되나요?
Snowflake는 트랜잭션 경계와 메타 로그 구조를 설명하지만, 조직별 스키마 변경 방식과 민감정보 정책이 다르므로 배포 리허설로 검증해야 한다.
분석 테이블 지연은 어느 정도로 잡아야 하나요?
고객지원이나 과금 상태처럼 행동이 필요한 테이블은 5~15분 SLO부터 시작하고, 일일 리포트성 테이블은 배치로 남기는 편이 낫다.
공개 미리보기 기능을 프로덕션에 써도 되나요?
운영 전환은 공식 지원 범위, SLA, 데이터 손실 책임, 롤백 절차를 확인한 뒤 결정해야 하며, 처음에는 제한된 테이블 파일럿으로만 시작하는 편이 안전하다.
출처와 확인일
- Snowflake Engineering — Postgres to Snowflake replication and mirroring (확인일: 2026-08-11)
- Snowflake Developers — Mirror Snowflake Postgres to Snowflake (확인일: 2026-08-11)
- Snowflake Docs — Postgres Data Mirroring (확인일: 2026-08-11)
- Snowflake Docs — Understanding overall cost (확인일: 2026-08-11)
- Snowflake Docs — Overview of warehouses (확인일: 2026-08-11)
- PostgreSQL Docs — Logical Decoding (확인일: 2026-08-11)
- PostgreSQL Docs — Logical replication failover slots (확인일: 2026-08-11)
- Snowflake Labs — pg_lake repository (확인일: 2026-08-11)
- AWS — Aurora zero-ETL integrations (확인일: 2026-08-11)
위 출처는 2026-08-11 기준으로 확인했으며, Snowflake Data Mirroring의 제공 상태, 지원 리전, 가격, 권한, API와 콘솔 흐름은 이후 바뀔 수 있다.
이 글은 일반적인 데이터 플랫폼 운영 검토 자료이며, 실제 복제 설계, 개인정보 이전, 보안 심사, 서비스 계약 판단은 공식 문서와 내부 책임자 검토를 기준으로 최종 확인해야 한다.









댓글
댓글 쓰기