Confluent Kafka 설치

도커 컴포즈(Docker Compose)를 이용해 kafka를 설치해본다. 도커 컴포즈(Docker Compose)는 단일 yaml 파일에 다수의 Docker Container를 기술하고, 단 한번의 명령어로 기술된 Container들을 모두 시작, 종료 시킬수 있는 Tool이다. 하나의 서버에 여러개의 서비스 인스턴스가 필요한 경우, 예를 들어 비즈니스 서비스와 모니터링 에이전트를 같이 띄워야 하는 경우에 사용한다.

$ docker compose up # 시작
$ docker compose down  # 종료
1. docker container 실행

zookeeper 노드 3개, kafka 노드 3개로 구성했다.

$ docker compose -f <yaml 파일> up
version: '3' # yaml 파일 버전

services: # services 하위에 여러개의 container 등록
  zookeeper-1:
    hostname: zookeeper1
    image: confluentinc/cp-zookeeper:6.2.0
    environment:
      ZOOKEEPER_SERVER_ID: 1  # zookeeper의 myID
      ZOOKEEPER_CLIENT_PORT: 12181
      ZOOKEEPER_DATA_DIR: /zookeeper/data
      ZOOKEEPER_SERVERS: zookeeper1:22888:23888;zookeeper2:32888:33888;zookeeper3:42888:43888 # 22888: zookeeper 앙상블간 통신, 23888은 redirection할 때 사용
    ports:  # host computer port:container port
      - 12181:12181
      - 22888:22888
      - 23888:23888
    volumes: # host directory:container directory 바인드
      - ./zookeeper/data/1:/zookeeper/data

  zookeeper-2:
    hostname: zookeeper2
    image: confluentinc/cp-zookeeper:6.2.0
    environment:
      ZOOKEEPER_SERVER_ID: 2
      ZOOKEEPER_CLIENT_PORT: 22181
      ZOOKEEPER_DATA_DIR: /zookeeper/data
      ZOOKEEPER_SERVERS: zookeeper1:22888:23888;zookeeper2:32888:33888;zookeeper3:42888:43888
    ports:
      - 22181:22181
      - 32888:32888
      - 33888:33888
    volumes:
      - ./zookeeper/data/2:/zookeeper/data

  zookeeper-3:
    hostname: zookeeper3
    image: confluentinc/cp-zookeeper:6.2.0
    environment:
      ZOOKEEPER_SERVER_ID: 3
      ZOOKEEPER_CLIENT_PORT: 32181
      ZOOKEEPER_DATA_DIR: /zookeeper/data
      ZOOKEEPER_SERVERS: zookeeper1:22888:23888;zookeeper2:32888:33888;zookeeper3:42888:43888
    ports:
      - 32181:32181
      - 42888:42888
      - 43888:43888
    volumes:
      - ./zookeeper/data/3:/zookeeper/data

  kafka-1:
    image: confluentinc/cp-kafka:6.2.0
    hostname: kafka1
    depends_on: # container간 의존성 설정
      - zookeeper-1
      - zookeeper-2
      - zookeeper-3
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper1:12181,zookeeper2:22181,zookeeper3:32181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:19092
      KAFKA_LOG_DIRS: /kafka
    ports:
      - 19092:19092
    volumes:
      - ./kafka/logs/1:/kafka

  kafka-2:
    image: confluentinc/cp-kafka:6.2.0
    hostname: kafka2
    depends_on:
      - zookeeper-1
      - zookeeper-2
      - zookeeper-3
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ZOOKEEPER_CONNECT: zookeeper1:12181,zookeeper2:22181,zookeeper3:32181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka2:29092
      KAFKA_LOG_DIRS: /kafka
    ports:
      - 29092:29092
    volumes:
      - ./kafka/logs/2:/kafka

  kafka-3:
    image: confluentinc/cp-kafka:6.2.0
    hostname: kafka3
    depends_on:
      - zookeeper-1
      - zookeeper-2
      - zookeeper-3
    environment:
      KAFKA_BROKER_ID: 3
      KAFKA_ZOOKEEPER_CONNECT: zookeeper1:12181,zookeeper2:22181,zookeeper3:32181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka3:39092
      KAFKA_LOG_DIRS: /kafka
    ports:
      - 39092:39092
    volumes:
      - ./kafka/logs/3:/kafka

image

2. Confluent Kafka 다운로드

https://www.confluent.io/installation/ 에서 community version의 tar를 다운받아 압축을 풀어준다. bin 파일을 보면 스크립트 파일들이 있다.

image

3. 토픽 만들어보기
$ bin/kafka-topics --bootstrap-server localhost:19092 --create --topic mytopic --partitions 2 --replication-factor 3

image

4. producer, consumer 구동
$ bin/kafka-console-producer --bootstrap-server localhost:19092 --topic mytopic 
$ bin/kafka-console-consumer --bootstrap-server localhost:19092 --topic mytopic 

이제 만들었던 토픽에대해 describe를 해보자.

$ bin/kafka-topics --describe --bootstrap-server localhost:19092 --topic mytopic

image

partition은 늘리는 것은 가능하지만 줄이는것은 불가능하다. replica는 partition에 대한 replica이기 때문에 partition0에 대한 replica 3개, partition1에 대한 replica 3개로 구성된다. Isr은 leader와 follwer의 모임이다. partition0의 읽기 쓰기는 모두 leader인 1이 담당하게 된다. follwer들은 leader의 메세지를 sync 하는데만 집중한다. leader는 follwer들이 sync를 잘 하고 있는지 확인하면서 sync를 하지 못하는 follwer는 ISR에서 제외시킨다.

이번에는 kafka 2를 한번 죽여서 어떤 현상이 일어나는지 확인해보자.

$ docker kill -s=SGIKILL <container ID>
$ bin/kafka-topics --describe --bootstrap-server localhost:19092 --topic mytopic

image

ISR에서 2번이 빠진것을 볼수있다.