507 words
3 minutes
[kafka]09. DR Hands-on

01. 사전 지식#

02. 개요#

카프카 클러스터에서 장애를 유발하고, 설계 방식에 따른 동작을 관측한다.

03. 사전 준비#

  • Kafka Cluster : 3개의 브로커로 구성된 클러스터. docker 혹은 k8s로 구성
  • Kafka Client : 1개의 클라이언트로 구성
  • Kafka Topic : 테스트용 topic이 간단히 생성.
  • (Optional) : Kafka Admain Client

04. 장애 유발 시나리오#

장애의 구분#

장애는 이 글에서는 크게 두 가지로 구분한다.

동시성 시나리오 : gettting

장에 단계에 따른 구분#

  • 원천 어플리케이션
  • 프로듀서
  • 브로커
  • 컨슈머

장에 유형에 따른 구분#

  • 네트워크 장애
  • 서버 장애
  • 연결 장애

테스트 Tool#

카프카에서 지원하는 trougdor라는 Fault Injection Tool을 사용해 장애 상황을 유도하고 동작을 관측한다.

Trougdor 제공 Fault Injection API#

  • NetworkPartitionFaultSpec
  • ProcessStopFaultSpec

테스트 시나리오#

    1. replication factor 3, min.insync.replicas 2로 설정한 토픽 에서 발생한 장애 (기본설정)
    1. replication factor 3, min.insync.replicas 3로 설정한 토픽 에서 발생한 장애 (정합성 보장 시나리오)
    1. replication factor 3, min.insync.replicas 1로 설정한 토픽 에서 발생한 장애 (가용성 보장 시나리오)

90 실습용 docker-compose#

# service config
services:
kafka-broker-01:
# image: bitnami/kafka:3.8.1 # get from .env file
build:
context: .
dockerfile: Dockerfile # install vim
privileged: true
cap_add:
- NET_ADMIN
restart: unless-stopped
container_name: kafka-broker-01
hostname: kafka-broker-01
ports:
- "10000:9094" # port binding
environment: # set env
- KAFKA_CFG_BROKER_ID=0
- KAFKA_CFG_NODE_ID=0
- KAFKA_KRAFT_CLUSTER_ID=6bcA_X9JR0eN9YhP3dYKnw
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka-broker-01:9093,1@kafka-broker-02:9093,2@kafka-broker-03:9093
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka-broker-01:9092,EXTERNAL://127.0.0.1:10000
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2
- KAFKA_CFG_PROCESS_ROLES=controller,broker
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
networks:
- data-network
volumes:
- "data-volume-01:/bitnami/kafka"
kafka-broker-02:
build:
context: .
dockerfile: Dockerfile
privileged: true
cap_add:
- NET_ADMIN
restart: always
container_name: kafka-broker-02
hostname: kafka-broker-02
ports:
- "10001:9094"
environment:
- KAFKA_CFG_BROKER_ID=1
- KAFKA_CFG_NODE_ID=1
- KAFKA_KRAFT_CLUSTER_ID=6bcA_X9JR0eN9YhP3dYKnw
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka-broker-01:9093,1@kafka-broker-02:9093,2@kafka-broker-03:9093
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka-broker-02:9092,EXTERNAL://127.0.0.1:10001
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2
- KAFKA_CFG_PROCESS_ROLES=controller,broker
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
networks:
- data-network
volumes:
- "data-volume-02:/bitnami/kafka"
kafka-broker-03:
build:
context: .
dockerfile: Dockerfile
privileged: true
cap_add:
- NET_ADMIN
restart: always
container_name: kafka-broker-03
hostname: kafka-broker-03
ports:
- "10002:9094"
environment:
- KAFKA_CFG_BROKER_ID=2
- KAFKA_CFG_NODE_ID=2
- KAFKA_KRAFT_CLUSTER_ID=6bcA_X9JR0eN9YhP3dYKnw
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka-broker-01:9093,1@kafka-broker-02:9093,2@kafka-broker-03:9093
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka-broker-03:9092,EXTERNAL://127.0.0.1:10002
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2
- KAFKA_CFG_PROCESS_ROLES=controller,broker
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
networks:
- data-network
volumes:
- "data-volume-03:/bitnami/kafka"

Reference#

[kafka]09. DR Hands-on
https://yjinheon.netlify.app/posts/02de/kafka/de-kafka-09_dr_handson/
Author
Datamind
Published at
2025-01-05
License
CC BY-NC-SA 4.0