
kafka 에 대한 개념은 이전에 한 번 포스팅 한 적이 있다. 설치를 하면서 하나의 인프라에 클러스터를 구성하는 방법으로 설치를 (간단하게) 진행 해봤는데, 조금 더 효율적인 인프라 구축을 위해 클러스터를 분리하여 설치하는 방법도 알아보도록 하자.
1. Kafka 클러스터란 무엇인가?
Kafka를 복습해 보자면, 대용량 데이터를 빠르게 처리할 수 있도록 설계된 분산 메시징 시스템이다. 이 카프카에 있는 "클러스터"라는 것은 여러 개의 Kafka 서버(브로커)가 하나의 팀처럼 협력하여 동작하는 구조를 말한다.
- 클러스터의 기본 구성
- Broker: Kafka 서버, 메시지를 저장하고 전달하는 역할을 한다.
- Topic: 데이터를 분류하기 위한 논리적인 단위이다.
- Partition: Topic을 나눈 물리적인 단위로, 병렬 처리를 가능하게 해준다.
- Leader & Follower: Partition을 복제하고 관리하기 위한 역할 구분이다.
즉, 클러스터를 구성하면 여러 서버가 하나의 Kafka처럼 동작하면서, 장애에 강하고, 부하 분산이 잘 되는 시스템을 만들 수 있다.
2. Zookeeper 모드와 KRaft 모드의 차이점은 무엇일까?
Kafka는 Zookeeper라는 외부 시스템에 의존하여 클러스터의 메타데이터를 관리해왔다.
하지만 Kafka 2.8 이후부터는 KRaft 모드가 도입되었고, Zookeeper 없이 Kafka 자체만으로 클러스터를 운영할 수 있게 되었다.
간단히 이해하기 위해 비유적인 표현을 사용하자면, Zookeeper 모드 -> 회사 관리만 전문으로 하는 외부 관리자, KRaft 모드는 직원들끼리 모여 스스로 리더를 뽑고 관리를 맡기는 모드이다.
| 구분 | Zookeeper 모드 | KRaft 모드 |
| 메타데이터 저장소 | Zookeeper 사용 | Kafka 내부 저장 |
| 리더 선출 방식 | Zookeeper가 결정 | Kafka 내부에서 Raft 알고리즘 사용 |
| 운영 복잡도 | Kafka + Zookeeper 둘 다 관리해야 함 | Kafka만 관리하면 됨 |
| 고가용성 고려 요소 | Zookeeper 장애도 고려해야 함 | Kafka 자체로 가능 |
| 최신 Kafka 기준 | 아직 지원되지만 구식 | Kafka 3.x 이상에서 적극 권장됨 |
3. 클러스터를 두 대의 PC로 분리해서 구성하면 좋은 점은?
이번 구성에서는 Kafka 클러스터를 두 대의 (가상)컴퓨터에 나눠서 설치해보았다. 이렇게 구성하면 단순히 설치하고 실행만 해보는 것보다 훨씬 많은 것을 배울 수 있다.
- 실제 장애 상황을 테스트할 수 있다
→ 한 PC를 끄더라도 다른 노드가 계속 동작하는 모습을 볼 수 있다. - 실제 네트워크 환경을 구성해볼 수 있다
→ 포트 충돌, IP 통신, 방화벽 등 실전에서 겪을 문제들을 연습할 수 있다. - 리더 선출과 데이터 복제 구조를 직접 체험할 수 있다
→ 단일 머신에서는 알기 힘든 Kafka의 동작 원리를 이해하게 된다. - 확장성과 분산 시스템 구조를 체득할 수 있다
→ 노드 수가 늘어날수록 Kafka가 데이터를 어떻게 분산 처리하는지 직접 볼 수 있다.
4. 설치 구조와 설정 방법 정리
4-1. 전체 구성도
| 노드 | 설치PC - ip | 노드 id | 역할 | Controller port | Broker 포트 |
| server-1 | 192.168.0.98 | 1 | broker + controller | 9093 | 9096 |
| server-2 | 192.168.0.98 | 2 | broker + controller | 9094 | 9097 |
| server-3 | 192.168.0.99 | 3 | broker + controller | 9095 | 9098 |
- 클러스터 UUID는 한 번만 생성해서 세 노드가 함께 공유해야 한다.
- 각 노드는 controller.quorum.voters에 모든 노드의 IP와 포트를 포함해야 한다.
- listeners, log.dirs 등도 각 노드에 맞게 다르게 설정해야 한다.
4-2. server-1.properties 예시
process.roles=broker,controller
node.id=1
controller.quorum.voters=1@localhost:9093,2@localhost:9094,3@192.168.0.99:9095
listeners=PLAINTEXT://localhost:9096,CONTROLLER://localhost:9093
inter.broker.listener.name=PLAINTEXT
listener.security.protocol.map=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
controller.listener.names=CONTROLLER
log.dirs=/product/software/kafka/logs/kraft-combined-logs-1
- ip 입력 시 햇갈리지 않기 위해 localhost 를 이용하였고, 직접 ip 가 입력된 노드와 포트는 다른 클러스터의 노드임을 주의해서 입력해야 한다.
- 2번째 클러스터(server-2.properties) 역시 server-1 과 같은 (가상)PC 에 설치 할 예정이기 때문에 node.id 만 2 로 변경해주면 된다.
4-3 server-3.properties 예시
process.roles=broker,controller
node.id=3
controller.quorum.voters=1@192.168.0.98:9093,2@192.168.0.98:9094,3@localhost:9095
listeners=PLAINTEXT://localhost:9096,CONTROLLER://localhost:9093
inter.broker.listener.name=PLAINTEXT
listener.security.protocol.map=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
controller.listener.names=CONTROLLER
log.dirs=/product/software/kafka/logs/kraft-combined-logs-3
- 노드 id 를 3으로 변경한다.
- 해당 PC에서 사용하는 노드의 IP는 localhost 로 작성하고, 다른 노드의 IP 는 직접 입력해준다.
5. UUID 생성과 적용 과정
모든 클러스터는 하나의 UUID 로 적용해야 한다. 설치 진행시 하나의 PC에 UUID 를 생성하고 적용한 뒤. 이 UUID 를 알아내서 다음 PC에 설치 시 적용해주면 된다.
UUID 가 나와있는 위치는 $KAFKA_HOME//kafka/logs/kraft-combined-logs-1 경로에 위치한 meta.properties 파일에서 확인할 수 있다.

# UUID는 최초 1회만 생성
uuid=$KAFKA_HOME/bin/kafka-storage.sh random-uuid
# 생성된 UUID를 1번 PC에 적용
$KAFKA_HOME/bin/kafka-storage.sh format -t $uuid -c config/server-1.properties
$KAFKA_HOME/bin/kafka-storage.sh format -t $uuid -c config/server-2.properties
# 생성된 UUID를 2번 PC에 적용
$KAFKA_HOME/bin/kafka-storage.sh format -t $uuid -c config/server-3.properties
6. 실행 하기
#1번 PC에서 실행
$KAFKA_HOME/bin/kafka-server-start.sh -daemon config/server-1.properties
$KAFKA_HOME/bin/kafka-server-start.sh -daemon config/server-2.properties
#2번 PC에서 실행
$KAFKA_HOME/bin/kafka-server-start.sh -daemon config/server-3.properties
7. 마무리
단순히 레퍼런스대로 설치를 진행하고 실행하는 것을 넘어, 효율적인 사용을 위해 소프트웨어를 분리하여 설치하고, 제대로 동작할 수 있도록 설정을 구성해 본 것에 대해 큰 보람을 느꼇다. 그리고 설치 시 각 노드들의 IP 가 햇갈리지 않도록 주의해서 입력하도록 하자!
'네트워크 공부 & 실습 > 네트워크 실습' 카테고리의 다른 글
| [Network] TcpDump 명령어로 패킷 캡처 하기 (1) | 2025.07.24 |
|---|---|
| [Network] Linux Netplan 설정으로 네트워크 설정하기 (1) | 2025.07.08 |
| [Network] Nas 가 죽으면 알림 받기 (5) | 2025.06.26 |
| [Network] static ip 를 셋팅하여 기기간 통신하기. (2) | 2025.06.19 |
| [Network] DNS 구축으로 IP 주소 대신 문자열 사용하기 (2) | 2025.06.02 |