Broker와 클러스터
Broker란?
Broker는 Kafka 서버를 의미하며, 메시지를 저장하고 클라이언트의 요청을 처리하는 핵심 컴포넌트입니다.
Broker의 주요 역할
-
메시지 저장
- Producer로부터 메시지를 받아 디스크에 저장
- 파일 시스템의 로그 형태로 순차적 저장
- 설정된 보관 기간 동안 메시지 유지
-
메시지 전달
- Consumer의 fetch 요청 처리
- 효율적인 배치 전송
- Zero-copy를 통한 고성능 데이터 전송
-
메타데이터 관리
- Topic, Partition 정보 관리
- Replica 상태 추적
- Controller와 협력하여 클러스터 관리
Kafka 클러스터
클러스터 구성
Kafka 클러스터는 여러 개의 Broker로 구성되며, 다음과 같은 특징을 가집니다:
graph TB subgraph cluster["Kafka Cluster"] B1["Broker 1<br/>ID: 0"] B2["Broker 2<br/>ID: 1"] B3["Broker 3<br/>ID: 2"] B1 -.협력.- B2 B2 -.협력.- B3 B1 -.협력.- B3 end
Broker ID
- 각 Broker는 고유한 broker.id를 가짐
- 클러스터 내에서 Broker를 식별하는 유일한 값
- 설정 파일(
server.properties)에서 지정
# server.properties
broker.id=0Controller Broker
클러스터의 Broker 중 하나가 Controller 역할을 수행:
- Leader Election: Partition의 Leader 선출
- Broker 상태 관리: Broker의 추가/제거 처리
- Partition 할당: Topic 생성 시 Partition 분배
- ISR 관리: In-Sync Replicas 목록 관리
Controller는 장애 발생 시 자동으로 다른 Broker가 역할을 승계합니다.
클러스터 설정
기본 설정
# 클러스터 내 고유 ID
broker.id=0
# Kafka가 수신 대기할 주소
listeners=PLAINTEXT://localhost:9092
# 로그 파일 저장 위치
log.dirs=/var/kafka-logs
# Zookeeper 연결 정보 (Kafka 2.8 이전)
zookeeper.connect=localhost:2181
# 기본 Replication Factor
default.replication.factor=3
# 최소 ISR 수
min.insync.replicas=2
# 자동 Topic 생성 허용 여부
auto.create.topics.enable=false주요 설정 항목
| 설정 | 설명 | 권장값 |
|---|---|---|
num.network.threads | 네트워크 요청 처리 스레드 수 | 3-8 |
num.io.threads | I/O 처리 스레드 수 | 8-16 |
socket.send.buffer.bytes | 소켓 송신 버퍼 크기 | 102400 (100KB) |
socket.receive.buffer.bytes | 소켓 수신 버퍼 크기 | 102400 (100KB) |
socket.request.max.bytes | 최대 요청 크기 | 104857600 (100MB) |
클러스터 확장성
수평 확장 (Scale Out)
Broker를 추가하여 처리 용량과 저장 공간 확장:
-
새 Broker 추가
# 새 Broker 시작 bin/kafka-server-start.sh config/server.properties -
Partition 재분배
- 기존 Partition을 새 Broker로 이동
- 부하 분산 최적화
- Partition Reassignment 참고
고가용성 (High Availability)
- 최소 3개의 Broker 권장
- Replication Factor ≥ 3 설정
- 서로 다른 랙(rack)에 Broker 배치
- 장애 격리를 위한 네트워크/전원 분리
장애 처리
Broker 장애
- 감지: Controller가 Broker 장애 감지
- Leader 재선출: 장애 Broker의 Leader Partition들을 다른 Replica로 이관
- ISR 업데이트: 장애 Broker를 ISR에서 제거
- 복구: Broker 재시작 후 자동으로 Replica 동기화 재개
장애 발생 전:
Broker1 (Leader: P1, P2)
Broker2 (Follower: P1, Leader: P3)
Broker3 (Follower: P2, Follower: P3)
Broker1 장애 후:
Broker1 (Down)
Broker2 (Leader: P1, P3) ← P1 Leader로 승격
Broker3 (Follower: P1, Leader: P2, Follower: P3) ← P2 Leader로 승격
Controller 장애
- Controller 장애 시 Zookeeper/KRaft를 통해 새 Controller 선출
- 일반적으로 수 초 이내에 완료
- 선출 중에도 데이터 읽기/쓰기는 정상 작동
성능 최적화
OS 수준 튜닝
# 파일 디스크립터 제한 증가
ulimit -n 100000
# 스왑 비활성화 또는 최소화
vm.swappiness=1
# Page cache 활용을 위한 설정
vm.dirty_ratio=80
vm.dirty_background_ratio=5JVM 설정
# Heap 크기 설정 (일반적으로 6-8GB)
export KAFKA_HEAP_OPTS="-Xmx6g -Xms6g"
# GC 옵션 (G1GC 사용)
export KAFKA_JVM_PERFORMANCE_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=20"모니터링
주요 메트릭
- UnderReplicatedPartitions: 복제가 지연된 Partition 수 (0이어야 함)
- ActiveControllerCount: Controller 수 (클러스터당 1개)
- OfflinePartitionsCount: 오프라인 Partition 수 (0이어야 함)
- RequestHandlerAvgIdlePercent: 요청 핸들러 유휴율
JMX 메트릭 확인
# JConsole 또는 JMX 도구로 확인
kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions
kafka.controller:type=KafkaController,name=ActiveControllerCount
kafka.controller:type=KafkaController,name=OfflinePartitionsCount관련 문서
- Topic과 Partition: Broker가 관리하는 데이터 구조
- Replica와 Leader-Follower 구조: Broker 간 데이터 복제
- KRaft 모드: Zookeeper 없는 클러스터 관리
- 클러스터 관리: Broker 운영 및 관리 상세 가이드
댓글 (0)