Project #02
문서 전처리 서비스 마이그레이션
Spring BatchKafka ConnectRxJavaMariaDBMongoDBGridFS
개요
이전 아키텍처 변경 이후, 레거시 데이터베이스에 저장되어 있는 2억건 이상의 데이터를 완전히 걷어내지 못하고 있었습니다. MongoDB를 먼저 조회하고, 없는 경우 MariaDB를 조회하도록 Fallback 처리가 되어있어 기존/신규 시스템 병행으로 운영 복잡도가 증가했습니다. 프로세스를 단일화하기 위해 MariaDB의 2억건 이상의 문장 데이터를 MongoDB로 이관해야 했습니다.
시스템 구조 변화
Before — 이중 구조
클라이언트
1. 조회2. 없으면3. 재조회
레거시 (MariaDB 2억건+)
신규 (MongoDB)
After — 단일 구조
클라이언트
MongoDB (통합)
문제 상황 및 해결 과정
1. 마이그레이션 대상 테이블 적재 문제
- 2억 건 이상의 데이터를 한 번에 조회 시 레거시 DB 부하 우려
- 운영 서비스 성능 저하 가능성, 신규 유입 데이터 누락 위험
해결: Kafka Connect CDC 도입
- binlog 기반으로 운영 DB 부하 없이 실시간 변경 감지
- Incremental Snapshot으로 대용량 테이블도 청크 단위 처리
- offset 자동 관리로 적재 위치 별도 기록 불필요
2. 과도한 I/O Blocking 부하
- Processor에서 API를 통해 문장 데이터를 단건씩 조회하여 2억건 처리 시 과도한 네트워크 I/O
- 동기 호출로 스레드 블로킹, 처리 속도 저하
해결: Processor 제거 후 Writer에서 RxJava 병렬 조회
- JavaRx Scheduler.io로 멀티쓰레드 병렬 조회, 처리량 대폭 향상
- 단건 조회 유지로 응답 크기 예측 가능, 네트워크 안정성 확보
3. MongoDB 16MB 제한
- Bulk Insert 시 BsonMaximumSizeExceededException 예외 발생
해결: Spring Batch ItemWriter Skip 전략 + GridFS
- Skip 발생 시 Chunk Size가 1이 되는 특성을 활용하여 16MB 초과 문서를 GridFS로 저장
- 별도의 후처리 작업 없이 Skip 전략으로 문제 문서 특정 가능
마이그레이션 파이프라인
데이터 수집
MariaDB 2억건+
binlog
Kafka Connect CDC
증분 적재
Kafka Topic
Spring Batch 처리
Reader (Kafka 소비)
Writer (RxJava 병렬 조회 + Bulk Insert)
성공
MongoDB
16MB 초과 Skip
GridFS
Impact
2억건+ 무중단 마이그레이션
운영 서비스 영향 zero
인프라 비용 절감
레거시 시스템 완전 제거 (MariaDB 인스턴스, 레거시 API 서버 등)
운영 복잡도 감소
관리 포인트가 2개 시스템에서 1개로
안정적 이관
기존 레거시를 사용하던 서비스들의 안정적인 신규 시스템 이관 가능