Filebeat 멀티라인 적용 후 Kafka Connect ES Sink 장애 해결기 (DLQ + 오프셋 스킵)
2026. 2. 17. 09:44ㆍk8s/Kafka
요약
Minecraft 로그 수집 파이프라인(Filebeat → Kafka → Kafka Connect → Elasticsearch)에서 멀티라인 적용 이후 ES 인덱싱 에러가 발생했다.
DLQ를 활성화해 문제 레코드를 확인했고, 오프셋 스킵과 멀티라인 규칙 분리로 해결했다.
환경
- Filebeat (Kubernetes DaemonSet)
- Kafka / Kafka Connect
- Elasticsearch (Data Stream)
- 로그 소스:
minecraft,list-logger
1. 멀티라인 적용
Minecraft 서버 로그에 스택트레이스가 있어 멀티라인 처리를 적용했다.
# filebeat.yml (초기 적용)
parsers:
- container: ~
- multiline:
type: pattern
pattern: '^(\\s+at\\s|\\s*Caused by:|\\s*\\.{3}\\s\\d+\\s+more)'
negate: false
match: after
2. 문제 발생
멀티라인 적용 이후, ES에 데이터가 안 들어오고 Kafka Connect task가 FAILED 됨.
원인 로그 요약:
mc.ok필드는 boolean인데, 멀티라인으로 합쳐진 문자열이 들어가 document_parsing_exception 발생.- 특히
list-logger의[MC_LIST]라인이 멀티라인으로 합쳐짐.
3. DLQ 활성화
Kafka Connect에 DLQ 설정을 추가해서 문제 레코드를 확인했다.
"errors.deadletterqueue.topic.name": "minecraft-logs-dlq",
"errors.deadletterqueue.context.headers.enable": "true",
"errors.deadletterqueue.topic.replication.factor": "1"
DLQ에서 확인된 문제 레코드:
__connect.errors.offset: 375999mc.ok에false rc=1 error=...같은 문자열이 들어가 있음
4. 멀티라인 규칙 분리 (핵심 해결)list-logger는 멀티라인이 필요 없으므로 컨테이너별로 입력을 분리했다.
filebeat.inputs:
- type: filestream
id: mc-minecraft
paths:
- /var/log/containers/*_minecraft_minecraft-*.log
parsers:
- container: ~
- multiline:
type: pattern
pattern: '^(\\s+at\\s|\\s*Caused by:|\\s*\\.{3}\\s\\d+\\s+more)'
negate: false
match: after
- type: filestream
id: mc-list-logger
paths:
- /var/log/containers/*_minecraft_list-logger-*.log
parsers:
- container: ~
적용 명령:
kubectl apply -f y:\mc\filebeat.yaml
kubectl -n kube-system rollout restart ds/filebeat-minecraft-dell
5. 오프셋 스킵으로 문제 레코드 건너뛰기
Kafka는 레코드 단건 삭제가 불가하므로, 문제 오프셋을 건너뛰도록 그룹 오프셋을 변경했다.
오프셋 확인:
kafka-consumer-groups --bootstrap-server kafka-kraft.kafka.svc.cluster.local:9092 \
--describe --group connect-minecraft-es-sink | grep minecraft-logs
오프셋 스킵:
kafka-consumer-groups --bootstrap-server kafka-kraft.kafka.svc.cluster.local:9092 \
--group connect-minecraft-es-sink \
--topic minecraft-logs:0 \
--reset-offsets --to-offset 376000 --execute
커넥터 재시작:
curl -s -X POST http://localhost:8083/connectors/minecraft-es-sink/restart
6. 상태 확인
커넥터 상태:
curl -s http://localhost:8083/connectors/minecraft-es-sink/status
오프셋 정상 소비 확인:
kafka-consumer-groups --bootstrap-server kafka-kraft.kafka.svc.cluster.local:9092 \
--describe --group connect-minecraft-es-sink | grep minecraft-logs
결론
- 멀티라인 적용 시 컨테이너별로 구분하는 것이 중요하다.
- DLQ를 통해 문제 레코드를 빠르게 확인 가능하다.
- Kafka는 단건 삭제가 안 되므로 오프셋 스킵이 현실적인 해결책이다.
'k8s > Kafka' 카테고리의 다른 글
| Avro Schema Registry 호환성 이슈 정리 (0) | 2026.02.23 |
|---|---|
| Kafka Connect로 Minecraft 로그를 Elasticsearch에 적재하고 운영하는 방법 (커넥터 수정/확인 포함) (0) | 2026.02.14 |
| Kafka Connect → Elasticsearch Sink 설정 (0) | 2026.02.10 |
| elasticsearch의 index 생성 주기 설정 (4) | 2025.08.16 |
| Kafka에서 지난 데이터 전송하기 (0) | 2025.08.16 |