Skip to content
GwiyeomGo Tech Blog
About GwiyeomGo

DOCKER kafka 카프카 설치,셋팅

INFRA, DOCKER, 202316 min read

배경

토이 프로젝트로 경매프로그램을 만들기로 했다 카푸카 개발 환경 셋팅,도커 셋팅을 담당하기로 했다.

카프카 특징

여러 컨슈머가 분산 처리로 메시지를 소비 여러 서브스크라이버에 동일한 메시지 전달 토픽 기반으로 전달 내용을 변경 => 컨슈머 그룹..설정 스토리지 시스템 (중요) 메시지를 잃지 않는다

큐잉 모델 브로커안에 큐를 준비해,프로듀서에서의 메시지가 큐에 담기고, 컨슈머가 큐에서 메시지를 추출 하나의 큐에 대해 컨슈머가 여러 개 존재하며 컨슈머가 메시지를 받으면 다른 컨슈머는 받을 수 없다 펍/섭 메시징 모델 프로듀서= 퍼블리셔 컨슈머 = 서브스크라이버 퍼블리셔가 서브스크라이버에게 전달하는 것이 아니라 브로커를 통해서 전달 퍼블리셔는 누가 그 메세지를 수신하는지 알 수 없고 브로커에 있는 토픽이라고 불리는 카테고리 안에 메시지 등록 여러 서브스크라이버가 동일한 토픽을 구독하기로 결정하면 이 여러 서브스크라이버가 동일한 메시지를 받는다. 또 다른 토픽에서는 다른 메시지를 받을 수 있다 큐잉 모델,펍/섭 메시징 모델이든 모두 브로커를 사이에 끼우는 형태

  • 오프셋 어디까지 메시지를 받았는지 관리하기 위한 오프셋 존재 오프셋 커밋은 메시지를 받아 정상적으로 처리를 완료한 다음 오프셋을 업데이트함 컨슈머가 수신한 메시지를 정상 처리했다면 처리완료 기록을 브로커에 남긴다

카프카의 주요 용어

목표 1: 카프카의 주요 용어 정리공부

카프카(Kafka): 분산 스트리밍 플랫폼,대량의 데이터를 안정적으로 전송, 저장 및 처리할 수 있는 오픈 소스 메시지 큐 시스템

  • 메시지는 토픽에 순서대로 저장되며, 컨슈머는 메시지의 순서를 보장받을 수 있다.

Docker Cluster: Kafka 브로커, 프로듀서, 컨슈머 등이 실행되는 컨테이너 환경

  • 프로듀서와 컨슈머 이미지를 사용하여 Docker Compose 로 Docker 클러스터 내부에 컨테이너로 배포(실행)
  • Kafka 브로커는 Docker 컨테이너 내에서 실행되며 각 브로커는 다양한 토픽을 관리
+----------------------------- docker containers-----------------------------+
| |
| (zookeeper) |
| | |
| +-------(kafka cluster)-----+ |
| (Producer)--> publish -->| |-->read-->(Consumer) |
| | | |
| | Leader (kafka broker1) | |
| | Follower(kafka broker2) | |
| | Leader (kafka broker3) | |
| | | |
| +---------------------------+ |
+----------------------------------------------------------------------------+
  1. 프로듀서 (Producer):
  • 프로듀서는 데이터를 Kafka 토픽으로 보내는 역할을 합니다.
  • 데이터를 생성하고 Kafka 클러스터로 전송하여 토픽에 데이터를 게시합니다.
  1. 컨슈머 (Consumer):
  • 컨슈머는 Kafka 토픽에서 데이터를 읽고 처리하는 역할을 합니다.
  • 컨슈머는 특정 토픽 또는 파티션에서 데이터를 구독합니다.
  1. 브로커 (Broker):
  • 브로커는 Kafka 클러스터 내에서 메시지를 저장하고 관리하는 서버입니다.
  • 클러스터는 여러 브로커로 구성됩니다.
  1. 토픽 (Topic):
  • 토픽은 Kafka에서 데이터 스트림을 카테고리화하는 메커니즘입니다.
  • 메시지를 특정 주제(토픽)에 게시하고 해당 토픽에서 메시지를 구독할 수 있습니다.
  1. 파티션 (Partition):
  • 토픽은 하나 이상의 파티션으로 나뉩니다.
  • 각 파티션은 독립적인 로그 스트림이며, 데이터의 분산 처리를 지원하고 병렬로 처리됩니다.
  1. 리더 (Leader)와 팔로워 (Follower):
  • 각 파티션은 하나의 리더와 여러 팔로워를 가질 수 있습니다.
  • 리더는 읽기와 쓰기 작업을 처리하고, 팔로워는 데이터를 동기화하여 신뢰성을 보장합니다.
  • 원본 = 리더(leader) 와 리플리케이션 = 팔로워(follower)로 구분
