Kafka는 메타데이터 관리를 위해 ZooKeeper에 대한 의존성을 줄이기 위해 지속적으로 업데이트를 진행해 왔으며, 최근에는 ZooKeeper 없이도 동작하는 KRaft(Kafka Raft) 모드를 제공하고 있습니다. KRaft 모드를 사용하면 Kafka 자체적으로 메타데이터를 관리하여 아키텍처를 단순화하고 운영 효율성을 높일 수 있습니다.
KRaft 모드를 설정할 때, 각 서버(컨트롤러와 브로커)에 반드시 포함해야 하는 필수 설정 항목들은 다음과 같습니다:
process.roles:
broker: 브로커로 동작controller: 컨트롤러로 동작broker,controller: 브로커와 컨트롤러 모두로 동작 process.roles=brokernode.id:
broker.id를 대체하는 옵션)node.id=1controller.quorum.voters:
controller.quorum.voters=1@host1:9092,2@host2:9092,3@host3:9092[node-id]@[컨트롤러 주소]의 형태로 지정합니다.listeners:
listeners=PLAINTEXT://host1:9092Docker Compose를 활용하여 KRaft 모드의 Kafka 클러스터를 구성할 수 있습니다.
아래 파일은 3개의 컨트롤러와 3개의 브로커를 띄우는 도커 컴포즈 파일입니다.
services:
kafka-1:
image: confluentinc/cp-kafka:7.5.3
container_name: kafka-1
ports:
- "29092:29092"
environment:
KAFKA_NODE_ID: 0
KAFKA_CONTROLLER_QUORUM_VOTERS: 0@kafka-1:29092,1@kafka-2:29093,2@kafka-3:29094
KAFKA_PROCESS_ROLES: "controller"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT"
KAFKA_LISTENERS: "CONTROLLER://:29092"
KAFKA_CONTROLLER_LISTENER_NAMES: "CONTROLLER"
CLUSTER_ID: "bgeZzj2yQhyQLEix3qTsyg"
kafka-2:
image: confluentinc/cp-kafka:7.5.3
container_name: kafka-2
ports:
- "29093:29093"
environment:
KAFKA_NODE_ID: 1
KAFKA_CONTROLLER_QUORUM_VOTERS: 0@kafka-1:29092,1@kafka-2:29093,2@kafka-3:29094
KAFKA_PROCESS_ROLES: "controller"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT"
KAFKA_LISTENERS: "CONTROLLER://:29093"
KAFKA_CONTROLLER_LISTENER_NAMES: "CONTROLLER"
CLUSTER_ID: "bgeZzj2yQhyQLEix3qTsyg"
kafka-3:
image: confluentinc/cp-kafka:7.5.3
container_name: kafka-3
ports:
- "29094:29094"
environment:
KAFKA_NODE_ID: 2
KAFKA_CONTROLLER_QUORUM_VOTERS: 0@kafka-1:29092,1@kafka-2:29093,2@kafka-3:29094
KAFKA_PROCESS_ROLES: "controller"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT"
KAFKA_LISTENERS: "CONTROLLER://:29094"
KAFKA_CONTROLLER_LISTENER_NAMES: "CONTROLLER"
CLUSTER_ID: "bgeZzj2yQhyQLEix3qTsyg"
kafka-4:
image: confluentinc/cp-kafka:7.5.3
container_name: kafka-4
ports:
- "9095:9095"
environment:
KAFKA_NODE_ID: 3
KAFKA_CONTROLLER_QUORUM_VOTERS: 0@kafka-1:29092,1@kafka-2:29093,2@kafka-3:29094
KAFKA_PROCESS_ROLES: "broker"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT"
KAFKA_CONTROLLER_LISTENER_NAMES: "CONTROLLER"
KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka-4:9095"
KAFKA_LISTENERS: "PLAINTEXT://:9095"
CLUSTER_ID: "bgeZzj2yQhyQLEix3qTsyg"
kafka-5:
image: confluentinc/cp-kafka:7.5.3
container_name: kafka-5
ports:
- "9096:9096"
environment:
KAFKA_NODE_ID: 4
KAFKA_CONTROLLER_QUORUM_VOTERS: 0@kafka-1:29092,1@kafka-2:29093,2@kafka-3:29094
KAFKA_PROCESS_ROLES: "broker"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT"
KAFKA_CONTROLLER_LISTENER_NAMES: "CONTROLLER"
KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka-5:9096"
KAFKA_LISTENERS: "PLAINTEXT://:9096"
CLUSTER_ID: "bgeZzj2yQhyQLEix3qTsyg"
kafka-6:
image: confluentinc/cp-kafka:7.5.3
container_name: kafka-6
ports:
- "9097:9097"
environment:
KAFKA_NODE_ID: 5
KAFKA_CONTROLLER_QUORUM_VOTERS: 0@kafka-1:29092,1@kafka-2:29093,2@kafka-3:29094
KAFKA_PROCESS_ROLES: "broker"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT"
KAFKA_CONTROLLER_LISTENER_NAMES: "CONTROLLER"
KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka-6:9097"
KAFKA_LISTENERS: "PLAINTEXT://:9097"
CLUSTER_ID: "bgeZzj2yQhyQLEix3qTsyg"
kafka-ui:
image: provectuslabs/kafka-ui:latest
container_name: kafka-ui
ports:
- "8080:8080"
environment:
- KAFKA_CLUSTERS_0_NAME=kafka-cluster
- KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka-4:9095,kafka-5:9096,kafka-6:9097
- DYNAMIC_CONFIG_ENABLED=true
networks:
default:
name: kafka-cluster
컨트롤러는 클러스터의 메타데이터 관리를 담당하며, 다음과 같은 설정이 필요합니다:
KAFKA_NODE_ID: 컨트롤러의 고유 ID를 설정합니다.
KAFKA_NODE_ID: 0
KAFKA_PROCESS_ROLES: 서버의 역할을 지정합니다. 컨트롤러로 설정하려면 controller로 지정합니다.
KAFKA_PROCESS_ROLES: "controller"
KAFKA_CONTROLLER_QUORUM_VOTERS: 컨트롤러 쿼럼에 참여하는 모든 컨트롤러의 목록을 지정합니다.
KAFKA_CONTROLLER_QUORUM_VOTERS: 0@kafka-1:29092,1@kafka-2:29093,2@kafka-3:29094
KAFKA_LISTENERS: 컨트롤러가 수신할 프로토콜과 주소를 지정합니다.
KAFKA_LISTENERS: "CONTROLLER://:29092"
KAFKA_CONTROLLER_LISTENER_NAMES: 컨트롤러가 사용할 리스너 이름을 지정합니다.
KAFKA_CONTROLLER_LISTENER_NAMES: "CONTROLLER"
CLUSTER_ID: 클러스터의 고유 ID를 설정합니다. 이는 모든 컨트롤러와 브로커에서 동일해야 합니다.
CLUSTER_ID: "bgeZzj2yQhyQLEix3qTsyg"
브로커는 실제 데이터의 저장과 전송을 담당하며, 다음과 같은 설정이 필요합니다:
KAFKA_NODE_ID: 브로커의 고유 ID를 설정합니다.
KAFKA_NODE_ID: 3
KAFKA_PROCESS_ROLES: 서버의 역할을 지정합니다. 브로커로 설정하려면 broker로 지정합니다.
KAFKA_PROCESS_ROLES: "broker"
KAFKA_CONTROLLER_QUORUM_VOTERS: 컨트롤러 쿼럼에 참여하는 모든 컨트롤러의 목록을 지정합니다.
KAFKA_CONTROLLER_QUORUM_VOTERS: 0@kafka-1:29092,1@kafka-2:29093,2@kafka-3:29094
KAFKA_LISTENERS: 브로커가 수신할 프로토콜과 주소를 지정합니다.
KAFKA_LISTENERS: "PLAINTEXT://:9095"
KAFKA_ADVERTISED_LISTENERS: 브로커가 클라이언트에 광고할 주소를 지정합니다.
KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka-4:9095"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 리스너와 보안 프로토콜의 매핑을 지정합니다.
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT"
KAFKA_CONTROLLER_LISTENER_NAMES: 브로커가 컨트롤러와 통신할 때 사용할 리스너 이름을 지정합니다.
KAFKA_CONTROLLER_LISTENER_NAMES: "CONTROLLER"
CLUSTER_ID: 클러스터의 고유 ID를 설정합니다. 같은 클러스터는 같은 클러스터 아이디를 갖습니다.
CLUSTER_ID: "bgeZzj2yQhyQLEix3qTsyg"