주문이 두 번 도착했고 한 번은 사라졌다 · 무엇을 남기고 무엇을 버리나 · 실습
보존과 압축 — 토픽 설정이 무엇을 남기고 무엇을 버리는가
이 실습은 VM 에서 돕니다
우분투 VM 에 Apache Kafka 4.3.1 이 KRaft 단일 노드로 떠 있습니다
(localhost:9092). 브로커의 보존 검사 주기(log.retention.check.interval.ms)를
10초, 클리너 대기(log.cleaner.backoff.ms)를 5초로 줄여 두어 1분 안에 삭제와
압축을 볼 수 있습니다. 처음 뜨는 데 4분쯤 걸립니다.
목표
시간 보존(retention.ms)이 옛 세그먼트를 지우는 것, 압축(cleanup.policy=compact)이
키마다 마지막 값만 남기는 것, max.message.bytes 가 큰 레코드를 거절하는 것을
직접 보고, 실행 중인 토픽의 설정을 바꿔 봅니다.
왜 중요한가
토픽 설정은 "무엇을 얼마나 오래 남기는가" 를 정합니다. 기본 보존은 7일이고
세그먼트 단위로 지워지기 때문에 retention.ms 가 지났다고 곧바로 사라지지
않습니다 — 활성 세그먼트는 절대 지워지지 않고, 세그먼트가 굴러가야(segment.ms)
지울 수 있습니다. 압축은 다른 종류의 보존입니다. 키가 있는 변경 로그에서 각 키의
마지막 값을 반드시 남겨 주므로, 처음부터 읽으면 현재 상태가 복원됩니다. 이
차이를 모르면 "지웠는데 남아 있다", "남긴다고 했는데 사라졌다" 는 신고를 읽을
수 없습니다.
단계
1. 토픽 events 를 retention.ms=20000, segment.ms=10000 으로 만드세요.
2. e1·e2·e3 을 넣고 12초 이상 기다린 뒤 e4 를 넣어 세그먼트를 굴리고, 30초쯤 더 기다리세요. 가장 앞 오프셋이 0 이 아니게 되면 /root/kafka/retention.txt 에 earliest=<가장 앞 오프셋>, latest=<로그 끝 오프셋> 두 줄을 쓰세요.
3. 토픽 customers 를 cleanup.policy=compact, segment.ms=10000, min.cleanable.dirty.ratio=0.01 로 만드세요.
4. 키 파싱으로 alice:v1, bob:v1, alice:v2, alice:v3 을 넣고 12초 이상 기다린 뒤 carol:v1 을 넣어 세그먼트를 굴리세요. 압축이 끝나면(30초쯤) 처음부터 키와 함께 읽어 /root/kafka/compacted.txt 에 저장하세요. alice 는 v3 한 번만 있어야 합니다.
5. 토픽 photos 를 max.message.bytes=1024 로 만들고 2,000자짜리 한 줄(/root/kafka/big2k.txt)을 넣어 보세요. 프로듀서의 stderr 를 /root/kafka/toolarge.txt 에 남기세요 — 거절되어 레코드는 0건이어야 합니다.
6. kafka-configs.sh 로 events 의 retention.ms 를 86400000 으로 바꾸세요(토픽을 다시 만들지 말고).
7. /root/kafka/topic-report.txt 에 events_retention_ms=86400000, customers_policy=compact, photos_max_bytes=1024, min_insync_default=1, three_broker_min_isr=2 다섯 줄을 쓰세요.
참고
- 토픽 설정은 만들 때
--config 키=값으로, 나중에는kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics --entity-name <토픽> --alter --add-config 키=값으로 줍니다. 확인은 같은 명령의--describe. - 오프셋 범위:
kafka-get-offsets.sh --topic events --time earliest와--time latest. 출력은토픽:파티션:오프셋. - 압축 확인:
--from-beginning --timeout-ms 8000 --formatter-property print.key=true. 압축은 순서를 바꾸지 않고 오프셋도 바꾸지 않습니다(설계 문서의 보장) —alice v3은 원래 자리(오프셋 3)에 있습니다. - 마지막 두 줄은 개념입니다. 토픽 설정 문서의
min.insync.replicas기본값은 1 이고, 문서가 드는 전형적 구성은 복제 계수 3 에 min.insync.replicas 2, acks=all 입니다. 단일 노드에서는 그 상호작용을 재현할 수 없어 퀴즈로 확인합니다. - 흔한 실수 1: 세그먼트를 굴리지 않고 기다리는 것. 활성 세그먼트는 지워지지도 압축되지도 않습니다 — 새 레코드가 들어와야
segment.ms가 검사됩니다. - 흔한 실수 2: 압축 뒤
alice가 여러 번 보인다고 실패로 여기는 것. 클리너가 아직 돌지 않은 것이니 10초 뒤 다시 읽으세요.
단계 7개
- 20초만 남기는 토픽
- 옛 세그먼트가 지워진다
- 키마다 마지막 값만 남기는 토픽
- 압축 뒤에는 alice 가 하나다
- 너무 큰 레코드는 거절된다
- 실행 중에 설정을 바꾼다
- 설정값으로 정리한다