Kafka 운영 및 최적화 학습

Kafka를 실무에서 운영할 때는 클러스터 구성, 성능 튜닝, 보안 설정, 모니터링 및 관리 API 활용이 중요합니다.
이제 Kafka를 운영 및 최적화하는 방법을 학습해 보겠습니다.


📌 1. Kafka 클러스터 구성 (Multi-Broker 설정 및 운영)

Kafka는 분산 시스템이므로 여러 개의 Broker를 구성하여 고가용성(HA)을 확보해야 합니다.

더보기

📌 Broker란?

Kafka에서 **Broker(브로커)**는 메시지를 저장하고 관리하는 서버입니다.
Kafka 클러스터는 여러 개의 Broker로 구성될 수 있으며, 각 Broker는 특정 Topic의 Partition을 저장 및 관리합니다.

🔹 Broker의 역할

  • Producer로부터 메시지를 받아서 저장
  • Consumer 요청을 처리하여 메시지를 제공
  • Partition을 관리하고, Replication(복제)을 수행
  • 클러스터 내에서 리더 선출 및 장애 조치(Failover) 기능 수행

🔹 Kafka 클러스터에서 Broker의 역할

Kafka 클러스터는 여러 개의 Broker가 서로 협력하여 메시지를 분산 처리하는 구조입니다.

예를 들어 3개의 Broker가 있는 Kafka 클러스터를 생각해보겠습니다.

Producer → Broker 1 (Partition 0 - Leader)
         → Broker 2 (Partition 1 - Leader)
         → Broker 3 (Partition 2 - Leader)
  • Producer는 데이터를 Broker 1, 2, 3에 분산 저장
  • 각 Partition은 하나의 Leader Broker를 갖고 있으며, 다른 Broker는 복제본(Replica)을 저장
  • Consumer는 Leader Broker로부터 데이터를 읽음

Broker를 여러 개 운영하면 데이터 부하를 분산하여 성능을 높일 수 있습니다.


📌 고가용성(HA, High Availability)이란?

**고가용성(HA, High Availability)**이란 시스템이 장애 없이 지속적으로 운영될 수 있는 능력을 의미합니다.

🔹 Kafka에서 HA(고가용성)를 보장하는 방법

Kafka는 Replication Factor(복제 개수)와 ISR(In-Sync Replicas) 개념을 활용하여 고가용성을 보장합니다.

  1. Replication Factor 설정
    • Replication Factor = 3으로 설정하면 각 메시지가 3개의 Broker에 복제
    • 하나의 Broker가 다운되더라도 다른 Broker가 데이터를 보존하고 장애 복구 가능
  2. ISR(In-Sync Replicas) 활용
    • ISR(동기화된 복제본)이 유지되도록 설정하여 데이터 유실 방지
  3. Failover(장애 조치)
    • 만약 Leader Broker가 다운되면, ISR 중 하나가 새로운 Leader로 자동 승격됨
    • Consumer는 새로운 Leader에서 데이터를 읽어옴

📌 Kafka 고가용성(HA) 예제

  1. 3개의 Broker를 운영하고 Replication Factor를 3으로 설정
bin/kafka-topics.sh --create --topic ha-topic --bootstrap-server localhost:9092 --partitions 3 --replication-factor 3
  1. Leader Broker가 다운되었을 때 새로운 Leader 자동 선출
bin/kafka-leader-election.sh --bootstrap-server localhost:9092 --election-type preferred

Kafka 클러스터를 운영할 때 여러 개의 Broker와 Replication 설정을 활용하면 장애 발생 시에도 데이터 유실 없이 운영 가능합니다. 🚀

🔹 Multi-Broker 설정

Kafka를 3개의 Broker로 구성하려면 각 Broker별로 설정 파일을 수정해야 합니다.

# server-1.properties
broker.id=1
listeners=PLAINTEXT://:9092
log.dirs=/var/lib/kafka/data1
zookeeper.connect=localhost:2181

# server-2.properties
broker.id=2
listeners=PLAINTEXT://:9093
log.dirs=/var/lib/kafka/data2
zookeeper.connect=localhost:2181

# server-3.properties
broker.id=3
listeners=PLAINTEXT://:9094
log.dirs=/var/lib/kafka/data3
zookeeper.connect=localhost:2181

🔹 클러스터 실행

bin/kafka-server-start.sh config/server-1.properties &
bin/kafka-server-start.sh config/server-2.properties &
bin/kafka-server-start.sh config/server-3.properties &

✅ 여러 개의 Broker를 실행하면 Kafka 클러스터가 구성됩니다.


📌 2. Replication & Fault Tolerance (Replication Factor, ISR 개념)

Kafka는 **데이터 복제(Replication)**를 통해 장애 발생 시에도 데이터를 보호합니다.

🔹 Replication Factor란?

  • Replication Factor = 3 → 동일한 메시지가 3개의 Broker에 복제됨
  • 하나의 Broker가 다운되더라도 다른 Broker에서 데이터를 복구 가능

🔹 ISR (In-Sync Replicas) 개념

  • ISR(In-Sync Replicas): 리더와 동기화된 복제본 리스트
  • AR(All Replicas): 모든 복제본 목록
  • ISR이 줄어들면 데이터 손실 위험 증가

🔹 Replication Factor 설정

bin/kafka-topics.sh --create --topic replicated-topic --bootstrap-server localhost:9092 --partitions 3 --replication-factor 3

