728x90
도커 환경에서 카프카와 주키퍼
도커 환경에서 카프카와 주키퍼 구축시에 사용할 이미지를 먼저 선택해야한다.
도커 명령어를 통해 주키퍼와 카프카에 관련된 이미지를 검색한 결과,
주키퍼는 공식 이미지가 있지만, 카프카는 공식 이미지가 없음을 확인 할 수 있다.
카프카 이미지 특징
1. dockerkafka/kafka
- Docker hub 바로가기
- kafka외에도 zookeeper, kafka-manager 솔루션 제공
- 데이터 플랫폼 최강자 책 참고 가능. (2페이지정도 분량이긴 하지만..)
- 4년전에 업데이트 되어, 최신 docker-compose version은 참고가 어려움.
2. bitnami/kafka
- Docker hub 바로가기
- bitnami 회사에서 지원
- kafka, zookeeper도 한꺼번에 사용가능.
- 최신 릴리즈 빠르게 적용
- 레퍼런스 풍부
- 하지만 커스텀화 하게 되면 상업용 버전을... 점점 권유하는 것 같은 느낌을 받는다..
3. confluentinc/kafka ***
- Confluent Document 바로가기
- kafka를 만든 회사에서 docker에서 사용하는 방법 직접 가이드함.
- docker-compose 활용 레퍼런스 바로 가기
- 개인적으로 zookeeper는 official 이미지를 사용하고, kafka는 따로 confluentinc/cp-kafka를 사용하는 것을 추천
- 이렇게 사용할때, 버전에 주의해야한다..!
- 필자는 zookeeper:3.5.0 과 confluentinc/cp-kafka:5.5.0 을 함께 사용하려고 했을때 서로 연동하는데 에러가 발생하였다. (정확한 원인은 모르겠다.. 라이브러리를 가져다가 쓰는 입장이기에..)
- 그래서 zookeeper:3.4.9, confluentinc/cp-kafka:5.5.0 이렇게 사용하고 있다.
- 참고 : [DataSicence/Kafka] - [kafka] multi-node zookeeper & kafka docker-compose.yml file
wurstmeister/zookeeper, wurstmeister/kafka 등 비공식적인 카프카 이미지가 다양하게 존재한다.
본격적으로 하는건 confluentinc (유료/보안) / 가볍게 하는건 wurstmeister 많이들 선택 하는것 같다.
도커 컴포즈를 이용하여 Single Broker 구성하기
Docker-compose.yml
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
hostname: zookeeper
container_name: zookeeper-1
volumes:
- 마운트할경로:/opt/zookeeper/conf/
- 마운트할경로:/opt/zookeeper/logs
ports:
- 2181:2181
networks:
- log-network
kafka-1:
image: wurstmeister/kafka
hostname: kafka-1
depends_on:
- zookeeper
container_name: kafka-1
volumes:
- 마운트할경로/:/opt/kafka/config/
- 마운트할경로:/opt/kafka/logs
environment:
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: INTERNAL://:19092,EXTERNAL://:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-1:19092,EXTERNAL://kafka-1:9092
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
networks:
- log-network
kafka-2:
image: wurstmeister/kafka
hostname: kafka-2
depends_on:
- zookeeper
container_name: kafka-2
volumes:
- 마운트할경로:/opt/kafka/config/
- 마운트할경로:/opt/kafka/logs
environment:
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: INTERNAL://:29092,EXTERNAL://:9093
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-2:29092,EXTERNAL://kafka-2:9093
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
networks:
- log-network
kafka-3:
image: wurstmeister/kafka
hostname: kafka-3
depends_on:
- zookeeper
container_name: kafka-3
volumes:
- 마운트할경로:/opt/kafka/config/
- 마운트할경로:/opt/kafka/logs
environment:
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: INTERNAL://:39092,EXTERNAL://:9094
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-3:39092,EXTERNAL://kafka-3:9094
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
networks:
- log-network
cmak:
image: hlebalbau/kafka-manager:stable
restart: always
depends_on:
- kafka-1
- kafka-2
- kafka-3
- zookeeper
ports:
- 9000:9000
environment:
- "-Dcmak.zkhosts=zookeeper:2181"
- "-DbasicAuthentication.enabled=true"
- "-DbasicAuthentication.username=admin"
- "-DbasicAuthentication.password=password"
networks:
- log-network
networks:
log-network:
name: log-network
driver: bridge
Zookeeper 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 environment 옵션
- 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:
- 카프카 그룹이 초기 리밸런싱할때 컨슈머들이 컨슈머 그룹에 조인할때 대기 시간이다.
CMAK ( Kafka Manager )
Kafka Manager는 yahoo에서 제작한 GUI 기반 카프카 관리 도구로, 웹 환경에서 클러스터, 토픽 등의 생성 및 변경, consumer group 확인 등의 작업을 웹 환경에서 확인하고 진행할 수 있다. 사실 CLI 환경에서도 Kafka를 관리할 수 있으나 편의적인 측면에서 많은 기업들이 kafka-manager 를 도입하여 운용중이다.
💡 주요기능
a) Kafka Cluster 관리(모니터링)
b) Consumer Lag 관리(모니터링)
c) 파티션 Rebalance: 파티션 추가
d) 토픽 관리: 리스트 조회, 생성&삭제
+Details: https://github.com/yahoo/CMAK#deployment
docker-compose up -d
728x90
'개-발 > Infra' 카테고리의 다른 글
[NCP] Ncp kafka VM 생성 (0) | 2023.06.12 |
---|---|
[Kafka] 카프카 Console 명령어 (0) | 2023.06.08 |
[Kafka] Kafka 란 ? (0) | 2023.06.07 |
[Kafka] Zookeeper 란? (1) | 2023.06.07 |
[Elastic] 한글형태소 분석기 (nori 설치) (2) | 2023.06.03 |