[Kafka] Kafka 클러스터 4노드 구성 - Controller, Broker 혼합해서 구성하기
l Kafka 3.6.1 with KRaft
지난 포스트에서는 카프카를 단일 노드에 구성한 뒤 간단히 PUB/SUB를 테스트하는 방법에 대해서 알아보았다.
l Kafka 설치 (with KRaft) 및 PUB/SUB 테스트 코드 (with Python) 실습 :
이번 포스트는 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, 크래프트
'SW Engineering > DevOps, SRE' 카테고리의 다른 글
[Kafka] Kafka 리더, 팔로워, 복제 및 복구 이해하기 (0) | 2024.01.19 |
---|---|
[Kafka] Kafka 데이터 모델인 Topic과 Partition 이해하기 (0) | 2024.01.18 |
[Kafka] KRaft 설정 파일 및 기본 속성 정의 알아보기 (0) | 2024.01.11 |
[Kafka] Kafka 설치 (with KRaft) 및 PUB/SUB 테스트 코드 (with Python) 실습 (0) | 2024.01.09 |
[Grafana] Grafana에서 이메일 알림 보내기 (0) | 2023.11.17 |