[실무 설계와 판단]

Kafka 기반 데이터 이관 트러블 슈팅 정리

everydeveloper 2025. 12. 26. 11:24

— 실환경에서 실제로 해결한 사례만 기록

서론

Kafka 기반 데이터 이관 및 CDC(Change Data Capture) 환경을 운영하면서
문제는 반드시 발생한다.

중요한 점은
“이론적으로 가능한 해결책”이 아니라,
“실제 운영 환경에서 검증된 해결 방법”
이다.

이 글에 정리한 내용은 다음 기준을 따른다.

  • 실제 운영 환경에서 직접 겪은 문제
  • 재현 가능했고, 적용 후 정상 동작을 확인한 해결 방법
  • 추측이나 미검증 방법은 배제

본 글은 문제 발생 시 빠르게 원인을 파악하고, 재발 방지를 돕기 위한 실무 기록이다.


목적

  • Kafka 기반 데이터 이관 과정에서 발생한 주요 트러블 정리
  • 문제 원인을 구조적으로 분석
  • 재현 가능하고 검증된 해결 방법 문서화
  • 향후 유사 장애 발생 시 빠른 대응을 위한 레퍼런스 확보

1. Kafka 로그 프로세스 충돌 문제

🔍 현상

Kafka 기동 시 다음과 같은 오류 발생

 
D:\kafka\logs\__consumer_offsets-17\00000000000000000000.timeindex.cleaned -> D:\kafka\logs\__consumer_offsets-17\00000000000000000000.timeindex.swap: 다른 프로세스가 파일을 사용 중이기 때문에 프로세스가 액세스 할 수 없습니다

Kafka가 로그를 읽기 전에,
로그 파일이 삭제되거나 교체되면서 충돌 발생


🧠 원인 분석

  • Kafka 서버 기동 시 Log Manager가 무조건 로그 정리(Log Cleanup)를 수행
  • Kafka는 log segment 파일을 읽고 있는 상태
  • 동시에 Log Manager가 해당 파일을 삭제 또는 swap 시도
  • Windows 환경에서 파일 락(lock) 충돌 발생

즉,

Kafka 프로세스와 로그 정리 프로세스가 독립적으로 동작하며
파일 삭제 타이밍을 제어할 수 없음


✅ 해결 방법

  1. Kafka 완전 종료
  2. Kafka logs 디렉토리 하위 경로에서 충돌 파일 수동 삭제

삭제 대상 확장자 예시:

 
*.delete *.swap
  1. Kafka 재기동
  2. 동일 오류 발생 시 → 다시 충돌 파일 확인 후 삭제
  3. 재기동 반복
  4. 정상 기동 확인

결과
재기동 이후 로그 충돌 없이 정상 동작 확인


2. Kafka 데이터 정합성 문제 (Primary Key 충돌)

🔍 현상

Kafka Sink Connector를 통한 데이터 적재 중 PK 충돌 오류 발생

 
java.sql.BatchUpdateException: ORA-00001: 무결성 제약 조건(C##KYJ.PK_TB_PLC11)에 위배됩니다

🧠 원인 분석

  • Kafka 내부에 중복 데이터 존재
  • 이미 DB에 INSERT 된 데이터를 다시 INSERT 시도
  • Sink Connector가 단순 insert 방식일 경우 PK 충돌 발생

즉,

Kafka 재기동 또는 재처리 과정에서
동일 레코드가 중복 적재됨


✅ 해결 방법

현재 운영 환경 기준으로 아래 설정 적용

1️⃣ insert.mode 설정

 
"insert.mode": "upsert"
  • insert + update 방식
  • PK 존재 시 update
  • PK 없을 경우 insert

적용 대상:

  • Source Connector
  • Sink Connector

2️⃣ transactional.id 설정

 
"transactional.id": "my-transactional-id"
  • Kafka offset을 트랜잭션 단위로 관리
  • 중복 처리 방지

적용 대상:

  • Source Connector

3️⃣ Connector 재기동

  • Standalone 모드 기준
  • Source / Sink Connector 재기동 후
  • PK 충돌 에러 재발 여부 확인

결과
PK 충돌 없이 데이터 정합성 유지 확인


3. PostgreSQL WAL 로그 용량 폭증으로 인한 CDC 중단

🔍 현상

  • Kafka 정상 기동
  • Source / Sink Connector 상태도 정상
  • 그러나 CDC 데이터가 흐르지 않음

확인 결과:

  • WAL 로그 용량 비정상적으로 증가
    (예: 281GB)

🔎 상태 확인

Connector 상태 확인

 
http://localhost:8083/connectors/oracle-sink-connector/status http://localhost:8083/connectors/postgres/status

WAL 적재량 확인 쿼리

 
SELECT slot_name, database, active, pg_size_pretty( pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) ) AS retained_wal_size FROM pg_replication_slots;

🧠 원인 분석

  • Debezium 기반 CDC 구조
  • 논리 복제 슬롯(Logical Replication Slot)이 유지됨
  • Kafka가 CDC를 따라가지 못하면서
  • WAL 로그가 지속적으로 쌓임
  • 결과적으로 CDC 파이프라인 정지 상태

✅ 해결 방법

1️⃣ 논리 복제 슬롯 확인

 
SELECT * FROM pg_replication_slots;

2️⃣ Kafka 종료

⚠️ 반드시 Kafka 및 Connector 종료 후 진행

3️⃣ 논리 복제 슬롯 삭제

 
SELECT pg_drop_replication_slot('debezium_slot');

⚠️ 주의

  • 슬롯 삭제 시 CDC 처음부터 다시 적재
  • 운영 데이터 영향 반드시 사전 검토 필요

4️⃣ 슬롯 재생성 확인

 
SELECT * FROM pg_replication_slots;

5️⃣ Kafka 재기동

결과
CDC 정상 재개 확인
WAL 로그 증가 정상 범위 유지