Apache Kafka 기본 지식 - 완벽 가이드
📚 Kafka란 무엇인가?
Apache Kafka는 분산형 스트리밍 플랫폼으로, 대용량의 실시간 데이터를 안정적으로 처리하기 위해 개발된 오픈소스 시스템입니다. LinkedIn에서 2011년에 처음 개발되어 현재는 Netflix, Uber, Airbnb 등 많은 글로벌 기업에서 활용하고 있습니다.
간단히 말하면, Kafka는 메시지를 보내는 곳(Producer)과 받는 곳(Consumer) 사이의 우체국 역할을 한다고 생각하면 됩니다.
🎯 Kafka를 사용하는 이유
전통적인 방식의 문제점
여러 시스템이 서로 데이터를 주고받을 때, 각각을 직접 연결하면 복잡한 구조가 만들어집니다. 시스템이 늘어날수록 연결점은 기하급수적으로 증가하죠.
Kafka가 해결하는 것들
- 확장성: 대용량 데이터를 처리할 수 있음
- 내결함성: 서버 장애 시에도 데이터 손실 없이 동작
- 고성능: 초당 수백만 건의 메시지 처리 가능
- 실시간 처리: 데이터를 실시간으로 스트리밍
🏗️ Kafka의 핵심 구성 요소
1. Topic (토픽)
메시지가 저장되는 카테고리 또는 폴더와 같은 개념입니다.
- 예: user-activity, order-events, payment-logs
2. Partition (파티션)
토픽을 여러 개로 나눈 물리적 저장 단위입니다.
- 병렬 처리를 통한 성능 향상
- 데이터는 파티션에 순서대로 저장됨
3. Producer (프로듀서)
메시지를 생산하고 전송하는 애플리케이션입니다.
- 웹 애플리케이션, IoT 센서, 로그 수집기 등
4. Consumer (컨슈머)
메시지를 구독하고 처리하는 애플리케이션입니다.
- 데이터베이스, 분석 시스템, 알림 서비스 등
5. Broker (브로커)
Kafka 서버 자체를 의미하며, 메시지를 저장하고 관리합니다.
- 일반적으로 3개 이상의 브로커로 클러스터 구성
6. Zookeeper
Kafka 클러스터의 메타데이터와 설정을 관리합니다.
- 브로커 상태 모니터링
- 리더 선출 및 설정 동기화
📊 Kafka 동작 원리
기본 플로우
- Producer가 특정 Topic에 메시지 전송
- Broker가 메시지를 Partition에 저장
- Consumer가 Topic을 구독하여 메시지 수신
- Consumer가 메시지를 처리
Offset 개념
각 메시지는 Partition 내에서 고유한 Offset(순서 번호)를 가집니다. Consumer는 이 Offset을 통해 어디까지 메시지를 읽었는지 추적합니다.
🚀 주요 특징과 장점
1. 높은 처리량 (High Throughput)
- 디스크 기반 순차 읽기/쓰기로 높은 성능 달성
- 배치 처리를 통한 네트워크 효율성 향상
2. 내결함성 (Fault Tolerance)
- 데이터를 여러 브로커에 복제하여 안정성 확보
- 브로커 장애 시 자동 복구
3. 확장성 (Scalability)
- 브로커와 파티션을 추가하여 수평 확장 가능
- Consumer Group을 통한 병렬 처리
4. 영속성 (Durability)
- 메시지를 디스크에 영구 저장
- 설정 가능한 보존 기간
💼 실제 사용 사례
1. 로그 수집 및 분석
웹 서버 → Kafka → ELK Stack → 대시보드
2. 실시간 이벤트 처리
사용자 행동 → Kafka → 실시간 추천 시스템
3. 마이크로서비스 간 통신
주문 서비스 → Kafka → 재고 서비스, 결제 서비스
4. 데이터 파이프라인
데이터베이스 → Kafka → 데이터 웨어하우스
⚙️ Kafka 설치 및 기본 설정
1. Java 설치 확인
java -version
2. Kafka 다운로드
wget https://archive.apache.org/dist/kafka/2.8.0/kafka_2.13-2.8.0.tgz
tar -xzf kafka_2.13-2.8.0.tgz
cd kafka_2.13-2.8.0
3. Zookeeper 시작
bin/zookeeper-server-start.sh config/zookeeper.properties
4. Kafka 서버 시작
bin/kafka-server-start.sh config/server.properties
5. 기본 명령어
# 토픽 생성
bin/kafka-topics.sh --create --topic my-topic --bootstrap-server localhost:9092
# 메시지 전송
bin/kafka-console-producer.sh --topic my-topic --bootstrap-server localhost:9092
# 메시지 수신
bin/kafka-console-consumer.sh --topic my-topic --from-beginning --bootstrap-server localhost:9092
🎨 Consumer Group 이해하기
Consumer Group은 여러 Consumer가 협력하여 메시지를 처리하는 방식입니다.
주요 특징
- 같은 그룹 내 Consumer들은 파티션을 나누어 처리
- 한 파티션은 그룹 내 하나의 Consumer만 처리
- Consumer 추가/제거 시 자동으로 파티션 재분배
예시
Topic: user-events (3개 파티션)
Consumer Group: analytics-group (2개 Consumer)
Consumer 1: Partition 0, 1 처리
Consumer 2: Partition 2 처리
📈 성능 최적화 팁
1. 파티션 수 설정
- CPU 코어 수의 2-3배로 설정
- 너무 많으면 오버헤드 증가
2. 배치 크기 조정
# Producer 설정
batch.size=32768
linger.ms=5
3. 복제 인수 설정
# 안정성과 성능의 균형
replication.factor=3
min.insync.replicas=2
⚠️ 주의사항 및 모범 사례
1. 메시지 순서
- 파티션 내에서만 순서 보장
- 전체 토픽 순서가 중요하면 파티션 1개 사용
2. 키(Key) 설계
- 동일한 키를 가진 메시지는 같은 파티션으로 전송
- 키 분산이 파티션 분산에 영향
3. 모니터링
- 브로커 상태, Consumer Lag, 처리량 모니터링 필수
- JMX, Prometheus 등 활용
🔮 Kafka의 미래
Kafka는 지속적으로 발전하고 있으며, 다음과 같은 방향으로 진화하고 있습니다:
- Kafka Streams: 실시간 스트림 처리 라이브러리
- KSQL: SQL로 스트림 데이터 처리
- Kafka Connect: 다양한 시스템과의 연동 간소화
- Schema Registry: 스키마 관리 및 호환성 보장
마무리
Apache Kafka는 현대적인 데이터 아키텍처의 핵심 구성 요소로 자리잡았습니다. 실시간 데이터 처리가 중요해진 오늘날, Kafka를 이해하고 활용하는 것은 개발자에게 필수적인 역량이 되었습니다.
처음에는 복잡해 보일 수 있지만, 기본 개념을 차근차근 익히고 실습을 통해 경험을 쌓는다면 누구나 Kafka를 마스터할 수 있습니다. 여러분의 프로젝트에 Kafka를 도입해보시고, 실시간 데이터 처리의 강력함을 직접 경험해보세요!
이 글이 도움이 되었다면 좋아요와 공유 부탁드립니다. Kafka에 대한 더 자세한 내용이나 궁금한 점이 있다면 댓글로 남겨주세요!