반응형
Recent Posts
Recent Comments
관리 메뉴

개발잡부

[kafka] docker compose kafka 본문

Kafka

[kafka] docker compose kafka

닉의네임 2022. 10. 22. 14:23
반응형

version 확인

(base) ➜  kafka docker compose version
Docker Compose version v2.2.3

 

version: '3.6'

services:
  zookeeper1:
    container_name: zookeeper1
    image: wurstmeister/zookeeper:3.4.6
    volumes:
      - "./zookeeper/data:/data"
      - "./zookeeper/logs:/datalog"
    ports:
      - "12181:2181"
  zookeeper2:
    container_name: zookeeper2
    image: wurstmeister/zookeeper:3.4.6
    volumes:
      - "./zookeeper/data:/data"
      - "./zookeeper/logs:/datalog"
    ports:
      - "22181:2181"
  zookeeper3:
    container_name: zookeeper3
    image: wurstmeister/zookeeper:3.4.6
    volumes:
      - "./zookeeper/data:/data"
      - "./zookeeper/logs:/datalog"
    ports:
      - "32181:2181"
  kafka1:
    container_name: kafka1
    image: wurstmeister/kafka:2.12-2.3.0
    restart: on-failure
    ports:
      - "9095:9092"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper1:2181,zookeeper2:2181,zookeeper3:2181
      JMX_PORT: 9093
      KAFKA_JMX_OPTS: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=${EXPOSED_HOSTNAME} -Dcom.sun.management.jmxremote.rmi.port=9093
      KAFKA_ADVERTISED_HOST_NAME: ${EXPOSED_HOSTNAME}1
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://${EXPOSED_HOSTNAME}1:9095
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2
    depends_on:
      - zookeeper1
      - zookeeper2
      - zookeeper3
  kafka2:
    container_name: kafka2
    image: wurstmeister/kafka:2.12-2.3.0
    restart: on-failure
    ports:
      - "9096:9092"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ZOOKEEPER_CONNECT: zookeeper1:2181,zookeeper2:2181,zookeeper3:2181
      JMX_PORT: 9093
      KAFKA_JMX_OPTS: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=${EXPOSED_HOSTNAME} -Dcom.sun.management.jmxremote.rmi.port=9093
      KAFKA_ADVERTISED_HOST_NAME: ${EXPOSED_HOSTNAME}2
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://${EXPOSED_HOSTNAME}2:9096
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2
    depends_on:
      - zookeeper1
      - zookeeper2
      - zookeeper3
  kafka3:
    container_name: kafka3
    image: wurstmeister/kafka:2.12-2.3.0
    restart: on-failure
    ports:
      - "9097:9092"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      KAFKA_BROKER_ID: 3
      KAFKA_ZOOKEEPER_CONNECT: zookeeper1:2181,zookeeper2:2181,zookeeper3:2181
      JMX_PORT: 9093
      KAFKA_JMX_OPTS: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=${EXPOSED_HOSTNAME} -Dcom.sun.management.jmxremote.rmi.port=9093
      KAFKA_ADVERTISED_HOST_NAME: ${EXPOSED_HOSTNAME}3
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://${EXPOSED_HOSTNAME}3:9097
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2
    depends_on:
      - zookeeper1
      - zookeeper2
      - zookeeper3

  kafka-manager:
    container_name: kafka-manager
    image: hlebalbau/kafka-manager:2.0.0.2
    restart: on-failure
    depends_on:
      - kafka1
      - kafka2
      - kafka3
      - zookeeper1
      - zookeeper2
      - zookeeper3
    environment:
      ZK_HOSTS: zookeeper1:2181
      APPLICATION_SECRET: "random-secret"
      KM_ARGS: -Djava.net.preferIPv4Stack=true
    ports:
      - "9000:9000"

  • version:
    • docker-compose 버젼을 지정한다. 
  • services:
    • docker-compose의 경우 docker 컨테이너로 수행될 서비스들은 services 하위에 기술한다.
  • zookeeper:
    • 서비스 이름을 zookeeper 로 작성했다.
    • service 하위에 작성하면 서비스 이름으로 동작한다.
  • image:
    • 우리는 여기서 confluentinc/cp-zookeeper:latest 를 이용할 것이다.
    • 참고로 실전에서 사용하려면 latest 라는 태그를 사용하지 말고, 정확히 원하는 버젼을 기술해서 사용하길 추천한다.
    • latest라고 태그를 지정하면, 매번 컨테이너를 실행할때마다 최신버젼을 다운받아 실행하므로 변경된 버젼으로 인해 원하지 않는 결과를 볼 수 있다. (주의 !!!)
  • environment:
    • confluentinc 는 몇가지 환경 변수를 설정할 수 있다.
    • environment 하위에 필요한 환경을 작성하자.
  • ZOOKEEPER_SERVER_ID:
    • zookeeper 클러스터에서 유일하게 주키퍼를 식별할 아이디이다.
    • 동일 클러스터 내에서 이 값은 중복되면 안된다. 단일 브로커이기 때문에 이 값은 의미가 없다.
  • ZOOKEEPER_CLIENT_PORT:
    • zookeeper_client_port를 지정한다. 여기서는 기본 주키퍼의 포트인 2181로 지정한다.
    • 즉 컨테이너 내부에서 주키퍼는 2181로 실행된다.
  • ZOOKEEPER_TICK_TIME:
    • zookeeper이 클러스터를 구성할때 동기화를 위한 기본 틱 타임을 지정한다.
    • millisecond로 지정할 수 있으며 여기서는 2000으로 설정했으니 2초가 된다.
  • ZOOKEEPER_INIT_LIMIT:
    • 주키퍼 초기화를 위한 제한 시간을 설정한다.
    • 주키퍼 클러스터는 쿼럼이라는 과정을 통해서 마스터를 선출하게 된다. 이때 주키퍼들이 리더에게 커넥션을 맺을때 지정할 초기 타임아웃 시간이다.
    • 타임아웃 시간은 이전에 지정한 ZOOKEEPER_TICK_TIME 단위로 설정된다.
    • 우리는 ZOOKEEPER_TICK_TIME을 2000으로 지정했고, ZOOKEEPER_INIT_LIMIT을 5로 잡았으므로 2000 * 5 = 10000 밀리세컨이 된다. 즉, 10초가 된다.
    • 이 옵션은 멀티 브로커에서 유효한 속성이다.
  • ZOOKEEPER_SYNC_LIMIT:
    • 이 시간은 주키퍼 리더와 나머지 서버들의 싱크 타임이다.
    • 이 시간내 싱크응답이 들어오는 경우 클러스터가 정상으로 구성되어 있늠을 확인하는 시간이다.
    • 여기서 2로 잡았으므로 2000 * 2 = 4000 으로 4초가 된다.
    • 이 옵션은 멀티 브로커에서 유효한 속성이다.
  • kafka
    • kafka 브로커 이름을 지정한다.
  • image:
    • kafka 브로커는 confluentinc/cp-kafka:latest 를 이용하였다.
    • 역시 태그는 latest보다는 지정된 버젼을 사용하는것을 추천한다.
  • depends_on:
    • docker-compose 에서는 서비스들의 우선순위를 지정해 주기 위해서 depends_on 을 이용한다.
    • zookeeper 라고 지정하였으므로, kafka는 zookeeper이 먼저 실행되어 있어야 컨테이너가 올라오게 된다.
  • ports:
    • kafka 브로커의 포트를 의미한다.
    • 외부포트:컨테이너내부포트 형식으로 지정한다.
  • environment:
    • kafka 브로커를 위한 환경 변수를 지정한다.
  • KAFKA_BROKER_ID:
    • kafka 브로커 아이디를 지정한다. 유니크해야하며 지금 예제는 단일 브로커기 때문에 없어도 무방하다.
  • KAFKA_ZOOKEEPER_CONNECT:
    • kafka가 zookeeper에 커넥션하기 위한 대상을 지정한다.
    • 여기서는 zookeeper(서비스이름):2181(컨테이너내부포트) 로 대상을 지정했다.
  • KAFKA_ADVERTISED_LISTENERS:
    • 외부에서 접속하기 위한 리스너 설정을 한다.
  • KAFKA_LISTENER_SECURITY_PROTOCOL_MAP:
    • 보안을 위한 프로토콜 매핑이디. 이 설정값은 KAFKA_ADVERTISED_LISTENERS 과 함께 key/value로 매핑된다.
  • KAFKA_INTER_BROKER_LISTENER_NAME:
    • 도커 내부에서 사용할 리스너 이름을 지정한다.
    • 이전에 매핑된 PLAINTEXT가 사용되었다.
  • KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR:
    • single 브로커인경우에 지정하여 1로 설정했다.
    • 멀티 브로커는 기본값을 사용하므로 이 설정이 필요 없다.
  • KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS:
    • 카프카 그룹이 초기 리밸런싱할때 컨슈머들이 컨슈머 그룹에 조인할때 대기 시간이다.
반응형
Comments