브로커 안에는 토픽이 있다
토픽은 특정 주제나 카테고리에 속하는 메시지를 저장하는 논리적인 컨테이너
각 토픽은 여러 파티션으로 나뉘며, 각 파티션은 메시지의 순서와 분산을 관리합니다.
브로커는
토픽과 그 안에 있는 파티션을 관리하여 메시지 스트림을 효과적으로 처리하고 분산합니다
  1. 프로듀서 컨펌 (Producer Acknowledgement):
  • 프로듀서가 메시지를 보내고 성공적으로 받았음을 확인받는 방법을 나타냅니다.
  • 프로듀서 컨펌 설정에 따라 메시지 손실을 방지할 수 있습니다.
  1. 컨슈머 그룹 (Consumer Group):
  • 여러 컨슈머가 하나의 토픽을 구독하고 데이터를 병렬로 처리할 수 있도록 그룹화된 구조입니다.
  • 각 컨슈머는 다른 파티션에서 작업하게 됩니다.
  1. 오프셋 (Offset):
  • 오프셋은 파티션 내에서 메시지의 위치를 나타내는 오프셋 번호입니다.
  • 컨슈머는 특정 파티션에서 어디까지 메시지를 읽었는지를 오프셋을 사용하여 추적합니다.

Kafka의 데이터 흐름

[Producer] -> [Topic A Partition 1 Leader] -> [Broker 1]
[Producer] -> [Topic A Partition 2 Leader] -> [Broker 2]
[Producer] -> [Topic B Partition 0 Leader] -> [Broker 1]
[Producer] -> [Topic B Partition 1 Leader] -> [Broker 2]
  • Kafka 클러스터에 여러개의 브로커가 존재한다
  • 브로커에는 여러 개의 토픽,파티션 존재
  • 프로듀셔가 각각의 토픽 파티션에 맵핑하고 파티션의 리더에 요청을 보냄

Docker로 카프카,주키퍼 띄우기

목표 2 :

  • Docker로 카프카 서버 띄우기

  • 로컬에서 kafka 개발 환경 셋팅하고 실행

  • docker-compose? Docker는 개별 컨테이너 관리에 사용되고 Docker Compose는 여러 컨테이너로 구성된 애플리케이션 스택을 정의하고 관리하는 도구 kafka 는 zookeeper 를 같이 사용해야 하기 때문에 docker-compose 설치

brew install docker-compose docker-compose -v docker-compose stop 실행한 서버 중지

  • zookeeper? 분산 코디네이션 서비스 :분산 시스템에서 서로 다른 노드 또는 서버 간에 상호 작용하고 조율하기 위한 도구 ex) zookeeper (레지스트리, 분산 락, 분산 큐 구현 등 다양한 분산 시스템에서 필요한 작업을 수행) ex) etcd(클러스터 상태 및 설정 정보를 저장하고 공유) 카프카에서는 리더 선출,분산 시스템관리,토픽 및 파티션 관리,브로커 디스커버리 등...위해서 사용

