반응형

[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, 크래프트

 

반응형

+ Recent posts