
데이터 파이프라인은 여러 소스에서 생성된 원시 데이터를 수집, 처리, 변환하여 최종 목적지로 옮기는 일련의 과정을 의미한다. 데이터 파이프라인의 각 단계는 이전 단계의 출력을 입력으로 받아 작업을 수행하며, 이를 통해 데이터는 정제되고 분석에 용이한 형태로 가공된다. 데이터 파이프라인의 최종 목적지는 주로 데이터 웨어하우스나 데이터 레이크와 같은 데이터 저장소가 된다.
오늘날 많은 기업은 마이크로서비스 아키텍처(MSA)를 채택하고 있으며, 각 서비스는 독립적인 데이터베이스를 운영하는 경우가 많다. 이러한 분산 환경에서는 여러 데이터 소스에 흩어져 있는 데이터를 통합하고 일관성을 유지하는 것이 매우 중요하다. 데이터 파이프라인은 서로 다른 시스템에 분산된 데이터를 통합하고, 분석을 위해 한곳으로 모으는 핵심적인 역할을 수행한다. 이를 통해 데이터 사일로(Data Silo) 현상을 해결하고, 전사적인 차원에서 데이터의 정확성과 신뢰도를 높일 수 있다.
ETL은 Extract(추출), Transform(변환), Load(적재)의 약자로, 데이터 파이프라인을 구현하는 전통적인 방식 중 하나이다. 말 그대로 다양한 데이터 소스로부터 데이터를 추출하고, 필요한 형태로 변환한 후, 최종 목적지인 데이터 웨어하우스 등에 적재하는 과정을 의미한다.
ETL은 주로 배치(Batch) 방식으로 동작한다. 이는 정해진 주기마다 대량의 데이터를 한 번에 처리하는 방식이다. 예를 들어, 하루에 한 번 자정마다 전날의 모든 거래 데이터를 모아 분석 시스템으로 옮기는 작업을 수행할 수 있다.
ETL의 배치 처리 방식은 몇 가지 한계를 가진다.
실시간성 부족
정해진 주기에 따라, 데이터가 동기화되므로 실시간 데이터 분석이나 즉각적인 대응이 어렵다.운영 DB 성능 영향
대량의 데이터를 한 번에 추출하는 과정에서 운영 데이터베이스에 상당한 부하를 줄 수 있다.
이는 실제 서비스의 성능 저하로 이어질 수 있다.비효율적인 자원 사용
변경되지 않은 데이터까지 포함하여 전체 데이터를 주기적으로 스캔하고 전송하므로 불필요한 자원 낭비가 발생할 수 있다.
CDC(Change Data Capture)는 데이터베이스에서 발생하는 변경 사항(INSERT, UPDATE, DELETE)을 실시간으로 감지하고 추적하는 기술이다. ETL처럼 전체 데이터를 주기적으로 옮기는 대신, 변경된 데이터만을 식별하여 다른 시스템으로 전송한다. 이를 통해 ETL의 실시간성 부족과 운영 DB 부하 문제를 효과적으로 해결할 수 있다.
CDC를 구현하는 방식은 크게 세 가지로 나눌 수 있다.
데이터베이스의 트랜잭션 로그(Transaction Log)를 분석하여 데이터 변경 사항을 감지한다. 데이터베이스에 대한 부하가 거의 없고, 데이터 변경을 순서대로 정확하게 포착할 수 있다는 장점이 있다.
데이터베이스 테이블에 트리거(Trigger)를 설정하여 데이터 변경이 발생할 때마다 해당 내용을 별도의 테이블에 기록하고, 이를 통해 변경 사항을 추적한다. 구현이 비교적 간단하지만, 운영 데이터베이스에 직접적인 부하를 줄 수 있다.
테이블의 특정 컬럼(e.g. 최종 수정일시)을 주기적으로 쿼리하여 변경된 데이터를 식별하는 방식이다. 구현은 간단하지만, 삭제된 데이터를 감지하기 어렵고 실시간성이 떨어진다는 단점이 있다.
이 중, 다음과 같은 이유로 로그 기반 CDC가 가장 널리 사용된다.
운영 DB 성능 영향 최소화
데이터베이스의 트랜잭션 로그 파일을 직접 읽기 때문에 운영 중인 데이터베이스의 성능에 미치는 영향이 매우 적다.데이터 정합성 보장
트랜잭션 로그에는 데이터에 대한 모든 변경 이력이 순서대로 기록되므로, 데이터의 정합성을 완벽하게 보장할 수 있다.모든 변경 사항 캡처
INSERT, UPDATE뿐만 아니라 DELETE 작업까지 모두 감지할 수 있다.
로그 기반 CDC의 일반적인 동작 흐름은 다음과 같다.
CDC 파이프라인이 처음 연결되면, 먼저 원본 데이터베이스의 현재 상태에 대한 전체 스냅샷을 생성하여 대상 시스템으로 적재한다. 이를 통해 초기 데이터 동기화를 맞춘다.
초기 적재 이후에는 데이터베이스의 트랜잭션 로그(e.g. PostgreSQL의 WAL, MySQL의 Binlog)를 지속적으로 감시한다. 데이터에 변경(INSERT, UPDATE, DELETE)이 발생하면, 해당 로그를 읽어 변경된 내용을 이벤트 형태로 캡처한다.
캡처된 변경 이벤트는 메시징 큐(e.g. Kafka)와 같은 시스템을 통해 대상 시스템으로 실시간 전송된다.
대상 시스템은 이벤트를 순서대로 받아 자신의 데이터 저장소에 적용함으로써 원본 데이터베이스와의 동기화를 유지한다.
CDC는 다양한 시나리오에서 효과적으로 활용될 수 있다.
대규모 스케일 아웃 (Scale-Out)
여러 데이터베이스에 데이터를 분산하여 저장하고, CDC를 통해 데이터 변경 사항을 동기화함으로써 시스템 전체의 처리량을 높일 수 있다.이기종 DBMS 간 복제
Oracle에서 MySQL로, 또는 관계형 데이터베이스에서 NoSQL 데이터베이스로 데이터를 실시간 복제하는 데 사용될 수 있다.DR(재해 복구) 시스템 구축
운영 데이터베이스의 변경 사항을 실시간으로 재해 복구 센터의 데이터베이스에 복제하여 장애 발생 시 데이터 손실을 최소화하고 신속하게 서비스를 복구할 수 있다.무중단 마이그레이션
서비스를 중단하지 않고 기존 데이터베이스를 새로운 데이터베이스로 이전할 때, CDC를 사용하여 마이그레이션 중 발생하는 데이터 변경 사항을 신규 데이터베이스에 실시간으로 반영할 수 있다.부하 분산 시스템 구축
읽기 전용 복제본을 여러 개 만들고 CDC를 통해 원본 데이터베이스와 동기화하여 읽기 작업의 부하를 분산시킬 수 있다.
Apache Kafka와 Debezium은 로그 기반 CDC를 구현하는 데 가장 널리 사용되는 조합이다.
Debezium이 데이터베이스의 변경 사항을 캡처하여 Kafka Topic으로 보내면, 다양한 애플리케이션에서 이 데이터를 구독하여 활용할 수 있다.

