728x90

Kafka Kraft ๋ชจ๋“œ๋ž€?

  Apache Kafka์—์„œ ๊ธฐ์กด์˜ Zookeeper ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•˜๊ณ , Kafka ์ž์ฒด ๋‚ด์—์„œ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ๊ด€๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋œ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜์ž…๋‹ˆ๋‹ค. KRaft ๋ชจ๋“œ๋Š” Kafka Raft Consensus Algorithm์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„๋˜์–ด Kafka ๋ธŒ๋กœ์ปค๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์žฅ์•  ๋ณต๊ตฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

 KRaft ๋ชจ๋“œ๋Š” Apache Kafka์˜ ์šด์˜ ๋ฐฉ์‹์— ํ˜์‹ ์ ์ธ ๋ณ€ํ™”๋ฅผ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ Zookeeper์˜ ์˜์กด์„ฑ์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ–ˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋ฐฐํฌ์™€ ๊ด€๋ฆฌ๊ฐ€ ํ•œ๊ฒฐ ๊ฐ„๋‹จํ•ด์กŒ์œผ๋ฉฐ, Kafka๋ฅผ ์šด์˜ํ•˜๋Š” ํŒ€์˜ ๋ถ€๋‹ด๋„ ํฌ๊ฒŒ ์ค„์–ด๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, KRaft๋Š” Kafka ์ž์ฒด์—์„œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์ง€์—ฐ ์‹œ๊ฐ„์„ ์ค„์ด๊ณ  ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์„ ๋”์šฑ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋™์ผํ•œ ์‹œ์Šคํ…œ์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” ์ผ๊ด€๋œ ์•„ํ‚คํ…์ฒ˜๋„ ํฐ ์žฅ์ ์ž…๋‹ˆ๋‹ค.

 

 ํ•˜์ง€๋งŒ ๋„์ž… ์ดˆ๊ธฐ์ธ ๋งŒํผ ๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. KRaft๋Š” ์•„์ง ์•ˆ์ •์„ฑ๊ณผ ์‹ ๋ขฐ์„ฑ์ด ์ถฉ๋ถ„ํžˆ ๊ฒ€์ฆ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์š”ํ•œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ๋„์ž…ํ•˜๋ ค๋ฉด ์‹ ์ค‘ํ•œ ์ ‘๊ทผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๊ธฐ์กด Zookeeper ๊ธฐ๋ฐ˜ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ ค๋ฉด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์ด ์š”๊ตฌ๋˜๋ฉฐ, ์ด๋Š” ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•œ ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์šด์˜ ๋ฐฉ์‹์— ๋Œ€ํ•œ ํ•™์Šต์ด ํ•„์ˆ˜์ ์ธ ์ ๋„ ์šด์˜ํŒ€์— ์ถ”๊ฐ€์ ์ธ ๋ถ€๋‹ด์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์„ค์น˜

 

[.env]

IMAGE_TAG=3.9.0 # 3.9.0
IMAGE_NAME=apache/kafka-kraft-mode
SCALA_VERSION=2.13
CONTAINER_NAME=kafka

 

[server.properties]

# Server basics
process.roles=broker,controller
node.id=1
controller.quorum.voters=1@localhost:9093
log.dirs=/tmp/kafka-logs

# Metadata
metadata.log.dir=/tmp/kraft-metadata

# Listeners
listeners=PLAINTEXT://localhost:9092,CONTROLLER://localhost:9093
advertised.listeners=PLAINTEXT://localhost:9092
listener.security.protocol.map=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
controller.listener.names=CONTROLLER

# Replication factors
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1

# Partitions and rebalance
num.partitions=1
group.initial.rebalance.delay.ms=0

 

[Dockerfile]

# Use a base image with Java
FROM openjdk:11-jre-slim

# Install dependencies
RUN apt-get update && apt-get install -y wget uuid-runtime && apt-get clean

# https://downloads.apache.org/kafka/
# Set an argument for Kafka version
ARG KAFKA_VERSION=${IMAGE_TAG:-3.9.0}
ARG SCALA_VERSION=${SCALA_VERSION:-2.13}

# Download Kafka
RUN wget https://downloads.apache.org/kafka/${KAFKA_VERSION}/kafka_${SCALA_VERSION}-${KAFKA_VERSION}.tgz && \
    tar -xzf kafka_${SCALA_VERSION}-${KAFKA_VERSION}.tgz && \
    mv kafka_${SCALA_VERSION}-${KAFKA_VERSION} /opt/kafka && \
    rm kafka_${SCALA_VERSION}-${KAFKA_VERSION}.tgz

# Set environment variables
ENV PATH="/opt/kafka/bin:$PATH"


# Kafka configurations
ENV KAFKA_NODE_ID=1 \
    KAFKA_PROCESS_ROLES=broker,controller \
    KAFKA_LISTENERS=PLAINTEXT://localhost:9092,CONTROLLER://localhost:9093 \
    KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \
    KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER \
    KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT \
    KAFKA_CONTROLLER_QUORUM_VOTERS=1@localhost:9093 \
    KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
    KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=1 \
    KAFKA_TRANSACTION_STATE_LOG_MIN_ISR=1 \
    KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS=0 \
    KAFKA_NUM_PARTITIONS=1

# Create necessary directories
RUN mkdir -p /tmp/kraft-metadata /tmp/kafka-logs

# Copy Kafka properties
COPY server.properties /opt/kafka/config/server.properties

# Initialize Kafka storage
RUN kafka-storage.sh format -t $(uuidgen) -c /opt/kafka/config/server.properties

# Expose necessary ports
EXPOSE 9092 9093 2143

# Healthcheck
HEALTHCHECK --interval=10s --timeout=10s --retries=5 CMD kafka-broker-api-versions.sh --bootstrap-server localhost:9092 > /dev/null 2>&1

 

1. Dockerfile์„ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•ด .env๋ฅผ ์„ ์–ธํ•˜๊ณ  ์›ํ•˜๋Š” ๋ฒ„์ „์„ ๊ฐ€์ ธ์˜จ๋‹ค. 

 

2. server.properties์—์„œ broker, cotroller์— ๋Œ€ํ•ด ์ •์˜ํ•œ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.

 

3. kafka-sever-start.sh ํŒŒ์ผ์„ ์‹คํ–‰ํ•œ๋‹ค. (Docker image ๋‚ด์— ์ ์šฉ)

# Copy Kafka properties
COPY server.properties /opt/kafka/config/server.properties
๋ฐ˜์‘ํ˜•
๋‹คํ–ˆ๋‹ค