데이터 모델 · 물리 저장 · 조율 3층을 한 장으로
생산자 → 클러스터(브로커들) → 소비자 그룹. 그리고 그 위를 조율하는 Controller / 합의.
PRODUCERS ┌──────────────── Kafka Cluster ────────────────┐ CONSUMER GROUPS
(partitioner) │ │ (Group Coordinator가 할당)
│ Broker 1 Broker 2 Broker 3 │
key=seatId ──┐ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ ┌── group "db-writer" ──┐
├─ PRODUCE ────▶│ │ p0 LEAD │ │ p1 LEAD │ │ p2 LEAD │ │── FETCH ──▶│ c1→p0 c2→p1 c3→p2 │
key 없음 ────┘ (해시/RR) │ │ p1 foll │ │ p2 foll │ │ p0 foll │ │ └───────────────────────┘
│ └─────────┘ └─────────┘ └─────────┘ │ ┌── group "search" ────┐
│ 복제(ISR): leader 1 + follower N │── FETCH ──▶│ x1→p0,p1 y1→p2 │
│ │ └───────────────────────┘
│ [ Controller ] 파티션 leader 선출·ISR·메타 │ (다른 그룹 = 각자 다 받음)
│ ↕ 합의: ZooKeeper(옛) → KRaft(지금) │
│ __consumer_offsets 토픽 = 모든 그룹의 책갈피 │◀── commit ──(각 그룹의 offset)
└────────────────────────────────────────────────┘
같은 시스템을 세 관점으로 보면 구조가 또렷해진다.
→ 파티션은 여러 브로커에 흩어져 저장되고, 각 파티션은 leader/follower로 복제됨.
"누가 무엇을 조율하나" — 아래로 갈수록 더 근본적인 계층.
group.id 인스턴스들의 멤버십·파티션 할당(rebalance)·heartbeat 관리. 오프셋은 __consumer_offsets 토픽에 중앙 저장(인스턴스끼리 직접 공유 X). 1 파티션 = 1 인스턴스라 충돌 없음.
__consumer_offsets 토픽에 있다.
(group, partition) 단위라 인스턴스가 죽어도 진도 유지.| 질문 | 답 |
|---|---|
| 순서는 어디까지 보장? | 한 파티션 안에서만. 토픽 전체(글로벌) 순서는 없음. |
| 특정 단위 순서를 원하면? | key로 묶기 (seatId, orderId…). 같은 key→같은 파티션. |
| 전체 순서가 꼭 필요하면? | 파티션 1개 (병렬성 포기 — 트레이드오프). |
| 같은 그룹 컨슈머들은? | 파티션을 나눠 가짐 (1 파티션 = 1 컨슈머). 한 파티션을 쪼개 읽지 않음. |
| 다른 그룹은? | 같은 데이터를 각자 다 받음 (fan-out), 각자의 offset으로. |
| 컨슈머 7개, 파티션 6개면? | 6개가 1개씩, 1개는 idle. (병렬도 상한 = 파티션 수) |
| 여러 서버의 같은 그룹은? | Group Coordinator가 할당, offset은 브로커에 중앙 저장. 죽으면 rebalance로 이어받음. |
__consumer_offsets 중앙 offset 저장→ MyKafka는 "한 브로커 안의 로그 엔진"까지. 분산 시스템으로 만드는 ③의 조율 3층이 빠져 있다 (의도적, 학습 로드맵 §7).
출처: 이번 세션 Q&A 정리 + msa/kafka.md · 2026-05-26
함께 보기: kafka-lifecycle-steps.html(단계별), kafka-summary.html(CRC·차이), kafka-lifecycle.html(흐름도)