1. 구성 환경 및 설치 버전
- GCP Computer Engine: e2-standard-2(vCPU 2개, 메모리 8GB) 3대
- 무료 크레딧을 사용할 수 있는 GCP를 사용
- Kafka 3.7.2
- 최신 4버전을 설치해서 사용해보려 했으나 학습목적이므로 stable버전을 사용하기로함
- Java 17
- Kafka 3.7.2: Java 11이상 권장 (Kafka Broker Java11이상 / Kafka Clients, Streams Java 8이상)
- Kafka 4:Java 17이상 권장 (Kafka Broker Java17이상 / Kafka Clients, Streams Java 11 이상)
- 추후 업그레이드를 생각하여 Java17로 설치하기로함
- KRaft
- 분산 시스템을 관리하기 위한 메커니즘
- 기존엔 Zookeeper를 사용하여 클러스터 메타데이터의 관리와 조정을 담당했으나 카프카 자체 내에서 분산 시스템의 상태를 관리하는 방식(KRaft)이 도입됨
- 최신 4.0.0버전 부터는 KRaft만 지원함
- Zookeeper vs KRaft는 아래 블로그 내용 참고
https://devocean.sk.com/blog/techBoardDetail.do?ID=165711&boardType=techBlog
Apache Kafka의 새로운 협의 프로토콜인 KRaft에 대해(1)
devocean.sk.com
2. 설치 방법
2.1 GCP 인스턴스 및 네트워크 셋팅
- GCP에서 인스턴스 1개 생성
- e2-standard-2
- Ubuntu24.04(X86_64)
- 디스크 32GB
- 외부 IPv4 고정 네트워크 추가 (Public IP)
- 기본 구성 설치 후 이미지 복사하여 2대 추가 구성하기
- 방화벽 설정
- tcp:9093 포트 열기 (9093 = Controller 간 내부 통신-KRaft)
- tcp:9092 포트 열기 (9092 = 클라이언트용 kafka listener)
2.2 기본 구성 설치
- 기본 업데이트 진행
sudo apt update && \
sudo apt install build-essential -y
- 시간대 변경
sudo timedatectl set-timezone Asia/Seoul
- java 설치
# java17 설치
sudo apt-get install openjdk-17-jdk -y
# 확인
java --version
- Kafka 설치
# kafka 3.7.2 버전 설치 (2.12 = scala 버전)
wget https://downloads.apache.org/kafka/3.7.2/kafka_2.12-3.7.2.tgz \
&& tar xzf kafka_2.12-3.7.2.tgz
- 환경변수 등록
- GCP는 home 디렉토리 아래에 사용자id로된 폴더가 기본 경로로 설정되므로 아래 처럼 등록해야함
echo 'export KAFKA_HOME=/home/{사용자id}/kafka_2.12-3.7.2' >> ~/.bashrc \
&& source ~/.bashrc
# 등록 확인
echo $KAFKA_HOME
여기 까지 진행 후 이미지를 생성해서 나머지 인스턴스 2대를 생성해준다.
2.3 클러스터 구성 하기
이미지를 이용해 아래 사진 처럼 3대의 서버를 구성했으면 다음에 이어지는 내용을 3개의 서버에서 각각 진행한다.
kafka server 파일 설정
- controller.quorum.voters
- Kraft모드(Kafka Raft Metadata mode)를 사용하는 Kafka 클러스터에서 컨트롤러 노드들의 합의(quorum)를 구성하기 위한 설정
- 컨트롤러로 동작할 브로커 ID 목록과 해당 호스트 정보를 지정하는 설정
- 구성 형식: node.id@public IP:9093
- advertised.listeners
- Kafka 브로커가 클라이언트(consumer, producer, 다른 브로커)에게 자신에게 접근 시 어디로 접근 가능한지 알릴 때 사용하는 주소
vi $KAFKA_HOME/config/kraft/server.properties
# server.properties
# broker1
node.id=1
controller.quorum.voters=1@34.64.39.60:9093, 2@34.64.124.29:9093, 3@34.64.150.137:9093
advertised.listeners=PLAINTEXT://34.64.39.60:9092
num.partitions=3
# server.properties
# broker2
node.id=2
controller.quorum.voters=1@34.64.39.60:9093, 2@34.64.124.29:9093, 3@34.64.150.137:9093
advertised.listeners=PLAINTEXT://34.64.124.29:9092
num.partitions=3
# server.properties
# broker3
node.id=3
controller.quorum.voters=1@34.64.39.60:9093, 2@34.64.124.29:9093, 3@34.64.150.137:9093
advertised.listeners=PLAINTEXT://34.64.150.137:9092
num.partitions=3
- Kafka Cluster 고유 ID 생성 및 환경 변수 등록
# node 1에서 진행
# UUID를 이용해 ID 생성 후 환경변수 등록
export KAFKA_CLUSTER_ID="$($KAFKA_HOME/bin/kafka-storage.sh random-uuid)"
# 확인
echo $KAFKA_CLUSTER_ID
# node 2,3에서 진행
# node1에서 확인한 KAFKA_CLUSTER_ID를 등록
export KAFKA_CLUSTER_ID={node1에서 확인한 KAFKA_CLUSTER_ID}
- log.dirs 폴더 포맷
- 해당 폴더에서 토픽, 파티션 등의 정보를 저장하게됨
- /tmp 폴더는 인스턴스 종료 시 자동으로 삭제되므로 이런게 싫으면 server.properties파일의 log.dir 설정에서 경로 변경해야함
$KAFKA_HOME/bin/kafka-storage.sh format -t $KAFKA_CLUSTER_ID -c $KAFKA_HOME/config/kraft/server.properties
# 아래 내용 출력되면 ok
# Formatting /tmp/kraft-combined-logs
- 생성된 meta.properties 확인
포맷팅된 폴더 아래에 meta.properties파일이 생성된 것을 확인할 수 있다. 다음과 같은 정보가 제대로 들어갔는지 확인한다.
vi /tmp/kraft-combined-logs/meta.properties
# Cluster.id가 모든 node에서 동일한지 확인
# node.id는 서버 별로 다른지 확인
cluster.id=Kj-AXRtDTMKCUdYwXPGpHg
version=1
node.id=1
2.4 Kafka 서버 실행하기
- 힙 메모리 설정
- Kafka 서버를 시작하기 전에 힙 속성을 설정해야 한다.
- 본인의 인스턴스 메모리 - 1GB크기를 최대 힙 크기로 설정한다.
export KAFKA_HEAP_OPTS="-Xmx7G -Xms7G"
- 서버 실행
- 모든 서버에서 kafka 실행하기
# 백그라운드에 실행
$KAFKA_HOME/bin/kafka-server-start.sh -daemon $KAFKA_HOME/config/kraft/server.properties
# 해당 세션에 서버 실행
$KAFKA_HOME/bin/kafka-server-start.sh $KAFKA_HOME/config/kraft/server.properties
- 세션 실행 확인
- 서버 실행 시 출력되는 log에서 Kafka Server started 출력 확인
- 백그라운드 실행 확인
- process 확인: pid옆에 1이 출력되면 ok
# 서버 로그 확인 (최하단에 Kafka Server started 출력 확인)
vi $KAFKA_HOME/logs/server.log
# process 확인
ps -ef | grep kafka
2.4 Kafka 서버 종료하기
- 브로커 서버 중지
$KAFKA_HOME/bin/kafka-server-stop.sh
- 토픽 및 이벤트를 포함한 모든 Kafka 데이터를 삭제
rm -rf /tmp/kraft-combined-logs
'Data Engineering > Kafka' 카테고리의 다른 글
[Kafka] Kubernetes환경에서 Kafka 구성하기 (with Strimzi) (4) | 2025.08.10 |
---|---|
[Kafka] Kafka 기본 개념 이해하기 (2) | 2025.07.22 |
[Kafka] 스트리밍 데이터 처리와 Event-Driven Architecture 이해하기 (1) | 2025.07.22 |