주문이 두 번 도착했고 한 번은 사라졌다 · Kafka 가 약속하는 것 · 실습
키가 같으면 같은 파티션 — 로그를 손으로 만져 본다
이 실습은 VM 에서 돕니다
우분투 VM 에 Apache Kafka 4.3.1 이 KRaft 단일 노드로 떠 있습니다(systemdkafka 서비스, localhost:9092). /opt/kafka/bin 이 PATH 에 있어 kafka-topics.sh
같은 도구를 바로 쓸 수 있습니다. 처음 뜨는 데 4분쯤 걸립니다.
목표
토픽을 만들고 키가 있는 이벤트를 넣어, 같은 키가 같은 파티션으로 가고 파티션
안에서 순서가 지켜지는 것을 봅니다. 컨슈머 그룹의 오프셋과 지연(lag)을 읽고, 두
그룹이 서로 독립적으로 읽는 것을 확인한 뒤, 파티션 수를 늘리면 키 배치가
바뀌는 것을 직접 관찰합니다.
왜 중요한가
"주문이 두 번 도착했고 한 번은 사라졌다" 는 사고를 읽으려면 먼저 Kafka 가
무엇을 약속하고 무엇을 약속하지 않는지 알아야 합니다. Kafka 는 **파티션 안의
순서**만 약속합니다. 같은 키가 같은 파티션으로 가기 때문에 주문 하나의 이벤트
순서는 지켜지지만, 다른 주문끼리는 아닙니다. 그리고 소비된 메시지는 지워지지
않습니다 — 컨슈머 그룹마다 "어디까지 읽었나" 하는 정수 하나(오프셋)를 따로
갖기 때문에, 한 그룹이 놓친 것을 다른 그룹은 처음부터 다시 읽을 수 있습니다.
이 두 가지가 뒤 모듈의 중복·유실 이야기의 바탕입니다.
단계
1. 토픽 orders 를 파티션 3개로 만드세요.
2. /root/kafka/orders.txt 의 아홉 줄(키:값 형식)을 kafka-console-producer.sh 로 키를 파싱해서 넣으세요. 여러 파티션에 나뉘어 들어가야 합니다.
3. 파티션·오프셋·키가 보이게 처음부터 전부 읽어 /root/kafka/keyed.txt 에 저장하세요. 같은 키는 한 파티션에만 있어야 합니다.
4. 컨슈머 그룹 order-svc 로 처음부터 아홉 건을 읽고, 그 그룹을 describe 한 결과를 /root/kafka/group.txt 에 저장하세요.
5. /root/kafka/more.txt 의 세 줄을 더 넣고(읽지는 말고) order-svc 를 다시 describe 해 /root/kafka/lag.txt 에 저장하세요. LAG 이 보여야 합니다.
6. 두 번째 그룹 analytics 로 처음부터 열두 건을 읽으세요. order-svc 의 오프셋은 그대로여야 합니다.
7. orders 를 파티션 6개로 늘리고 order-1:refunded 를 넣은 뒤 처음부터 읽어 /root/kafka/repartition.txt 에 저장하세요. 그리고 /root/kafka/repartition-report.txt 에 partitions_before=3, partitions_after=6, order1_before=<3단계에서 order-1 이 있던 파티션>, order1_after=<refunded 가 들어간 파티션> 네 줄을 쓰세요.
참고
- 키 파싱:
--reader-property parse.key=true --reader-property key.separator=:(4.3 에서--property는 deprecated 입니다). - 읽을 때 메타데이터 표시:
--formatter-property print.key=true --formatter-property print.partition=true --formatter-property print.offset=true. 출력은Partition:0\tOffset:0\t키\t값꼴입니다. - 컨슈머는
--from-beginning --max-messages N --timeout-ms 8000으로 N 건을 읽으면 끝냅니다. 없으면 Ctrl-C 를 눌러야 합니다. - 그룹 상태:
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group <이름>. 컨슈머가 끝난 뒤에는 "has no active members" 가 나오지만 오프셋 표는 그대로 보입니다. - 파티션 늘리기:
kafka-topics.sh ... --alter --topic orders --partitions 6. 줄이는 것은 지원되지 않습니다(운영 문서). - 흔한 실수 1:
--max-messages없이--timeout-ms만 주면 마지막 메시지 뒤에 그 시간을 더 기다립니다. 둘 다 주세요. - 흔한 실수 2: 파티션 수를 바꾼 뒤 옛 데이터가 옮겨질 것으로 기대하는 것. Kafka 는 기존 데이터를 재배치하지 않습니다.
단계 7개
- 파티션 3개짜리 토픽
- 키가 있는 이벤트를 넣는다
- 파티션과 오프셋을 눈으로 본다
- 컨슈머 그룹의 오프셋
- 읽지 않으면 지연이 쌓인다
- 그룹은 서로 독립이다
- 파티션을 늘리면 키 배치가 바뀐다