본문 바로가기
Kafka

[Kafka] docker compose 로 kafka 띄우기

by yonikim 2024. 1. 8.
728x90

 

docker compose 를 이용하여 kafka 로컬 환경 세팅을 쉽게 할 수 있다.

kafka 와 영혼의 단짝인 zookeeper, 추가로 kafka 운영 모니터링 툴 중 하나인 akhq 까지 해서 총 3개의 서비스를 띄워볼 것이다. 

 


 

Kafka 와 Zookeeper 란?


Kafka 와 Zookeeper 는 대규모 분산 시스템에서 메시지 브로커 및 분산 데이터 저장소를 구축하는데 사용되는 두가지 주요 서비스이다. 

 

Kafka

1. 역할 

  • kafka 는 분산 데이터 스트리밍 플랫폼으로, 대용량의 실시간 데이터를 효과적으로 처리하고 저장할 수 있다. 
  • 고성능, 내결함성, 확장성을 갖춘 메시지 브로커 역할을 수행한다.
  • 데이터 생산자(Producer) 와 데이터 소비자(Consumer) 간의 효율적인 메시지 전달을 지원하며, 메시지는 토픽과 파티션에 저장된다. 
  • Kafka 에 좀더 자세히 알고 싶다면? https://yonikim.tistory.com/143

2. Zookeeper 와의 관계 

  • kafka 는 zookeeper 를 통해 브로커의 메타데이터를 관리하고, 리더와 팔로워 간의 분산된 메시지 처리를 조율한다. 
  • kafka 의 브로커들은 zookeeper 에 자신의 상태 정보를 저장하고, 이 정보를 통해 클러스터의 안정성과 가용성을 유지한다.

 Zookeeper 

1. 역할 

  • zookeeper 는 분산 응용 프로그램을 위한 좌표 서비스 및 구성 관리 시스템이다. 
  • 분산 시스템에서 일관성과 동기화를 관리하고, 서버의 동적 구성 변경 및 리더 선출과 같은 작업을 담당한다.
  • kafka 와 같은 분산 시스템에서 zookeeper 는 주키퍼 앙상블을 통해 안정적인 쿼럼을 형성하여 중요한 메타데이터 및 상태를 저장한다.

2. Kafka 에서의 역할

  • kafka 는 자신의 상태 정보를 zookeeper 에 저장하고, 리더와 팔로워의 브로커를 선출하는데 zookeeper 를 사용한다.
  • kafka 의 토픽, 파티션, 오프셋, 컨슈머 그룹 등의 메타데이터를 저장하고 관리한다. 

 

 

Akhq 란?


Akhq(A Kafka GUI for Apache Kafka) 는 kafka 를 위한 오픈 소스 웹 기반 관리 도구이다. kafka 클러스터를 모니터링하고 관리하는데 도움을 주며, kafka 토픽, 컨슈머 그룹, 메시지 브로커 등을 시각적으로 관리할 수 있는 사용자 친화적인 인터페이스를 제공한다.

 

akhq 의 주요 특징은 아래와 같다.

 

1. 웹 기반 인터페이스: akhq 는 웹 브라우저에서 실행되며, 사용자가 편리하게 kafka 클러스터를 모니터링하고 관리할 수 있도록 도와준다.

2. 토픽 및 컨슈머 그룹 관리: 토픽 생성, 토픽의 파티션 및 오프셋 관리, 컨슈머 그룹의 소비자 목록과 오프셋 확인 등을 수행할 수 있다.

3. 리더 및 파티션 상태 확인: kafka 브로커의 상태, 토픽의 파티션 정보, 각 파티션의 리더와 팔로워 정보를 시각화하여 확인할 수 있다.

4. 메시지 검색 및 전송: 특정 토픽의 메시지를 검색하고, 원하는 토픽으로 메시지를 전송할 수 있는 기능을 제공한다.

5. ACL(액세스 제어 목록) 관리: kafka 의 액세스 제어를 관리하고 설정할 수 있다.

6. 스키마 레지스트리 지원: Avro 또는 다른 스키마 형식을 사용하는 메시지의 스키마 관리를 지원한다.

7. 사용자 관리: 다양한 사용자 및 권한을 관리할 수 있다.  

 

 


 

 

사전 준비사항 


Docker 설치: https://yonikim.tistory.com/19

 

 

Docker compose 설정파일 작성 


▷ docker-compose-kafka.yml 

