📌 개요
개인적으로 연습삼아 MySql DB에서 Oracle DB로 마이그레이션을 진행한 적이 있습니다.
이때, 기존 MySql 로 서비스를 운영중일 때, 데이터는 계속 바뀔텐데 해당 데이터들은 어떻게 데이터를 옮기지?
라는 고민을 하게 되었는데요!
해당 고민을 만족시키는 개념이 바로 CDC 입니다.
이번 포스팅에서는 CDC 라는 개념에 대해 살펴보고자 합니다!
❓ CDC (Change Data Capture) 란?
CDC는 쉽게 말해, INSERT, UPDATE, DELETE 등 DB 데이터에 대해서 변경사항을 실시간/준실시간으로 추적하고 캡처하는 기술입니다!
❓ 왜 사용하는걸까?
CDC 의 사용이유로는 크게 3가지로 꼽을 수 있을 것 같습니다.
1. 실시간 데이터 동기화가 가능하다 : DB to DB 라고 가정했을 때, 타 시스템간의 데이터 일관성을 유지할 수 있습니다. ( 변경된 데이터도 모두 캡처하기 때문입니다. )
2. 데이터 효율적 처리가 가능하다 : 만일 CDC 를 사용하지 않고 데이터 동기화를 시켜야한다면, 전체 데이터를 기준으로 봐야하겠지만, 변경된 데이터를 기준으로 처리하기 때문에 성능 최적화가 가능합니다.
3. 운영 효율성이 개선된다 : 해당 과정이 자동화로 이루어져, 데이터 관리 비용과 시간이 절감됩니다,
👌 CDC 적용 사례
CDC 는 그럼 어떨 때 주로 사용되게 될까요?
기본적으로 기존에 존재하는 시스템 데이터를 타 시스템에 공유하고, 업데이트 할 때 주로 사용되게 됩니다.
대표적으로는 전자상거래 / 은행 / 고객 관리 시스템 에 많이 쓰일 수 있을 것 같으며, 구조 자체를 마이그레이션 하는 작업에서도 정말 많이 쓰입니다!
대표적인 기업에서 사용한 마이그레이션을 위한 CDC 내용은 다음과 같았습니다.
네이버페이 Monolithic 구조 -> MSA 구조 변경
지마켓 단일 DB 구조 -> 클러스터링 (샤딩) DB 구조 변경
결국 두 기업의 모든 공통점은 하나의 DB에서 데이터들이 대량으로 관리되었기 때문에, DB를 분리하고 동기화시키는 과정이 필요할 때 CDC를 기법을 활용하여 지속적인 데이터 동기화를 이루어냈음을 알 수 있었습니다.
🔍 CDC 동작 과정
다음으로, CDC의 동작 과정은 다음과 같습니다.
여기서 기존 사용중인 시스템을 Source System 이라 표현하고, 데이터를 동기화 시킬 시스템을 Target System이라고 표현합니다.
크게 4가지의 부분으로 나눌 수 있을 것 같습니다.
1. 데이터 변경 감지
2. 변경사항 캡처
3. 변경 데이터 전송
4. 변경 데이터 동기화
그럼 하나하나 조금 파고들며 설명을 드리겠습니다.
CDC 동작 과정 (1) : 데이터 변경 감지
먼저 DB에서 트랜잭션이 발생하면, 트랜잭션 로그에 기록하여 변경을 감지합니다.
CDC 동작 과정 (2) : 변경 사항 캡처
동작 과정중에서 핵심이 될 수 있는 부분이 될 수 있을 것 같습니다.
CDC 변경사항 캡처의 방법으로는 크게 3가지로 나눌 수 있습니다.
1. Log Based : DB의 트랜잭션 로그를 활용해서 캡처하는 방법입니다.
2. Query based : Spring Batch 와 같이 일정 주기마다 데이터 변경을 조회하는 Query를 발생시켜 변경된 데이터를 캡처하는 방법입니다.
3. Trigger based : DB에 트리거를 설정시켜 캡처하는 방법입니다.
자세한 내용은 뒤에서 추가로 다뤄보겠습니다!
CDC 동작 과정 (3) : 변경 데이터 전송
변경된 데이터에 대해서 Kafka, RabbitMQ 와 같은 메시지 브로커 시스템이나 ETL 도구를 활용해서 데이터를 전송합니다.
CDC 동작 과정 (4) : 변경 데이터 동기화
이제 메시지 브로커를 활용하여 타깃 시스템에 적재하고 해당 데이터를 동기화 하는 과정으로 동작 과정은 마무리 됩니다.
⭐ CDC 구현 방식
앞선 설명에서, 크게 3가지의 방법으로 데이터 변경을 감지하고 캡처하도록 하여, CDC 구현이 가능하다라고 말씀드렸는데, 좀 더 구체적으로 3가지의 방법을 설명드리겠습니다.
Batch-Based ( Query Based ) CDC
먼저 Query Based 기법입니다. 대표적으로 Batch 를 활용하여 구현하기 때문에 Batch-based 라고도 불리우는 것 같습니다!
일정 주기를 기준으로 쿼리를 날리도록하여, 지속적으로 변경된 데이터를 감지하고 캡처할 수 있도록 할 수 있습니다.
여기서 가장 핵심이 될 수 있는점은, 다른 기법과 다르게 실시간성이 부족할 수 있다는 점 일 것 같습니다. 예를들어 배치 주기를 10분으로 설정했다하면, 해당 10분의 공백기 동안은 실시간성이 보장될 수 없기 때문입니다.
따라서 해당 기법은 완전한 실시간성보다는 준실시간성 이라고 표현하는 것이 좀 더 적합할 것 같습니다.
Log-Based CDC
다음으로는 DB에서 만들어지는 트랜잭션 로그를 활용해서, 변경을 감지하고 캡처하는 방식입니다.
Log-Based 에서의 핵심 포인트는 로그에서 분석하여 데이터를 활용하는 것이기 때문에, 추가적인 ETL 도구가 필요하다는 점 입니다. 대표적으로는 Debezium 프레임워크를 활용해서 DB 에서 발생하는 변경사항을 지속적으로 감지하고, kafka 로 전파하는 방법을 사용할 수 있습니다.
Trigger-Based CDC
마지막으로는 Trigger-Based 를 활용한 CDC 기법입니다.
DB 내에서 트리거를 생성하여, 별도의 로그 테이블에서 저장하고 관리하는 방식입니다.
DB내에서 제공하는 트리거를 사용하다보니 정확성과 편리함을 보장받을 수 있겠지만, 결국 DB 에게 작업을 위임하는 것이기 때문에 DB의 성능 문제가 발생할 수 있습니다. 또한 별도의 테이블이 추가적으로 필요하기 때문에 메모리와 용량이 추가로 필요할 것 입니다.
위 3가지 내용을 정리하자면 다음과 같습니다.
💪 마무리
점점 쌓여가는 대량의 데이터 작업에 대해 DB의 부하를 최소화 시키는 방법을 다양하게 도입되고 있는점을 인지하였습니다. 기존 Monolothic 에서 MSA 구조를 통해 DB를 분리시키고, Cloud 환경으로 DB를 재구성 할 때 해당 CDC 기법은 불가피 할 것으로 예상됩니다!
이번 포스팅에서는 학습을 위해 개념 위주로 포스트를 하였지만, 다음에는 실습으로 적용하는 추가적인 포스팅을 할 예정입니다 :)
이상 해당 포스팅을 읽어주셔서 감사합니다. 🙇♀️
📚참고자료 및 출처
https://code-run.tistory.com/39
'[Database]' 카테고리의 다른 글
Database 트랜잭션 개념과 4가지 특징 ACID (0) | 2024.12.14 |
---|---|
[Database] Index란? (0) | 2024.11.23 |
Database - NoSQL 에 대해서 알아보자! (2) | 2024.09.16 |