Broker와 클러스터

Broker란?

Broker는 Kafka 서버를 의미하며, 메시지를 저장하고 클라이언트의 요청을 처리하는 핵심 컴포넌트입니다.

Broker의 주요 역할

  1. 메시지 저장

    • Producer로부터 메시지를 받아 디스크에 저장
    • 파일 시스템의 로그 형태로 순차적 저장
    • 설정된 보관 기간 동안 메시지 유지
  2. 메시지 전달

    • Consumer의 fetch 요청 처리
    • 효율적인 배치 전송
    • Zero-copy를 통한 고성능 데이터 전송
  3. 메타데이터 관리

    • 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=0

Controller 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.threadsI/O 처리 스레드 수8-16
socket.send.buffer.bytes소켓 송신 버퍼 크기102400 (100KB)
socket.receive.buffer.bytes소켓 수신 버퍼 크기102400 (100KB)
socket.request.max.bytes최대 요청 크기104857600 (100MB)

클러스터 확장성

수평 확장 (Scale Out)

Broker를 추가하여 처리 용량과 저장 공간 확장:

  1. 새 Broker 추가

    # 새 Broker 시작
    bin/kafka-server-start.sh config/server.properties
  2. Partition 재분배

고가용성 (High Availability)

  • 최소 3개의 Broker 권장
  • Replication Factor ≥ 3 설정
  • 서로 다른 랙(rack)에 Broker 배치
  • 장애 격리를 위한 네트워크/전원 분리

장애 처리

Broker 장애

  1. 감지: Controller가 Broker 장애 감지
  2. Leader 재선출: 장애 Broker의 Leader Partition들을 다른 Replica로 이관
  3. ISR 업데이트: 장애 Broker를 ISR에서 제거
  4. 복구: 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=5

JVM 설정

# 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

관련 문서