티스토리 뷰
728x90
요약 — 토픽·파티션은 카프카 확장성의 핵심
카프카에서 토픽은 이벤트 스트림의 “카테고리”, 파티션은 해당 토픽을 여러 샤드로 잘라 브로커 전체에 분산-저장하는 단위입니다. 파티션이 많아질수록 병렬 처리량·스루풋·내구성이 상승하지만, 리밸런싱·메타데이터·메모리 오버헤드도 함께 증가하므로 적정 개수를 잡는 전략이 필요합니다. 업계에서는 “브로커 × 복제계수 × 100” 이하, 혹은 한 브로커당 1 ~ 4 천 파티션을 실무 상한선으로 권장합니다.
1. 토픽과 파티션의 기본 개념
1.1 토픽(Topic)
- 프로듀서가 메시지를 발행(Publish) 하고 컨슈머가 구독(Subscribe) 하는 논리적 채널.
- 메시지는 토픽 내부에서 파티션 단위로만 저장·전송됩니다.
1.2 파티션(Partition)
- 순차 로그 파일(commit-log)이며, 각 파티션 안에서는 메시지 순서가 보장됩니다.
- 동일 토픽의 파티션들은 여러 브로커에 복제되어 장애-내성을 확보합니다.
1.3 왜 중요한가?
- 수평 확장(Throughput) – 파티션이 많을수록 프로듀서·컨슈머가 병렬로 작업할 수 있어 초당 처리량이 선형 증가합니다.
- 순서 보장 범위 – 파티션 내부는 절대 순서가 유지되지만 파티션 간에는 그렇지 않습니다. 키별 순서가 필요하다면 같은 키를 동일 파티션으로 보내야 합니다.
- 대용량 저장 – 여러 머신에 걸쳐 토픽 용량을 확장해 한 노드 디스크 한계를 넘길 수 있습니다.
2. 파티션 수 결정 전략
고려 항목 가이드라인 근거·사례
트래픽(TPS) | “초당 레코드 수 ÷ 1,000 ≈ 파티션” 을 시작점으로, 모니터링 후 조정 |
브로커 자원 | 브로커 당 100 × B × R 이하(B=브로커 수, R=복제계수) |
AWS MSK | m5.large 기준 리더+팔로워 합 1,000/브로커 권장 |
지연 · 메타데이터 | 1만 + 파티션 클러스터는 컨트롤러 페일오버 시 수 십 초 지연 발생 |
리밸런스 비용 | 신규 파티션 추가 시 컨슈머 그룹 리밸런스·캐시 invalidation 발생 → 단계적 증설 |
메모리 | 프로듀서·컨슈머는 파티션별 버퍼를 잡으므로 batch.size × 파티션수 만큼 JVM 힙 필요 |
Tip : 과소보다 과대가 문제입니다. 파티션은 증설은 가능하지만 감소는 불가하므로(deleteRecords 불가), 처음에는 적당히 작게 시작 후 모니터링-증설이 안전합니다.
3. 데이터 분산과 병렬 처리 메커니즘
3.1 프로듀서-사이드 파티셔닝
- 기본 파티셔너는 (key.hashCode() % partitionCount) 규칙으로 키 기반 라우팅을 수행해 동일 키 순서를 보존합니다.
- 키가 null이면 라운드로빈 또는 스티키 파티셔너가 균등 분산을 시도합니다.
3.2 컨슈머 그룹 병렬성
- 파티션 ≤ 컨슈머 수: 일부 컨슈머는 놀 수 있음
- 파티션 ≥ 컨슈머 수: 각 컨슈머가 1 이상 파티션을 전담 → 최대 병렬 처리량 실현
- 컨슈머 증설·감소·파티션 증설 이벤트마다 리밸런스가 발생하여 파티션이 재배치됩니다.
3.3 부하-편향(스큐) 방지
- “솟아오르는 키” 트래픽이 특정 파티션에 몰리면 리더 CPU · 디스크가 포화 → 라운드로빈·스티키 파티셔너나 커스텀 파티셔너로 완화합니다.
4. 실무 설계 체크리스트
- 예상 TPS, 메시지 크기, 보존기간 → 필요한 디스크·네트워크 산출 후 파티션 수 역산.
- 컨슈머 그룹 병렬도 = 파티션 수 상한. 예) 20 개 서비스 인스턴스로 읽으면 최소 20 개 파티션 필요.
- 브로커당 파티션 한도 검토 (instanceTypeㆍ메모리 사양 기준).
- 장기적으로 KRaft + Tiered Storage 를 사용한다면 메타데이터 스케일링이 개선돼 파티션 수 한도가 완화됩니다.
- 증설 시 kafka-reassign-partitions.sh 로 점진 배포, 한 번에 20 파티션 이하 이동 권장.
5. 결론
토픽과 파티션 설계는 카프카 클러스터 성능·신뢰성·운영 난이도를 좌우합니다. “파티션은 많을수록 좋다” 는 단순 공식 대신, 업무 TPS·컨슈머 병렬도·브로커 스펙을 기준으로 점진 증설 전략을 택하세요. 키 기반 파티셔닝과 컨슈머 그룹 구성을 적절히 조합하면 선형 확장과 순서 보장을 모두 달성할 수 있습니다.
다음 단계 — 프로듀서의 Idempotence·압축·배치, 컨슈머의 Co-operative Sticky 리밸런스 등을 최적화해 파티션 활용도를 극대화해 보세요. 즐거운 스트리밍 여정이 되시길 바랍니다!
728x90
'개발 인프라 > 카프카' 카테고리의 다른 글
카프카 메시지 직렬화, 무엇을 선택해야 할까 (0) | 2025.05.23 |
---|---|
주키퍼(ZooKeeper)는 이제 안녕? KRaft 모드 알아보기 (0) | 2025.05.22 |
카프카 컨슈머(Consumer)와 컨슈머 그룹 파헤치기 (1) | 2025.05.16 |
카프카 프로듀서(Producer) 란? (2) | 2025.05.16 |
로컬 카프카 설치부터 메시지 전송/수신 (1) | 2025.05.16 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- vite
- Stack Area
- RESTfull
- 도커
- 코틀린
- ai통합
- model context protocol
- react.js
- First-class citizen
- 카프카 개념
- 스브링부트
- 언리얼엔진5
- Java
- 코프링
- Heap Area
- JVM
- 자바
- 스프링부트
- springai
- 디자인패턴
- 타입 안전성
- unreal engjin
- 언리얼엔진
- cqrs
- redis
- 일급 객체
- generated_body()
- JAVA 프로그래밍
- MCP
- method Area
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
글 보관함