kafka 관련 포스팅을 하기 이전 kafka cluster(카프카 클러스터) 를 구축 하여에 실습환경을 구성해보도록 하겠습니다.
컨테이너(container) 환경에서 실습환경은 진행됩니다.
가상화 기술과 Docker, 대량의 Container를 효율적으로 띄우고 관리하기 위해 나온 Docker Compose, Container 오케스트레이션을 위한 Kubernates등에 대해서는 추후 자세히 포스팅하겠습니다.
kafka cluster(카프카 클러스터) 구축
container 환경에서 1~3대의 zookeeper 와 1~3대의 kafka를 만들어 실습환경을 구성해 보도록 하겠습니다.
Docker-Desktop설치 후
container를 여러 대 띄우는데 활용하기 유용한 docker-compose를 활용하도록 하겠습니다.
주키퍼는 분산 애플리케이션을 위한 코디네이션 시스템입니다.
kafka 브로커들의 메타데이터를 저장, 관리해주는 시스템 입니다.
클라이언트는 주키퍼 마스터가 응답을 하지 않으면 다른 주키퍼 마스터에게 요청을 합니다.
Docker-Desktop 설치
Download Docker Desktop | Docker
win/mac 환경 모두에서 container들 상태 / volumes 할당 / 간단한 shell cli제공등 docker사용 시 유용하기 때문에 Docker-Desktop 설치하는 것을 권장합니다.
- Docker-Desktop설치 시 Docker-compose 역시 설치되기 때문에 별도의 설치가 필요하지 않습니다.
실습환경 구성
- 별도의 경로에서 docker-compose.yml or yaml 파일을 생성합니다.
docker-compose.yml
version: '3.7'
services:
zk1:
container_name: zookeeper1
image: wurstmeister/zookeeper:latest
restart: always
hostname: zk1
ports:
- "2181:2181"
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181
volumes:
- "~/zk-cluster/zk1/data:/data"
zk2:
container_name: zookeeper2
image: wurstmeister/zookeeper:latest
restart: always
hostname: zk2
ports:
- "2182:2181"
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181
volumes:
- "~/zk-cluster/zk2/data:/data"
zk3:
container_name: zookeeper3
image: wurstmeister/zookeeper:latest
restart: always
hostname: zk3
ports:
- "2183:2181"
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181
volumes:
- "~/zk-cluster/zk3/data:/data"
kafka1:
container_name: kafka1
image: wurstmeister/kafka:latest
restart: on-failure
depends_on:
- zk1
- zk2
- zk3
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ADVERTISED_HOST_NAME: host.docker.internal
BOOTSTRAP_SERVERS: host.docker.internal:9092, host.docker.internal:9093, host.docker.internal:9094
KAFKA_ZOOKEEPER_CONNECT: "zk1:2181,zk2:2182,zk3:2183"
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2
kafka2:
container_name: kafka2
image: wurstmeister/kafka:latest
restart: on-failure
depends_on:
- zk1
- zk2
- zk3
ports:
- "9093:9092"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
KAFKA_BROKER_ID: 2
KAFKA_ADVERTISED_HOST_NAME: host.docker.internal
BOOTSTRAP_SERVERS: host.docker.internal:9092, host.docker.internal:9093, host.docker.internal:9094
KAFKA_ZOOKEEPER_CONNECT: "zk1:2181,zk2:2182,zk3:2183"
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2
kafka3:
container_name: kafka3
image: wurstmeister/kafka:latest
restart: on-failure
depends_on:
- zk1
- zk2
- zk3
ports:
- "9094:9092"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
KAFKA_BROKER_ID: 3
KAFKA_ADVERTISED_HOST_NAME: host.docker.internal
BOOTSTRAP_SERVERS: host.docker.internal:9092, host.docker.internal:9093, host.docker.internal:9094
KAFKA_ZOOKEEPER_CONNECT: "zk1:2181,zk2:2182,zk3:2183"
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2
kafka-ui:
image: provectuslabs/kafka-ui
container_name: kafka-ui
ports:
- "10000:8080"
restart: always
environment:
- KAFKA_CLUSTERS_0_NAME=local
- KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=host.docker.internal:9092,host.docker.internal:9093,host.docker.internal:9094
- KAFKA_CLUSTERS_0_ZOOKEEPER=zk1:2181,zk2:2182,zk1:2183
version: docker-compose 버전을 지정합니다
services: docker-compose의 경우 docker 컨테이너로 수행될 서비스들은 services 하위에 기술합니다.
- zookeeper: 서비스 이름을 zk1, zk2, zk3으로 작성했습니다.
- service 하위에 작성하면 서비스 이름으로 동작합니다.
- image: wurstmeister/zookeeper:latest
- environment: 몇몇 환경변수를 지정할 수 있습니다.
- ZOO_MY_ID: zookeeper에서 앙상블이라고 하는 클러스터 내에서 주키퍼를 구별하기 위한 환경변수 id는 반드시 유일해야 하며 1~255 사이에 값이 들어가야 합니다.
- ZOO_SERVERS: zookeeper 앙상블(클러스터) 내 시스템 목록을 지정 즉 클러스터 내 주키퍼 노드 리스트들을 입력합니다
- server.id=<address1>:<port1>:<port2>[:role];[<client port address>:]<client port> 형식으로 입력합니다
- kafka
- image: wurstmeister/kafka:latest
- depends_on:
- docker-compose에서는 서비스들의 우선순위를 지정해 주기 위해서 depends_on을 이용합니다.
- zk라고 지정하였으므로, kafka는 zookeeper이 먼저 실행되어 있어야 컨테이너가 올라오게 됩니다.
- ports:
- kafka 브로커의 포트를 의미합니다.
- 외부포트 : 컨테이너내부 포트 형식으로 지정합니다.
- environment:
- KAFKA_BROKER_ID: 클러스터 각 노드에 할당할 브로커의 아이디 유니크 해야 합니다.
- KAFKA_ADVERTISED_HOST_NAME: kafka 브로커에 사용할 host 정보
- BOOTSTRAP_SERVERS: kafka 브로커 리스트를 나열해 주면 됩니다.
- KAFKA_ZOOKEEPER_CONNECT: 연결할 zookeeper를 지정해 줍니다.
- KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 토픽 파티션의 복제 개수
- kafka-ui 는 선택사항입니다 개괄적인 정보를 web-ui로 제공 받고 싶으시면 추가하시는 것을 추천 드립니다.
Docker-Compose 실행 & Container 확인
${docker-compose.yml파일경로}/$ docker-compose -f docker-compose.yml up -d
docker-compose를 실행합니다.
docker ps
docker ps 명령어를 통해서 실행 중인 컨테이너 목록을 확인합니다.
kafka-ui 접속
0.0.0.0:10000 로 접근하여 실행중인 broker 들을 확인할 수 있습니다.
broker, topics, consumer, segement, partition 등 개괄적인 정보를 확인할 수 있습니다.
Topic 생성
Kafka pub/sub 모델에서의 Topic을 생성해 보도록 하겠습니다.
pub/sub과 topic에 대해서는 Message Queue 포스팅에서 확인하실 수 있습니다.
https://colevelup.tistory.com/3
docker-compose exec kafka1 kafka-topics.sh --create --topic my-topic --bootstrap-server kafka1:9092 --replication-factor 3 --partitions 2
exec kafka1
- kafka1에서 명령어를 실행하겠다는 것입니다.
- kafka-topics.sh를 실행합니다.
- —create : topic을 생성합니다.
- —topic : topic 명을 지정합니다.
- —bootstrap-server : kafka cluster 내에서 초기 metadata를 initial 하기 위해서 가져오는 kafka 브로커 url 중 하나.(브로커중 하나에 액세스 할 수 없으면 다른 브로커로 대체됨.)
- —replication-factor : topic을 복제할 숫자 (리플리케이션에 대해서는 추후 자세히 보스팅)
- —partitions : topic을 파티션 즉 분할할 숫자(파티션에 대해서도 추후 포스팅)
docker-compose exec kafka1 kafka-topics.sh --describe --topic my-topic --bootstrap-server kafka1:9092
topic 생성이 완료되었다면.
—describe를 통해서 topic에 대한 정보를 확인합니다.
Consumer & Producer 실행해보기
docker-compose exec kafka1 bash
kafka1 container에 bash로 붙도록 합니다
cd opt/kafka/bin
kafka bin 경로로 이동합니다
kafka-console-consumer.sh --topic my-topic --bootstrap-server kafka1:9092
kafka-console-consumer.sh 명령어를 활용하여 my-topic을 consume 하는 consumer를 실행합니다.
kafka-console-producer.sh --topic my-topic --broker-list kafka1:9092
kafka-console-producer.sh 명령어를 활용하여 my-topic에 메시지를 전달하는 producer를 실행합니다.
그리고 전달할 메시지를 입력해 줍니다.
producer에서 test라는 메시지를 보냈고
consumer에서 test라는 메시지를 받았습니다.
간단하게 kafka cluster 실습환경을 구축하고 Topic 생성 메시지 전달 같은 것들을 실습해 보았습니다 앞으로 카프카 관련 글에 대해서는 해당 환경 내에서 진행한다는 가정을 하고 포스팅을 진행하도록 하겠습니다.
참조
Kafka CLI tools location in wurstmeister/kafka
[Kafka] Docker Compose로 멀티브로커 Kafka 구성하기
'MessageSystem > Apache Kafka' 카테고리의 다른 글
[Kafka] Kafka와 zero-copy (0) | 2023.01.30 |
---|---|
[Kafka] Leader Epoch(리더 에포크)을 활용한 카프카 브로커(kafka broker) 복구 (1) | 2023.01.28 |
[Kafka] Replication(리플리케이션)과 Leader(리더)와 Follower(팔로워)를 알아보자 (0) | 2023.01.25 |
[Kafka] Topic, Partition, Segment, Segment 관리, Offset (0) | 2023.01.21 |
[Kafka] Kafka 도입 사례로 보는 Kafka 사용의 당위성과 이점 (1) | 2023.01.15 |
댓글