✅ 3개의 Broker에 대해 3개의 Partition을 만들고, Replication Factor를 3으로 설정


📌 3. Kafka 성능 튜닝 (배치 전송, 압축 설정, Consumer Lag 모니터링)

Kafka 성능을 최적화하려면 배치 전송, 압축 설정, Consumer Lag 모니터링이 중요합니다.

🔹 배치 전송 최적화

batch.size=16384  # 메시지를 배치로 묶어서 전송
linger.ms=10      # 일정 시간 동안 배치를 기다린 후 전송

✅ batch.size를 증가시키면 네트워크 호출을 줄이고 성능 향상

🔹 메시지 압축 (Compression)

compression.type=snappy  # snappy, gzip, lz4 사용 가능

✅ 압축을 사용하면 네트워크 비용 절감 가능

🔹 Consumer Lag 모니터링

  • Consumer Lag: Consumer가 Producer보다 늦게 메시지를 소비하는 정도
  • Lag이 크면 지연 발생
  • 확인 방법:
bin/kafka-consumer-groups.sh --describe --group my-group --bootstrap-server localhost:9092

📌 4. Security 설정 (SASL, TLS, ACL 적용)

Kafka는 기본적으로 보안이 설정되어 있지 않으므로 SASL, TLS, ACL을 적용해야 합니다.

🔹 1) TLS 설정 (데이터 암호화)

TLS를 활성화하려면 server.properties 수정

ssl.keystore.location=/etc/kafka/kafka.keystore.jks
ssl.keystore.password=mypassword
ssl.truststore.location=/etc/kafka/kafka.truststore.jks
ssl.truststore.password=mypassword

✅ TLS를 설정하면 Kafka 메시지가 암호화되어 안전한 통신 가능

🔹 2) SASL 설정 (사용자 인증)

security.inter.broker.protocol=SASL_SSL
sasl.mechanism.inter.broker.protocol=PLAIN

✅ SASL을 사용하면 사용자 인증을 추가하여 보안 강화

🔹 3) ACL 설정 (권한 관리)

bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:admin --operation Read --topic test-topic

✅ 특정 사용자가 특정 Topic에 접근할 수 있도록 ACL 적용


📌 5. Kafka Metrics & Monitoring (Prometheus, Grafana 활용)

Kafka 운영에서는 메트릭을 수집하고 시각화하는 것이 필수적입니다.

🔹 1) Prometheus + Grafana 모니터링

Kafka에서 JMX Exporter를 사용하여 Prometheus로 메트릭을 전송할 수 있습니다.

# JMX Exporter 실행
java -javaagent:/opt/jmx_exporter/jmx_prometheus_javaagent-0.16.1.jar=7071:/opt/jmx_exporter/kafka-config.yml -jar kafka_2.13-3.6.0/libs/kafka.jar

✅ JMX Exporter를 사용하면 Kafka 메트릭을 Prometheus로 전송

🔹 2) Kafka Manager (웹 UI 관리)

docker run -d -p 9000:9000 sheepkiller/kafka-manager

✅ http://localhost:9000 에서 Kafka 클러스터 상태를 확인 가능


📌 6. Kafka Admin API 활용 (클러스터 상태 점검 및 동적 설정 변경)

Kafka Admin API를 사용하면 Topic, Broker 설정을 동적으로 관리할 수 있습니다.

🔹 1) Kafka Admin Client를 활용한 Topic 생성

AdminClient adminClient = AdminClient.create(props);
NewTopic newTopic = new NewTopic("new-topic", 3, (short) 3);
adminClient.createTopics(Collections.singleton(newTopic));

코드를 통해 Kafka 토픽을 동적으로 생성 가능

🔹 2) Topic 정보 조회

DescribeTopicsResult result = adminClient.describeTopics(Collections.singleton("test-topic"));

✅ 특정 Topic의 메타데이터를 조회

🔹 3) Broker 설정 변경

ConfigResource configResource = new ConfigResource(ConfigResource.Type.BROKER, "1");
ConfigEntry configEntry = new ConfigEntry("log.retention.hours", "48");
Map<ConfigResource, Collection<ConfigEntry>> updateConfig = Collections.singletonMap(configResource, Collections.singleton(configEntry));
adminClient.alterConfigs(updateConfig);

Broker 설정을 동적으로 변경 가능


✅ 정리

학습 주제 설명
Kafka 클러스터 구성 Multi-broker 설정 및 운영
Replication & Fault Tolerance Replication Factor, ISR 개념
Kafka 성능 튜닝 배치 전송, 압축 설정, Consumer Lag 모니터링
Security 설정 SASL, TLS, ACL 적용
Kafka Metrics & Monitoring Prometheus, Grafana를 이용한 모니터링
Kafka Admin API 활용 클러스터 상태 점검 및 동적 설정 변경

 

Kafka를 실무에서 운영하기 위해 클러스터 설정, 보안 강화, 성능 최적화, 모니터링 및 관리 API 활용을 학습해야 합니다.
이제 Kafka를 대규모 트래픽 환경에서도 안정적으로 운영할 준비가 되었습니다! 🚀

'kafka' 카테고리의 다른 글

[Kafka] Kafka 고급 활용 학습  (0) 2025.02.03
[Kafka] Kafka 개념 및 기초 학습  (0) 2025.02.03
[Kafka] 학습 로드맵  (0) 2025.02.03

+ Recent posts