카프카 커넥트(Kafka Connect)는 카프카와 다른 시스템(e.g. 데이터베이스, 파일 시스템) 간의 데이터 파이프라인을 쉽고 안정적으로 구축할 수 있도록 도와주는 프레임워크이다. 소스 커넥터(Source Connector)와 싱크 커넥터(Sink Connector)로 구성되며, 소스 커넥터는 외부 시스템에서 데이터를 가져와 카프카로 보내고, 싱크 커넥터는 카프카의 데이터를 외부 시스템으로 내보내는 역할을 한다.
Debezium은 변경 데이터 캡처(CDC)를 위한 오픈소스 분산 플랫폼이다.
카프카 커넥트의 소스 커넥터로 동작하며, 다양한 데이터베이스의 트랜잭션 로그를 실시간으로 감지하여 변경 이벤트를 생성하고 이를 카프카 토픽으로 전송하는 역할을 한다.
Debezium은 Kafka Connect의 SMT 기능을 활용하여 Kafka로 메시지를 보내기 전에 이벤트를 변환, 필터링, 라우팅하는 등 다양한 가공을 할 수 있다.
SMT를 활용해 특정 조건에 따라 토픽 이름을 동적으로 변경하거나 불필요한 데이터를 제거하는 등 복잡한 요구사항을 처리하거나, 이벤트에 추가적인 메타데이터를 삽입하는 작업을 수행할 수 있다.
이는 별도의 데이터 처리 애플리케이션 없이도 파이프라인 내에서 간단한 데이터 가공을 처리할 수 있게 하는 강력한 기능이다.
실제 기업들이 Debezium기반의 CDC를 도입하며 고려했던 부분들을 조사해보았다.
하나의 트랜잭션에 매우 많은 데이터 변경이 포함될 경우, Debezium이 이를 단일 Kafka 메시지로 처리하려다 실패할 수 있다.
이를 해결하기 위해 Debezium의 max.queue.size와 max.batch.size 같은 옵션을 조정하여 대규모 트랜잭션을 안정적으로 처리할 수 있도록 개선할 수 있다.
운영 중인 테이블의 스키마가 변경될 때 CDC 파이프라인이 중단될 수 있다.
Debezium은 스키마 변경 이력을 추적하는 기능을 제공하지만, 잦은 DDL 변경은 파이프라인 운영에 부담이 될 수 있다.
이를 관리하기 위해 별도의 검증 프로세스를 도입하여 스키마 변경에 대응할 수 있다.
CDC 파이프라인은 데이터 동기화의 핵심이므로 안정적인 운영이 매우 중요하다.
Debezium 커넥터의 상태, Kafka Consumer Lag, 데이터 처리량 등 핵심 지표를 모니터링하는 시스템을 구축하여 장애 발생 시 신속하게 대응할 수 있도록 해야 한다.
특히 Debezium이 제공하는 JMX 메트릭을 활용하면 파이프라인의 내부 동작을 상세하게 모니터링할 수 있다.
JMX (Java Management Extensions)
실행 중인 자바 애플리케이션을 모니터링하고 관리하기 위한 기술로, MBean(Managed Bean)이라는 특별한 자바 객체를 사용한다.
개발자는 애플리케이션에서 모니터링하거나 제어하고 싶은 정보(e.g. 현재 접속자 수, 평균 응답 시간)를 MBean에 담아, JMX에 등록하여 사용한다.
Debezium은QueueRemainingCapacity,MaxQueueSizeInBytes,MilliSecondsSinceLastEvent등의 메트릭을 제공한다.
Debezium 커넥터가 중단되었다가 재시작될 때, 마지막으로 처리했던 지점(Offset)부터 다시 작업을 이어가므로 데이터 유실 없이 처리가 가능하다. 이러한 Debezium의 특성을 활용하여 안정적인 데이터 파이프라인을 구축할 수 있다.
하지만 이 과정에서 Kafka Topic의 설정(retention 등)이 올바르지 않으면 데이터가 유실될 수 있으므로 주의해야 한다.
kakaopay - Oracle에서 MongoDB로의 CDC Pipeline 구축
올리브영 - 상품데이터 Pipeline을 위한 Debezium MSK Connect
LG U+ - Debezium으로 DB 동기화 구축하기
토스 증권 - 대규모 CDC Pipeline 운영을 위한 Debezium 개선 여정