
Apache Kafka는 현대적인 데이터 스트리밍 플랫폼의 핵심으로, 대규모 실시간 데이터를 효율적으로 처리할 수 있습니다. 이 글에서는 Kafka의 토픽 설정과 파티션 전략에 대한 모범 사례를 살펴보겠습니다.
Kafka는 토픽(Topic), 파티션(Partition), 프로듀서(Producer), 컨슈머(Consumer)로 구성된 분산 메시징 시스템입니다. 효율적인 데이터 처리를 위해서는 이러한 구성 요소들을 올바르게 설정하는 것이 중요합니다.
토픽은 Kafka에서 메시지를 분류하는 논리적인 단위입니다. 데이터베이스의 테이블과 유사하게, 특정 유형의 데이터를 저장하고 관리하는 공간으로 생각할 수 있습니다.
파티션은 Kafka의 확장성과 병렬 처리의 핵심입니다. 각 파티션은 독립적으로 작동하며, 메시지를 순서대로 저장합니다.
파티션 수는 Kafka 클러스터의 성능에 직접적인 영향을 미칩니다. 적절한 파티션 수를 선택하는 것이 중요합니다.
파티션 수 = max(예상 프로듀서 처리량 / 파티션당 프로듀서 처리량,
예상 컨슈머 처리량 / 파티션당 컨슈머 처리량)
파티션 키는 메시지가 어떤 파티션에 저장될지 결정하는 중요한 요소입니다.
// 예시: 사용자 ID를 키로 사용
producer.send(new ProducerRecord<>("user-events", userId, eventData));
Medium Article on Kafka Partitioning
public class CustomPartitioner implements Partitioner {
@Override
public int partition(String topic, Object key, byte[] keyBytes,
Object value, byte[] valueBytes, Cluster cluster) {
// 커스텀 로직 구현
return customPartitionLogic(key);
}
}
복제는 Kafka의 내결함성(Fault Tolerance)을 보장하는 핵심 메커니즘입니다.
# 시간 기반 보존 (7일)
retention.ms=604800000
# 크기 기반 보존 (1GB)
retention.bytes=1073741824
# 압축 정책
cleanup.policy=delete # 또는 compact
# 배치 크기 증가로 처리량 향상
batch.size=32768
# 압축 활성화로 네트워크 대역폭 절약
compression.type=snappy # 또는 lz4, zstd
# 버퍼 메모리 설정
buffer.memory=67108864
# acks 설정 (내구성 vs 성능)
acks=all # 가장 안전, acks=1 (빠름), acks=0 (가장 빠름)
일관된 토픽 명명 규칙을 사용하면 관리가 쉬워집니다:
<환경>.<서비스>.<데이터타입>.<버전>
예시:
- prod.user-service.events.v1
- dev.payment-service.transactions.v2
- staging.analytics.metrics.v1
# 파티션 추가 (기존 토픽)
kafka-topics.sh --alter --topic my-topic \
--partitions 6 \
--bootstrap-server localhost:9092
# 파티션 재할당으로 브로커 간 균형 유지
kafka-reassign-partitions.sh --generate \
--topics-to-move-json-file topics.json \
--broker-list "0,1,2,3,4,5"
# 처리량 모니터링
- MessagesInPerSec
- BytesInPerSec
- BytesOutPerSec
# 지연 모니터링
- ConsumerLag
- RequestLatencyMs
# 파티션 상태
- UnderReplicatedPartitions
- OfflinePartitionsCount
Apache Kafka의 토픽 설정과 파티션 전략은 시스템 성능과 확장성에 결정적인 영향을 미칩니다. 다음 핵심 원칙을 기억하세요:
Kafka를 효과적으로 활용하면 대규모 실시간 데이터 처리 시스템을 안정적으로 운영할 수 있습니다. 이 가이드가 여러분의 Kafka 여정에 도움이 되기를 바랍니다! 🚀
참고 자료: