두 번째로 큰 도메인입니다. Application Development와 합쳐 51%가 됩니다.
"기초"라는 이름 때문에 쉽게 보고 넘기기 쉬운데, 실제로는
정확한 숫자와 경계 조건을 묻는 문제가 몰려 있는 도메인입니다.
1048588인지 1048576인지, 컴팩션이 언제 무엇을 남기는지, 어떤 스키마 변경이 어느 모드에서 허용되는지 —
어림짐작으로는 점수가 나오지 않습니다.
이 도메인의 학습 목표
복제 계수 · ISR · min.insync.replicas의 관계로 "몇 대까지 죽어도 되는가"를 계산할 수 있습니다.
오프셋 4종(log-start / committed / high watermark / LEO)을 구분할 수 있습니다.
메시지 크기 관련 5개 설정의 이름과 소속을 정확히 말할 수 있습니다.
리텐션 삭제와 컴팩션의 동작 차이, tombstone의 수명을 설명할 수 있습니다.
스키마 호환성 모드별로 허용되는 변경과 배포 순서를 판단할 수 있습니다.
이 도메인이 묻는 것
Fundamentals는 2장 아키텍처,
7장 스토리지·리텐션·컴팩션,
8장 스키마와 직렬화의 범위입니다.
개발자 관점의 "이 데이터가 어떻게 저장되고 언제 사라지는가"가 핵심입니다.
브로커를 직접 운영하는 절차(파티션 재할당, 롤링 업그레이드 등)는 CCAAK 쪽 비중이 크지만,
CLI 워크플로의 순서는 CCDAK에서도 list order 유형으로 나올 수 있습니다.
핵심 개념 (1) 파티션과 복제
순서 보장의 단위는 파티션입니다
토픽은 여러 파티션으로 나뉘고, 각 파티션은 append-only 로그입니다.
오프셋은 파티션 안에서만 의미가 있고, 토픽 전역 오프셋은 존재하지 않습니다.
같은 키를 가진 레코드는 같은 파티션으로 가므로, 순서를 보장하려면 키를 지정해야 합니다.
파티션 수는 늘릴 수만 있고 줄일 수 없습니다. 그리고 늘리면
murmur2(key) % numPartitions의 분모가 바뀌므로
기존 키의 파티션 배치가 달라져 순서 보장이 깨집니다.
또한 파티션 수 증가는 그 토픽을 구독하는 컨슈머 그룹의 리밸런스를 유발합니다.
ISR과 내구성 계산
각 파티션에는 리더 하나와 팔로워가 있고, 리더를 충분히 따라잡은 레플리카의 집합을
ISR(In-Sync Replicas)이라고 합니다.
팔로워가 replica.lag.time.max.ms(브로커 기본 30000) 동안
리더를 따라잡지 못하면 ISR에서 빠집니다.
acks=all은 "모든 레플리카"가 아니라 "현재 ISR의 모든 멤버"의 응답을 기다립니다.
그래서 ISR이 1로 줄어든 상태에서는 acks=all도 사실상 acks=1이 됩니다.
이 구멍을 막는 것이 min.insync.replicas입니다.
RF=3에서 min.insync.replicas별 내구성 (모두 acks=all 전제)
min.insync.replicas
쓰기 가능한 최대 장애 브로커 수
특징
1 (기본값)
2대
가용성 최대. 리더만 살아 있으면 쓰기 성공 → 리더가 죽으면 유실 가능
2 (권장)
1대
가용성과 내구성의 균형. 프로덕션 표준 조합
3
0대
내구성 최대. 한 대만 죽어도 쓰기가 멈춤
오프셋 4종
하나의 파티션 로그 위에 동시에 존재하는 네 지점
이름
의미
누가 정하는가
log-start-offset
리텐션으로 삭제된 경계. 이보다 앞은 존재하지 않음
브로커 (리텐션)
committed offset
컨슈머 그룹이 "여기까지 처리했다"고 커밋한 위치
컨슈머 그룹
high watermark
ISR 전원이 복제를 마친 상한. 컨슈머는 이 이상 읽지 못함
리더 (ISR 최소 LEO)
LEO (log end offset)
리더가 기록한 마지막 다음 위치
리더
인터랙티브 그림으로 네 지점이 어떻게 벌어지는지 보려면
1장 오프셋 절과
2장을 보세요.
consumer lag = high watermark − committed offset이며,
LEO에서 빼는 것이 아닙니다. 이 정의는 Observability 도메인에서도 다시 나옵니다.
핵심 개념 (2) 메시지 크기 — 5개 설정이 정합해야 합니다
이 도메인에서 가장 자주 나오는 matching 문항이 "설정 ↔ 소속"입니다.
메시지 크기 관련 설정은 다섯 개이고, 각각 다른 컴포넌트에 있습니다.
하나만 올리면 다른 곳에서 막힙니다.