version: "3"
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    ports:
      - 22181:2181
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
      ZOOKEEPER_INIT_LIMIT: 5
      ZOOKEEPER_SYNC_LIMIT: 2

  kafka:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    ports:
      - 29092:29092
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

  akhq:
    image: tchiotludo/akhq
    environment:
      AKHQ_CONFIGURATION: |
        akhq:
          connections:
            local:
              properties:
                bootstrap.servers: "kafka:9092"
    ports:
      - 8080:8080
    links:
      - kafka

 

Zookeeper 환경변수 설정

  • ZOOKEEPER_CLIENT_PORT
    • zookeeper의 포트를 지정한다.
    • 컨테이너 내부에서 2181 포트로 실행된다. (Default)
  • ZOOKEEPER_TICK_TIME
    • zookeeper가 클러스터를 구성할 때 동기화를 위한 기본 틱 시간을 지정한다.
    • millisecond 로 지정할 수 있으며, 2000 으로 설정한 경우 2초가 된다. (Default)
  • ZOOKEEPER_INIT_LIMIT
    • 초기화를 위한 제한 시간을 설정한다. 
    • 주키퍼 클러스터는 쿼럼이라는 과정을 통해서 마스터를 선출하게 된다. 이때 주키퍼들이 리더에게 커넥션을 맺을 때 지정할 초기 타임아웃 시간이다.
    • 타임아웃 시간은 이전에 지정한 ZOOKEEPER_TICK_TIME 단위로 설정된다.
    • 타임아웃 시간은 ZOOKEEPER_TICK_TIME * ZOOKEEPER_INIT_LIMIT = 2000 * 5 = 10,000 (10초) 가 된다.
    • 이 옵션은 멀티 브로커에서 유효한 속성이다. 
  • ZOOKEEPER_SYNC_LIMIT
    • zookeeper 리더와 나머지 서버들의 싱크 제한 시간이다. 
    • 해당 시간 내에 싱크 응답이 오는 경우 클러스터가 정상적으로 구석되어 있음을 알 수 있다.
    • 싱크 시간은 ZOOKEEPER_TRICK_TIME * ZOOKEEPER_SYNC_LIMIT = 2000 * 2 = 4000 (4초) 가 된다.

 

Kafka 환경변수 설정

  • KAFKA_BROKER_ID
    • kafka 브로커 아이디를 지정한다. 유니크한 값이어야 하며, 단일 브로커에선 없어도 무방하다.
  • KAFKA_ZOOKEEPER_CONNECT
    • kafka 가 연결될 zookeeper 를 지정한다.
  • KAFKA_ADVERTISED_LISTENERS
    • 외부에서 접속하기 위한 리스너 설정을 해준다.
  • KAFKA_LISTENER_SECURITY_PROTOCOL_MAP
    • 보안을 위한 프로토콜 매핑을 해준다. 이 값은 KAFKA_ADVERTISED_LISTENERS 와 함께 key-value 로 지정한다.
  • KAFKA_INTER_BROKER_LISTENER_NAME
    • 도커 내부에서 사용할 리스너 이름을 지정한다.
  • KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR
    • 싱글 브로커인 경우에 지정한다. 멀티 브로커는 기본값을 사용하므로 해당 설정이 필요없다.

 

Akhq 환경변수 설정

  • AKHQ_CONFIGURATION
    • 여러개의 kafka 클러스터를 관리할 수 있다. 
version: "3"
services:
  akhq:
    image: tchiotludo/akhq
    environment:
      AKHQ_CONFIGURATION: |
        akhq:
          connections:
            kafka_sasl:
              properties:
                bootstrap.servers: "${KAFKA_HOST_SASL}"
                security.protocol: SASL_SSL
                sasl.mechanism: SCRAM-SHA-512
                sasl.jaas.config: org.apache.kafka.common.security.scram.ScramLoginModule required username="${USERNAME}" password="${PASSWORD}";
            kafka_ssl:
              properties:
                bootstrap.servers: "${KAFKA_HOST_SSL}"
                security.protocol: SSL
            local:
              properties:
                bootstrap.servers: "kafka:9092"
    ports:
      - 8080:8080
    links:
      - kafka

 

 

Docker compose 실행하기


$ docker compose -f docker-compose-kafka.yml up -d

 

 


 

Docker Desktop 애플리케이션을 확인해보면, 아래 이미지와 같이 3개의 서비스가 띄워져 있는 걸 확인할 수 있다.

 

 

Akhq 에는 localhost:8080 를 통해 접근할 수 있다.

3개의 kafka 클러스터를 확인할 수 있다.

728x90

'Kafka' 카테고리의 다른 글

[Kafka] 카프카란 무엇인가  (1) 2023.12.07