도커 환경에서 카프카 컨테이너를 실행할 때 주키퍼 컨테이너를 실행해야 하는지 여부는 사용하는 카프카 버전과 설정에 따라 다를 수 있습니다. 주키퍼(ZooKeeper)는 카프카의 이전 버전에서는 필수적으로 필요한 구성 요소였지만, 카프카 2.8.0 버전부터는 주키퍼 없이도 카프카를 실행할 수 있는 "KRaft" 모드가 도입되었습니다. KRaft 모드는 주키퍼 대신 내장된 상태 저장 기능을 사용하여 주키퍼의 의존성을 제거하고 카프카 클러스터를 더 단순하게 설정할 수 있도록 합니다.

따라서 카프카 2.8.0 버전 이상을 사용하는 경우, 주키퍼를 사용하지 않고도 카프카를 실행할 수 있습니다. 그러나 카프카 이전 버전을 사용하거나 특정 설정이 필요한 경우에는 주키퍼를 함께 실행해야 할 수 있습니다.

  1. Zookeeper, Kafka 컨테이너 이미지 가져오기위한 docker-compose 템플릿 작성

docker pull wurstmeister/zookeeper docker pull wurstmeister/kafka 이렇게 집접 설치도 가능한데 도커컴포즈.yml 에 image: 추가해 이미지를 가져온다

# compose 파일 버전
version: '2'
services:
# 서비스 명
zookeeper:
# 사용할 이미지
image: wurstmeister/zookeeper
# 컨테이너명 설정
container_name: zookeeper
# 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
ports:
- "2181:2181"
# 서비스 명
kafka:
# 사용할 이미지
image: wurstmeister/kafka
# docker-compose 에서는 서비스들의 우선순위를 지정(kafka는 zookeeper가 먼저 실행되어야함)
depends_on:
- zookeeper
# 컨테이너명 설정
container_name: kafka
# kafka 브로커의 포트,접근 포트 설정 (컨테이너 외부:컨테이너 내부)
ports:
- "9094:9094"
# kafka 브로커를 위한 환경 변수 설정
environment:
KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1
# Kafka 컨테이너가 시작될 때 Topic이라는 이름의 토픽을 생성하도록 지시 (Topic명:Partition개수:Replica개수)
KAFKA_CREATE_TOPICS: "myCustomTopic:1:1"
# 연결할 (서비스이름:컨테이너 내부 포트)
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
# 볼륨 설정 :컨테이너 간 또는 호스트 시스템과 컨테이너 간에 데이터를 공유할 수 있으며, 컨테이너가 제거되더라도 데이터가 보존
# 호스트의 도커 소켓 파일(/var/run/docker.sock)을 컨테이너 내부의 동일한 경로로 마운트하는 것
volumes:
- /var/run/docker.sock:/var/run/docker.sock
  • 마운트 = 주로 파일이나 디렉터리를 하나의 디렉터리 구조에서 다른 디렉터리 구조로 이동하거나 연결하는 작업
  1. docker-compose 명령을 통해 컨테이너를 실행 (docker-compose 실행)

docker-compose -f docker-compose-single-broker.yml up -d

docker_compose.yml 일 경우 이미지 빌드 docker-compose up --build 만약 docker-compose-single-broker.yml 로 이름을 바꾸면 아래 명령어로 빌드 docker-compose -f docker-compose-single-broker.yml up -d

-f (설정파일)을 통해서 우리가 작성한 설정으로 docker-compose를 실행한다. up 옵션을 통해 docker-compos 를 실행한다. -d 옵션은 detach 모드로 컨테이너를 백그라운드로 실행하게 해준다.

  1. docker 상태 로그 확인

docker ps docker logs 컨테이너ID

  1. 컨테이너 중지,삭제

docker-compose down

` docker-compose -f docker-compose-single-broker.yml down`
kafka-docker-go-project > docker-compose down
[+] Running 3/3
✔ Container zookeeper Removed
✔ Container kafka Removed
✔ Network kafka-docker-go-project_default Removed

컨테이너 가 멈추고 삭제된다 이미지는 남아있고 볼륨도 있음


docker-compose 명령어로 topic 생성,확인,컨슈머 실행

목표 2 :

  • topic 생성
  • 컨슈머 실행 = 브로커로 부터 메시지를 수신
  • 프로듀서 실행 = 프로듀서로 메시지를 전송

카푸카 클라이언트 예제 코드 (프로듀서,컨슈머)

