SW Engineering/DevOps, SRE

[Kafka] Kafka 클러스터 4노드 구성 - Controller, Broker 혼합해서 구성하기

SungWookKang 2024. 1. 17. 11:49
반응형

[Kafka] Kafka 클러스터 4노드 구성 - Controller, Broker 혼합해서 구성하기

 

l  Kafka 3.6.1 with KRaft

 

지난 포스트에서는 카프카를 단일 노드에 구성한 뒤 간단히 PUB/SUB를 테스트하는 방법에 대해서 알아보았다.

l  Kafka 설치 (with KRaft) 및 PUB/SUB 테스트 코드 (with Python) 실습 :

https://sungwookkang.com/entry/Kafka-Kafka-%EC%84%A4%EC%B9%98-with-KRaft-%EB%B0%8F-PUBSUB-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%BD%94%EB%93%9C-with-Python-%EC%8B%A4%EC%8A%B5

 

이번 포스트는 4 node의 카프카 서버를 클러스터로 구성하는 방법에 대해서 알아본다. 그리고 이번 구성에서는 각 노드마다 Controller와 Broker를 함께 배치하였다. 전체적인 구성은 아래와 같다.

 

실습을 위해 아래와 같이 4개의 VM 서버를 준비했다.

  Kafka-1 Kafka-2 Kafka-3 Kafka-4
IP XXX.XXX.XXX.4 XXX.XXX.XXX.5 XXX.XXX.XXX.6 XXX.XXX.XXX.7

 

기존에 IP로 설정했다가 쿼럼을 찾지 못하여 호스트 파일을 설정하여 호스트 파일에 IP를 등록하여 사용하였다. (추후 IP로 다시 설정해 볼 예정이다.)

vi /etc/hosts

 

XXX.XXX.XXX.4 kafka-1
XXX.XXX.XXX.5 kafka-2
XXX.XXX.XXX.6 kafka-3
XXX.XXX.XXX.7 kafka-4

 

 

카프카를 설치하기 위해서는 JDK 11 버전 이상 필요하다. 이번 실습에서는 JDK 17 버전을 설치 및 아파치 카프카 3.6.1을 설치하였다.

  Kafka-1 Kafka-2 Kafka-3 Kafka-4
Install Open Jdk 17 apt-get install openjdk-17-jdk
Download Kafka wget https://downloads.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz
Unpack Kafka tar xvf kafka_2.13-3.6.1.tgz -C /usr/local
Create symbol link cd /usr/local
 
ln -s kafka_2.13-3.6.1/ kafka
Create log directory mkdir -p /usr/local/kafka/kraft-combined-logs

 

 

카프카 디렉토리를 포맷한다. 이때, Kafka-1에서 생성한 UUID를 사용하여 모든 노드의 디렉터리를 포맷한다.

  Kafka-1 Kafka-2 Kafka-3 Kafka-4
Create UUID cd /usr/local/kafka
 
./bin/kafka-storage.sh random-uuid
     
Format Directory cd /usr/local/kafka
 
./bin/kafka-storage.sh format -t J9wwo7p2RHe9-4PiP4KbBw -c ./config/kraft/server.properties

 

Kafka-1에서 UUID를 생성한다. 이때 출력되는 결과를 복사해 놓는다.

 

복사해 놓은 UUID를 사용하여 Kafka-1 ~ Kafka-4 노드의 디렉토리를 포맷한다.

 

 

카프카 서버를 시작하기 전 설정 파일을 수정한다. 설정 파일은 아래 경로에 있다.

cd /usr/local/kafka
vi ./config/kraft/server.properties

 

  Kfaka-1 Kfaka-2 Kfaka-3 Kfaka-4
process.roles broker,controller
node.id 1 2 3 4
controller.quorum.voters 1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093,4@kafka-4:9093
listeners PLAINTEXT://kafka-1:9092,CONTROLLER://kafka-1:9093 PLAINTEXT://kafka-2:9092,CONTROLLER://kafka-2:9093 PLAINTEXT://kafka-3:9092,CONTROLLER://kafka-3:9093 PLAINTEXT://kafka-4:9092,CONTROLLER://kafka-4:9093
inter.broker.listener.name PLAINTEXT
advertised.listeners PLAINTEXT://XXX.XXX.XXX.4:9092 PLAINTEXT://XXX.XXX.XXX.5:9092 PLAINTEXT://XXX.XXX.XXX.6:9092 PLAINTEXT://XXX.XXX.XXX.7:9092
controller.listener.names CONTROLLER
listener.security.protocol.map CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
log.dirs /usr/local/kafka/kraft-combined-logs
num.partitions 1 1 1 1
transaction.state.log.replication.factor 4 4 4 4
transaction.state.log.min.isr 4 4 4 4

 

 

각 노드의 카프카 서버를 시작한다.

  Kfaka-1 Kfaka-2 Kfaka-3 Kfaka-4
Start Kafka cd /usr/local/kafka
 
./bin/kafka-server-start.sh -daemon ./config/kraft/server.properties
Check Service netstat -antp | grep 9092
 
netstat -antp | grep 9093

 

 

 

Kafka-1 노드에서 토픽을 생성한다. 실습에서는 topic1 이라는 이름으로 생성했다.

cd /usr/local/kafka
./bin/kafka-topics.sh --create --topic topic1 --bootstrap-server XXX.XXX.XXX.4:9092 --replication-factor 4 --partitions 1

Kafka-1에서 토픽을 생성했지만, Kafka-1 ~ Kafka-4 노드까지 토픽이 복제된 것을 확인할 수 있다.

  Kfaka-1 Kfaka-2 Kfaka-3 Kfaka-4
Topic List ./bin/kafka-topics.sh --bootstrap-server=10.211.55.4:9092 --list
./bin/kafka-topics.sh --bootstrap-server=10.211.55.5:9092 --list
./bin/kafka-topics.sh --bootstrap-server=10.211.55.6:9092 --list
./bin/kafka-topics.sh --bootstrap-server=10.211.55.7:9092 --list

 

 

프로듀서에서 Kafka-1노드에 메시지를 입력한다. 그리고 각 노드에서 데이터를 확인해 보면 복제된 데이터를 확인할 수 있다. 이때, 데이터가 전체 노드로 복제되기 까지의 시간이 필요하므로 입력 즉시 컨슈머로 확인해보면, 일부 노드에서는 데이터가 보이지 않을 수도 있다. 하지만 시간이 지나면 전체 노드에서 데이터를 확인할 수 있다.

  Kfaka-1 Kfaka-2 Kfaka-3 Kfaka-4
Consumer check ./bin/kafka-console-consumer.sh --bootstrap-server XXX.XXX.XXX.4:9092 --topic topic1 --from-beginning
./bin/kafka-console-consumer.sh --bootstrap-server XXX.XXX.XXX.5:9092 --topic topic1 --from-beginning
./bin/kafka-console-consumer.sh --bootstrap-server XXX.XXX.XXX.6:9092 --topic topic1 --from-beginning
./bin/kafka-console-consumer.sh --bootstrap-server XXX.XXX.XXX.7:9092 --topic topic1 --from-beginning

 

 

 

이번 포스트에서는 Controller와 Broker를 각 노드에 함께 실행하였지만, 트래픽이 헤비한 서버에서는 Controller와 Broker를 분리해서 사용할 것을 권장한다. 그래서 다음 포스트에서는 분리하여 클러스터를 구성하는 방법에 대해서 알아볼 예정이다.

 

 

2024-01-17 / Sungwook Kang / https://sungwookkang.com

 

 

KAFKA, 아파치 카프카, Apache Kafka, KRaft, 크래프트

 

반응형