https://github.com/confluentinc/confluent-kafka-go

  1. kafka에 접속하기

docker container exec -it {컨테이너이름} bash ex) docker container exec -it kafka bash

  1. 토픽 생성

kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1

  1. 생성된 토픽 목록 보기

kafka-topics.sh --list --bootstrap-server localhost:9092

root:/# cd bin
root:/bin# kafka-console-producer.sh --broker-list localhost:9092 --topic test-topic
> 메세지 보낸다 받아라
  1. 프로듀서 실행

kafka-console-producer.sh --broker-list localhost:9092 --topic test-topic

root:/# cd bin
root:/bin# kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --from-beginning
메세지 보낸다 받아라
  1. 토픽 삭제

kafka-topics.sh --bootstrap-server localhost:9092 --topic test-topic --delete kafka-topics.sh --delete --zookeeper zookeeper:2181 --topic test-topic

  1. 주의
  • 토픽 이름(topic names)
Due to limitations in metric names, topics with a period ('.') or underscore ('_') could collide.
To avoid issues it is best to use either, but not both.
마침표 (.)나 밑줄 (_) 중 하나만 사용하세요. 예를 들어 my_topic 또는 my.topic 중 하나를 선택하는 것이 좋지만,
토픽 이름에서 마침표와 밑줄을 피하세요.
다른 문자 (예: 알파벳, 숫자, 하이픈 등)을 사용하여 메트릭 이름과 충돌할 가능성을 줄이세요

https://medium.com/@kiranprabhu/kafka-topic-naming-conventions-best-practices-6b6b332769a3

  • 토픽 삭제 전에 설정 필요

docker container exec -it kafka bash 로 컨테이너에 접근 후

root> cd /opt/kafka/config 로 이동 server.properties 있음

  • server.properties (Kafka의 서버 설정 파일) 파일의 내용을 수정하려면 vim server.properties

vim을 docker container 에서 사용하려면 아래 방법으로 다운

docker container exec -it {container이름} bash
apt-get update
apt-get install vim

server.properties 파일에 delete.topic.enable = true 를 추가한다

  • server.properties 을 변경후 kafka 컨테이너 재시작 해야한다

  • Zookeeper의 서버 설정 파일 = zookeeper.properties

  • 가끔..토픽을 삭제했는데 (설정도 완료했는데).. 삭제 안된다면 다시 카프카 서버를 재시작해본다.

참고

https://bsssss.tistory.com/1110 https://yes-admit.tistory.com/74 https://tommypagy.tistory.com/226 https://akageun.github.io/2019/09/10/docker-compose-local-kafka.html https://www.sktenterprise.com/bizInsight/blogDetail/dev/2565 https://bsssss.tistory.com/1110 https://stackoverflow.com/questions/31515863/how-to-run-vi-on-docker-container https://velog.io/@jinmin2216/Kafka-Docker-설치부터-Kafka-Quick-Start까지 https://dev-youngjun.tistory.com/259 https://www.sktenterprise.com/bizInsight/blogDetail/dev/2565 https://tychejin.tistory.com/361 https://tommypagy.tistory.com/226 https://cornswrold.tistory.com/524 https://code-lab1.tistory.com/236 https://devocean.sk.com/blog/techBoardDetail.do?ID=164007 https://github.com/confluentinc/confluent-kafka-go https://www.daleseo.com/docker-run/ https://www.yalco.kr/36_docker/ https://github.com/wurstmeister/kafka-docker/blob/master/docker-compose-single-broker.yml https://shortstories.gitbook.io/studybook/go/go-in-action/8c7a5-d45c-c900-b77c-c774-be0c-b7ec-b9ac https://seongjin.me/raft-consensus-algorithm https://akageun.github.io/2019/09/10/docker-compose-local-kafka.html/ https://velog.io/@holicme7/Apache-Kafka-%EC%B9%B4%ED%94%84%EC%B9%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80 https://engineering.linecorp.com/ko/blog/how-to-use-kafka-in-line-1

© 2024 by GwiyeomGo Tech Blog. All rights reserved.