본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
https://bit.ly/4hTSJNB

 


I. 학습 인증샷 4장 이상 포함

1. 공부시작: 날짜, 시각 다 나오도록

공부 시작

2. 공부 종료: 날짜 시각 다 나오도록

공부 종료

3. 1개 클립 수강 (강의장 목록 캡쳐, 수강화면이 보이지 않도록) 1장

Redpanda Console

4. 학습 인증샷 1장(필기 촬영이나 작업물 촬영)

현재 docker-compose에서 실행되는 카프카 클러스터 상태


II. 학습 후기 700자 이상 (공백 제외)

레서판다

이전시간에 배웠던 CMAK처럼 GUI로 접근할 수 있는 듯

강의에선 바로 실습을 들어가서 찾아본 레서판다(https://www.redpanda.com)

  • Apache Kafka 또는 Redpanda 클러스터를 관리하고 디버깅하기 위한 웹 기반 UI 도구
  • 이전에는 Kowl로 알려졌음(그래서 그때는 로고가 올빼미였다고 함)
  • Kafka API를 사용하는 모든 플랫폼과 호환
  • 직관적인 인터페이스를 제공하여 개발자와 운영자가 Kafka 클러스터를 효율적으로 관리가능 하도록 함

Redpanda Console의 주요 기능

토픽 관리

  • 토픽 생성, 삭제, 설정 편집이 가능하며, 각 토픽의 구성 및 공간 사용량을 확인이 가능
  • 메시지 뷰어를 통해 토픽의 메시지를 탐색하고, JavaScript 필터를 사용하여 메시지를 검색 가능

컨슈머 그룹 관리

  • 활성 컨슈머 그룹 목록을 표시하고, 오프셋을 편집하거나 삭제 가능
  • 컨슈머 지연(Consumer Lag)을 분석하여 성능 최적화를 지원

클러스터 모니터링

  • 브로커 상태, 파티션 분포, 메시지 처리량 등 클러스터 성능 지표를 실시간으로 확인 가능
  •  ACL과 SASL-SCRAM 사용자 관리를 포함한 보안 설정을 지원

스키마 레지스트리 관리

  • JSON, Avro, Protobuf 스키마를 등록
  • 스키마 관리 가능

Kafka Connect 및 데이터 변환 관리

  • 여러 커넥트 클러스터의 상태를 모니터링
  • 작업을 재시작하거나 설정을 수정 가능

시간 여행 디버깅(Time Travel Debugging)

  • 실시간 데이터 흐름을 탐색
  • 과거 데이터를 디버깅하는 기능을 제공
강의에서는 Redpanda 설치 방법은 제공하지 않고 이미 실습 환경에 도커로 제공하고 있다.
추후 설치나 구성은 따로 공부가 필요해보인다.
인터넷을 찾아본 바론 강사님처럼 보통 Docker 를 사용하며, 
쿠버네티스 배포의 경우에는 Helm Chart를 통해 배포하는 것 같다.
운영에 반영을 생각해보면.. config 파일 편집해서 설정 추가하는 것도..꽤 일이 많아 보였다.

아 이번엔 이게 더 좋아보이네;;

  • 지난 시간에 CMAK보고 감동먹어서.. 이걸 어떻게 써먹지 이러고 있었는데...하루만에..
  • 일단 CMAK보다 훨씬 더 많은 정보를 주는 듯 하다. 특히 

메시지 의 키와  value와 타임스탬프, 어느 파티션에 있는지와,  offset까지 한 번에 볼 수 있다. 누르면 각 value도 pretty하게 볼 수 있다.

  • 메시지 의 키와  value와 타임스탬프, 어느 파티션에 있는지와,  offset까지 한 번에 볼 수 있다.
  • 심지어 검색 기능까지도 있음
  • 필터 옵션을 커스텀하게 edit할 수도 있을 거 같은데.. 이건 모르겠음..
  • 여튼 다시 너로 정했다.. . 하루만에 맘이 바뀜;
블로그 이미지

감동맨

rkaehdaos의 블로그

,

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
https://bit.ly/4hTSJNB

 


I. 학습 인증샷 4장 이상 포함

1. 공부시작: 날짜, 시각 다 나오도록

공부 시작

2. 공부 종료: 날짜 시각 다 나오도록

공부 종료

3. 1개 클립 수강 (강의장 목록 캡쳐, 수강화면이 보이지 않도록) 1장

ㅆㅂ? 아니 CMAK?

4. 학습 인증샷 1장(필기 촬영이나 작업물 촬영)

밑에 나오는 실습 결과 샷이지만 너무 감명 깊어서 이것을 대표이미지로 하려고 한다.


II. 학습 후기 700자 이상 (공백 제외)

 

CMAK??

강사님 설명

  • 지난 시간에 살펴본 Kcat이 produce /consume에 특화된 거라면
  • CMAK은 좀 더 클러스터 브로커 관리에 특화
  • CLI가 아닌 UI 제공
  • 아후에서 kafka manager로 개발하다가 kafka요청으로 바뀜
  • 강의 실습환경에 docker-compose로 이미 설정해서 9000포트로 바로 접속 가능
설명이 너무 짧아서 ㅎ 와닿지 않아서 더 찾아봄

구글링

  • CMAK: Cluster Manager for Apache Kafka
  • 아파치 카프카를 관리하기 위한 GUI 기반 관리도구
  • 웹기반 UI로 직관적으로 클러스터와 토픽 관리가 가능해서 편리
  • 카프카의 복잡한 설정과 운영 작업 간소화
  • 실시간으로 클러스터상태 확인 가능 , 관리 가능
  • 브로커와 컨슈머 그룹 상태 모니터링 가능
  • 토픽 관리(생성,삭제 조회) , 파티션 추가 및 설정 변경 가능
  • 파티션 리밸런싱 가능
  •  

접속해보기

  • localhost:9000

아무것도 없음

 

  • 일단 클러스터를 세팅해보자

Cmak 에 클러스터를 등록하는 화면 .버전이 2.4네;;

  • 현재 강의 실습 환경으로 주어진 컨테이너의 카프카는 3.6인데
  • cmak에서 설정할 수 있는 가장 높은 버전이 2.4이다..
  • 강의나 실습에서는 이상이 없는 것 같은데 이를 운영에 쓰기에는 어떨까... 싶다.

등록하고나면 이제 클러스터에 대한  대시보드가 나오며 여러 메뉴가 생긴다. 3개의 브로커와 4개의 토픽이 보인다.

  • Topics

topics의 숫자를 누르면 이렇게 토픽의 목록이 보이게 된다. 인터널 토픽을 제외하고 3개의 토픽이 보인다.

  • 각 토픽을 눌러볼 수 도 있다.

와 솔직히 이정도로 나올줄은 몰랐다. 특히 partitions by broker는 해당 토픽의 파티션을 브로커의 입장에서 바라보는 관점을 취하고 있다. 훌륭하다.

  • 솔직히 진짜 감동이다.
  • 특정 토픽을 클릭했을때 표시되는 화면은 그동안 커맨드 라인에서 확인이 어려웠던 토픽의 상세 정보가 시각적으로 제공된다.
  • 강의에서는 짚어주지는 않지만 하나씩 확인해본봐 다음과 같다
  • Topic Summary:
    • 토픽의 이름, 파티션 수, 복제본(replication factor) 수와 같은 기본 정보를 표시
  • Operations:
    • 토픽 삭제, 파티션 추가, 재분배(rebalance), 설정 변경 등 관리 작업을 수행할 수 있는 메뉴.
  • Partitions by Broker:
    • 위 스샷처럼 가장 감동 받은 부분...
    • 각 브로커에 생성된 파티션의 정보를 확인할 수 있다
    • 이를 통해 데이터가 어떤 브로커에 분산되어 있는지 확인 가능하다
    • "토픽의 파티션을 브로커의 입장에서 바라보는 관점"이라는게 정말 훌륭하다.
  • Partition Information:
    • 각 파티션의 리더(Leader)와 복제본(replication)이 어떤 브로커 노드에 위치하는지 상세 정보 제공
    • 데이터 복제 및 리더 역할 분배를 결정하는데 유용할 듯
  • skewed : 쏠림 현상
    • 몰라서 찾아봤는데 쏠림현상이 일어나면 해당 옵션이 true가 된다
    • 현재는 쏠림 현상이 없음
    • 만약 쏠림 현상이 보여진다면
      • "Manual Partition Assignments"버튼을 눌러서 특정 파티션을 다른 브로커로 보내면 된다 
위의 작업 마치고 Done 해도 그대로 보이는데. 설정 반영을 위해선
"Reassign Partition"버튼을 눌러야 반영이 된다

솔직히 지금 까지 설명한 툴중에 가장 와닿는다.

클러스터 관리를 실시간으로 모니터링하고 필요한 작업을 수행하는 것은
이게 제일인 것 같다.

블로그 이미지

감동맨

rkaehdaos의 블로그

,

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
https://bit.ly/4hTSJNB

 


I. 학습 인증샷 4장 이상 포함

1. 공부시작: 날짜, 시각 다 나오도록

공부 시작

2. 공부 종료: 날짜 시각 다 나오도록

공부 종료

3. 1개 클립 수강 (강의장 목록 캡쳐, 수강화면이 보이지 않도록) 1장

Kcat???

4. 학습 인증샷 1장(필기 촬영이나 작업물 촬영)

최종 실습 마무리.. 힘들다


II. 학습 후기 700자 이상 (공백 제외)

실습

  • 일반적으로는 로컬에서 설치하는 것이 일반적인데 강의 실습에는 도커를 사용한다
  • 수강생 환경에 따른 영향을 덜 받게 하려는 배려인듯 하다
# Docker로 Kcat 실행하기
docker run -it --rm \
    --name=kcat \
    --network=fastcampus-kafka-message-queie_default \
    edenhill/kcat:1.7.1 \
    -b kafka1:19092,kafka2:19092,kafka3:19092 \
    {모드 옵션} {상세 옵션}

 

  • 모드 옵션
    • -P : Produce 모드
    • -C : Consume 모드
    • -L : Metadata List 모드
    • -Q : Query 모드
    •  

실습 진행이 전혀 안됨

  • 문제점
    • 알고보니 내렸다 올리면서 network가 하나 더 생긴 모양..
ahn@Ahns-m1Pro14 fastcampus-kafka-message-queue % docker run -it --rm \
    --name=kcat \
    --network=fastcampus-kafka-message-queie_default \
    edenhill/kcat:1.7.1 \
    -b kafka1:19092,kafka2:19092,kafka3:19092 \
    -L
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
docker: Error response from daemon: failed to set up container networking: network fastcampus-kafka-message-queie_default not found

Run 'docker run --help' for more information
ahn@Ahns-m1Pro14 fastcampus-kafka-message-queue %
  • 완전 초기화하려면 다음 명령어로 초기화 가능
    •  docker compose down --remove-orphans
  • 위 명령어로 네트워크까지 전부 삭제 후 전부 다시 시작하면 실습이 수행된다..
  •  
docker run -it --rm \
    --name=kcat \
    --network=fastcampus-kafka-message-queue_default \
    edenhill/kcat:1.7.1 \
    -b kafka1:19092,kafka2:19092,kafka3:19092 \
    -L
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
Metadata for all topics (from broker 2: kafka2:19092/2):
 3 brokers:
  broker 2 at kafka2:19092
  broker 3 at kafka3:19092
  broker 1 at kafka1:19092 (controller)
 3 topics:
  topic "my-topic" with 3 partitions:
    partition 0, leader 2, replicas: 2,1, isrs: 2,1
    partition 1, leader 3, replicas: 3,2, isrs: 3,2
    partition 2, leader 1, replicas: 1,3, isrs: 1,3
  topic "my-distributed-topic" with 3 partitions:
    partition 0, leader 2, replicas: 2,3, isrs: 2,3
    partition 1, leader 3, replicas: 3,1, isrs: 3,1
    partition 2, leader 1, replicas: 1,2, isrs: 1,2
  topic "__consumer_offsets" with 50 partitions:
    partition 0, leader 2, replicas: 2, isrs: 2
    partition 1, leader 3, replicas: 3, isrs: 3
    partition 2, leader 1, replicas: 1, isrs: 1
    partition 3, leader 2, replicas: 2, isrs: 2
    partition 4, leader 3, replicas: 3, isrs: 3
    partition 5, leader 1, replicas: 1, isrs: 1
    partition 6, leader 2, replicas: 2, isrs: 2
    partition 7, leader 3, replicas: 3, isrs: 3
    partition 8, leader 1, replicas: 1, isrs: 1
    partition 9, leader 2, replicas: 2, isrs: 2
    partition 10, leader 3, replicas: 3, isrs: 3
    partition 11, leader 1, replicas: 1, isrs: 1
    partition 12, leader 2, replicas: 2, isrs: 2
    partition 13, leader 3, replicas: 3, isrs: 3
    partition 14, leader 1, replicas: 1, isrs: 1
    partition 15, leader 2, replicas: 2, isrs: 2
    partition 16, leader 3, replicas: 3, isrs: 3
    partition 17, leader 1, replicas: 1, isrs: 1
    partition 18, leader 2, replicas: 2, isrs: 2
    partition 19, leader 3, replicas: 3, isrs: 3
    partition 20, leader 1, replicas: 1, isrs: 1
    partition 21, leader 2, replicas: 2, isrs: 2
    partition 22, leader 3, replicas: 3, isrs: 3
    partition 23, leader 1, replicas: 1, isrs: 1
    partition 24, leader 2, replicas: 2, isrs: 2
    partition 25, leader 3, replicas: 3, isrs: 3
    partition 26, leader 1, replicas: 1, isrs: 1
    partition 27, leader 2, replicas: 2, isrs: 2
    partition 28, leader 3, replicas: 3, isrs: 3
    partition 29, leader 1, replicas: 1, isrs: 1
    partition 30, leader 2, replicas: 2, isrs: 2
    partition 31, leader 3, replicas: 3, isrs: 3
    partition 32, leader 1, replicas: 1, isrs: 1
    partition 33, leader 2, replicas: 2, isrs: 2
    partition 34, leader 3, replicas: 3, isrs: 3
    partition 35, leader 1, replicas: 1, isrs: 1
    partition 36, leader 2, replicas: 2, isrs: 2
    partition 37, leader 3, replicas: 3, isrs: 3
    partition 38, leader 1, replicas: 1, isrs: 1
    partition 39, leader 2, replicas: 2, isrs: 2
    partition 40, leader 3, replicas: 3, isrs: 3
    partition 41, leader 1, replicas: 1, isrs: 1
    partition 42, leader 2, replicas: 2, isrs: 2
    partition 43, leader 3, replicas: 3, isrs: 3
    partition 44, leader 1, replicas: 1, isrs: 1
    partition 45, leader 2, replicas: 2, isrs: 2
    partition 46, leader 3, replicas: 3, isrs: 3
    partition 47, leader 1, replicas: 1, isrs: 1
    partition 48, leader 2, replicas: 2, isrs: 2
    partition 49, leader 3, replicas: 3, isrs: 3
  • 현재 강의에는 특별히 데이터를 만들지 않았으므로
    어제 강의의 토픽을 Consumer모드로 읽어와볼 수 있다.
docker run -it --rm \
    --name=kcat \
    --network=fastcampus-kafka-message-queue_default \
    edenhill/kcat:1.7.1 \
    -b kafka1:19092,kafka2:19092,kafka3:19092 \
    -C \
    -t my-distributed-topic
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
2nd
3rd
9th
4th
6th
10th
12th
13th
14th
1st
5th
7th
8th
11th
15th
% Reached end of topic my-distributed-topic [2] at offset 3
% Reached end of topic my-distributed-topic [1] at offset 6
% Reached end of topic my-distributed-topic [0] at offset 6
  • 현재 순서가 엉긴 것처럼 보이는 이유는?  파티션별로 순서보장이 되서 그렇게 보여짐

신규 토픽

Kcat에서는 토픽 생성 불가 (괜히 해맴..)
docker compose exec kafka1 \
	kafka-topics.sh \
    	--bootstrap-server localhost:9092,localhost:9093,localhost:9094 \
        --create \
        --topic my-json-topic \
        --replication-factor 2 \
        --partitions 3

Kcat을 이용한 Produce

docker run -it --rm \
    --name=kcat \
    -v "$(pwd)/file.txt:/app/file.txt" \
    --network=fastcampus-kafka-message-queue_default \
    edenhill/kcat:1.7.1 \
    -b kafka1:19092,kafka2:19092,kafka3:19092 \
    -P \
    -t my-json-topic \
    -l \
    -K: /app/file.txt
  • my-json-topic에다가 line단위로 파일을 읽을 것이다.
  • 키는 콜론으로 구분할 것이다.
  • app/file.txt라는 파일을 읽어서 프류듀스한다
    • file.txt는 강사님이 준 강의로 30개의 data로 되어있으며 key는 숫자, value는 json으로 되어있었다..

위의 값을 Kcat을 이용한 Consume

 

# 위의 전시간 읽어온 명령어에서 topic만 바꿔주면 된다.
docker run -it --rm \
    --name=kcat \
    --network=fastcampus-kafka-message-queue_default \
    edenhill/kcat:1.7.1 \
    -b kafka1:19092,kafka2:19092,kafka3:19092 \
    -C \
    -t my-json-topic
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
{"id":2,"age":17,"name":"Peter","content":"Greetings! I'm Peter, a young coder with big dreams."}
{"id":4,"age":17,"name":"Jack","content":"Greetings! I'm Jack, a high school student who loves programming."}
{"id":6,"age":17,"name":"Vince","content":"Hi, I'm Vince. Let's discuss the latest trends in technology."}
{"id":8,"age":17,"name":"David","content":"Hey there! I enjoy playing video games in my free time."}
{"id":11,"age":17,"name":"Mia","content":"Hey, I'm Mia. Let's talk about technology and innovation."}
{"id":13,"age":17,"name":"Alice","content":"Hi, my name is Alice."}
{"id":16,"age":17,"name":"Henry","content":"Aspiring software developer here! Let's connect."}
{"id":19,"age":17,"name":"Yara","content":"Hey there! I'm Yara, a young coder passionate about innovation."}
{"id":22,"age":17,"name":"Ben","content":"I'm Ben, a high school student interested in programming and technology."}
{"id":25,"age":17,"name":"Grace","content":"Hi, I'm Grace. I love reading books and learning new things."}
{"id":28,"age":17,"name":"Ivy","content":"I am a coding enthusiast with a keen interest in AI."}
{"id":1,"age":18,"name":"Quinn","content":"I'm Quinn, a software engineering student exploring the tech world."}
{"id":9,"age":18,"name":"Ryan","content":"Nice to meet you! I'm Ryan, passionate about software development."}
{"id":14,"age":18,"name":"Karen","content":"Hello world! I'm Karen, a computer science major."}
{"id":17,"age":18,"name":"Cara","content":"Hi, I'm Cara. Let's code together and create something amazing."}
{"id":20,"age":18,"name":"Wendy","content":"I'm Wendy, a coding enthusiast who enjoys building cool projects."}
{"id":23,"age":18,"name":"Nathan","content":"Coding is my passion, and I'm always eager to learn new things."}
{"id":26,"age":18,"name":"Zack","content":"I'm Zack, a software engineering student with a love for coding challenges."}
{"id":29,"age":18,"name":"Xavier","content":"Greetings! I'm Xavier, exploring the world of software engineering."}
{"id":3,"age":19,"name":"Ivy","content":"I am a coding enthusiast with a keen interest in AI."}
{"id":5,"age":19,"name":"Sara","content":"Hello, I'm Sara. Coding and design are my creative outlets."}
{"id":7,"age":19,"name":"Dylan","content":"Nice to meet you! I'm Dylan, a software engineer with a passion for innovation."}
{"id":10,"age":19,"name":"Ada","content":"Hello world! I'm Ada, a computer science major with a curiosity for AI."}
{"id":12,"age":19,"name":"Uma","content":"Hey! I'm Uma, a software developer interested in AI and machine learning."}
{"id":15,"age":19,"name":"Olivia","content":"Hi, I'm Olivia. I love building software that makes a difference."}
{"id":18,"age":19,"name":"Frank","content":"Nice to meet you! I specialize in web development."}
{"id":21,"age":19,"name":"Leo","content":"I enjoy solving complex problems through coding."}
{"id":24,"age":19,"name":"Travis","content":"I am a software engineer."}
{"id":27,"age":19,"name":"Tom","content":"I'm Tom, a computer science enthusiast with a love for algorithms."}
{"id":30,"age":19,"name":"Eva","content":"I am passionate about creating software applications."}
% Reached end of topic my-json-topic [2] at offset 11
% Reached end of topic my-json-topic [0] at offset 8
% Reached end of topic my-json-topic [1] at offset 11

계속 순서가 섞여 보임

  • 파티셔닝된 토픽에 메시지 발행이어서 실제로는 아마 파티션안에서는 보장이 되고 있을 듯

휴...

Kcat에 대한 내용이다.
(내가 예전에 처음 들었던 명칭은 `Kafkacat`이었는데 변경된 모양이다)

Kcat (강의에는 없어서 gpt에게 물어봄)

  • Apache Kafka를 테스트하고 디버깅하기 위한 명령줄 기반 도구
  • 일명 "Kafka용 Netcat"
  • Kafka 클러스터와 상호작용하거나 데이터를 생성 및 소비하는데 유용한 기능을 제공
  • Kafka CLI보다 더 강력하고 다양한 기능 제공

이라고 한다. 

사실 실습만으로는 원래 본거에서 뭐가 그렇게 크게 다른지 모르겠다
오히려 토픽도 못만드는 부분이 더 크게 다가오는데..

 

블로그 이미지

감동맨

rkaehdaos의 블로그

,

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
https://bit.ly/4hTSJNB


I. 학습 인증샷 4장 이상 포함

1. 공부시작: 날짜, 시각 다 나오도록

공부 시작

2. 공부 종료: 날짜 시각 다 나오도록

공부 종료

3. 1개 클립 수강 (강의장 목록 캡쳐, 수강화면이 보이지 않도록) 1장

34번째 강의 목차

4. 학습 인증샷 1장(필기 촬영이나 작업물 촬영)

실습샷: 우츠겡서 토픽을 만들과 좌상단에서 메시지를 생성하고 좌하단에서 메시지를 수신한다. 한글도 잘된다.


II. 학습 후기 700자 이상 (공백 제외)

Kafka CLI에 대한 내용이다.

요약

 Kafka CLI

  • CLI: Command Line Interface
  • 아파치 카프카를 관리하고 운영하기 위해 제공되는 명령어 도구
  • CLI를 통해 카프카 토픽, 프로듀서 및 컨슈머를 제어 가능
  •  

Kafka CLI 주요 기능

  • kafka topic 관리
    • 토픽의 생성, 삭제, 조회, 수정 가능
      • 토픽 목록 보기 (조회)
      • 파티션 및 복제 설정 변경 (수정)
  • 프로듀서 메시지 삽입
    • 특정 토픽에 메시지를 보내는 기능
    • 메시지의 키와 값을 설정하여 전송 가능
  • 컨슈머 메시지 소비
    • 토픽에서 메시지를 읽고 처리
    • 특정 컨슈머 그룹을 지정하거나 파티션별로 메시지를 소비 가능 

 

Kafka CLI는 카프카를 설치하면 그 안에 커맨드라인이 존재한다.

 

topic 관련 명령어 

  • 토픽 목록 보기
bin/kafka-topics.sh --bootstrap-server localhost:9092 --list

 

  • 토픽 생성하기
bin/kafka-topics.sh --bootstrap-server localhost:9092 --create \
--topic my_topic --partitions 3 --replication-factor 1
  • 토픽 삭제
bin/kafka-topics.sh --bootstrap-server localhost:9092 --delete \
--topic my_topic
  • 토픽 상세 정보 조회
bin/kafka-topics.sh --bootstrap-server localhost:9092 \
--topic my_topic --describe

 

  • 전부 보면 `kafka-topics.sh`로 실행할 수 있는 것을 알 수 있다.
    • --create
      • 토픽을 만든다
    • --alter
      • 토픽의 옵션을 수정한다
    • --list
      • 토픽의 목록을 뽑아온다
    • --describe
      • 토픽의 상세 정보를 조회한다
    • --delete
      • 토픽을 삭제한다
    • 쉽게 말해서 "CRUD"

Producer 관련 명령어 

  • 메시지 보내기
bin/kafka-console-producer.sh --broker-list localhost:9092 \
--topic my_topic
  • 메시지 입력
# 입력 예시
> Hello FastCampus!

Consumer 관련 명령어 

  • 메시지 읽기 (처음부터)
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 \
--from-beginning --topic my_topic
  • 특정 Consumer Group으로 읽기
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 \
--group group_name --topic my_topic

 

  • kafka-consumer-groups.sh (처음 봄)
    • 컨슈머 그룹들에 대한 정보를 조회 해볼 수 있는 도구?
    •  

Kafka 실행 및 종료 

  • 실행
bin/zookeeper-server-start.sh config/zookeeper.properties
bin/kafka-server-start.sh config/server.properties
  • 종료
bin/kafka-server-stop.sh config/server.properties
bin/zookeeper-server-stop.sh config/zookeeper.properties

실습 - 토픽 생성

토픽생성

  • 실습 명령어
ahn@Mac study-kafka-message-queue % docker compose exec kafka1 \
        kafka-topics.sh \
        --bootstrap-server localhost:9092,localhost:9093,localhost:9094 \
        --create --topic my-topic \
        --replication-factor 2 \
        --partitions 1
[2025-04-10 10:18:29,395] WARN [AdminClient clientId=adminclient-1] Connection to node -2 (localhost/127.0.0.1:9093) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
Created topic my-topic.
ahn@Mac study-kafka-message-queue %
  • kafka1 이나 kafka2나 상관없음
    • docker compose로 이루어진 kafka1~3까지는 ZooKeeeper에 의해 하나의 클러스터화 되어 있음
    • 브로커 중 하나만 적어도 카프카 클러스터 접근에 문제가 없음
  • replication-factor 2
    • 1로 두었다면 카프카 메시지를 이 브로커에 대해 복제는 안하겠다
    • 2
      • 복제를 한 번 해서 총 2개
      • 복제를 2번하는게 아님
  • partitions 1
    • 이 토픽을  queue처럼 (1등분)쓰겠다
    • 이론시간에 배웠듯이 이 파티션 수는 한번 늘리면 변경이 불가능에 가까움(늘리는 건 가능)
    • 신중하게 결정해야 한다

Consumer 실행 

  • 실습 명령어
docker compose exec kafka1 \
        kafka-console-consumer.sh \
        --bootstrap-server localhost:19092 \
        --topic my-topic \
        --from-beginning

 

  • --from-beginning
    • 처음 부터 읽어오기...
    • consumer는 카프카에 쌓여있는 데이터를 가져오기 위해
    • producer와 입장이 다름 - 어디서부터 읽어 와야하는지 지정해야 함

Producer 실행 

  • 실습 명령어
docker compose exec kafka1 \
        kafka-console-producer.sh \
        --bootstrap-server localhost:19092 \
        --topic my-topic

 

 

 1 - 파티션 1개의 1개의 토픽

상황설명1 - 파티션1개의 topic에 메세지를 produce
파티션1개인 경우에는 queue처럼 순서가 보장됨

 

 2 - 파티션이 3개로 나누어진 토픽

Topic 수정

  • 실습 명령어
# 파티션 3개로 alter
docker compose exec kafka1 \
        kafka-topics.sh \
        --bootstrap-server localhost:19092 \
        --topic my-topic \
        --alter --partitions 3
  • 우리가 상상하는 모습

위 명령어로 인해서 우리가 생각하는 파티션이 나뉘어진 토픽

Producer 실행 

  • 실습 명령어 - 이전과 달리 옵션이 있음
docker compose exec kafka1 \
        kafka-console-producer.sh \
        --bootstrap-server localhost:19092 \
        --topic my-topic \
        --property="parse.key=true" \
        --property="key.separator=:"
  • key를 parsing 하겠다.
  • key 구분자는 콜론으로 하겠다.

  • 실습 명령어 - 이전과 달리 옵션이 있음

실행결과: 12개를 순서대로 produce했지만 consumer는 순서대로 consume하지 못함

 

진실1: Topic은 사실 카프카 메시지에 대한 논리적인 단위이다.
진실2: 따라서 실제 메시지는 물리적으로 Broker에 담겨있다.

따라서 위의 상황의 실제 모습은 다음과 같다.

파티션이 나뉜 토픽(논리 단위)는 실제 물리적인 브로커에 횡단으로 겹쳐있다.

  • Broker: 각각의 카프카 머신
  • 토픽은 클러스터를 가로지르고 있음
  • 파티션 3개  -> 브로커의 리소스를 효율적으로 사용할 수 있도록 각 브로커에 나눠서 
  • 카프카는 결국 토픽이 아닌 파티션 별로 순서 보장이 된다.
  • 이론시간에 배웠던 해시값을 이용한 값을 이용 -> 동일한 키를 가진 메시지는 동일한 파티션

Topic의 메시지는 3개의 파티션에 균등하게 분포 되어 있으며 각 파티션에서는 순서 보장이 되고 있다.

 


실습 - Replication

- 아니 동영상 하나 실습이 너무 긴거 아님??
- 벌써 몇천자는 썼을듯..
- 환급챌린지 할 강의 완전 잘못 골랐음... 존나 어렵고 길고..

환경 변경 : 파티션 복제를 위해 Replication factor를 2로 설정한다.

 Topic생성

docker compose exec kafka1 \
	kafka-topics.sh \
    	--bootstrap-server localhost:9092,localhost:9093,localhost:9094 \
        --create \
        --topic my-distributed-topic \
        --replication-factor 2 \
        --partitions 3
  • factor 2
    • 2번 복제하는 것을 의미하지 않는다
    • 1개는 원본 , 하나는 복제본 해서 총 2벌의 데이터를 갖는다는 뜻
  • 파티션은 처음부터 3개를 준다.

  • 백엔드 개발자에서는 크게 달라지는 부분이 없어 보임
  • 메시지가 들어오면 전략에 따라 어떤 파티션에 들어갈지 정해짐 - 리더 파티션
  • Leader Partition
    • 외부와 직접적으로 메시지를 주고 받는 파티션
  • Follower Partition
    • Leader로부터 데이터를 복제받음
    • Backup용
  • Leader와 Follower가 섞여있음
    • 하나의 Broker가 죽어도 복구할 수 있음
  • DB Replication과 다르다
    • DB 
      • write: primary only
      • read : primary, secondary both
    • kafka와 다름
간단하게 정리했는데도 네이버 글자수로 3800자임...
 동영상 하나에 너무 많은 내용이 ㅠㅠ
실습이라 좋은데 오히려 환급 챌린지는 정말 챌린지가 되고 있다..ㅠ

 

 

 

블로그 이미지

감동맨

rkaehdaos의 블로그

,

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
https://bit.ly/4hTSJNB


I. 학습 인증샷 4장 이상 포함

1. 공부시작: 날짜, 시각 다 나오도록

공부 시작

2. 공부 종료: 날짜 시각 다 나오도록

공부 종료

3. 1개 클립 수강 (강의장 목록 캡쳐, 수강화면이 보이지 않도록) 1장

clip33 실습이다.

4. 학습 인증샷 1장(필기 촬영이나 작업물 촬영)

강사님 설명대로 저장소 clone후 open, release branch라 이게 최종 완성본의 모습인가보다


II. 학습 후기 700자 이상 (공백 제외)

실습이다~!

요약

 저장소 clone

  • 저장소를 fork한후 clone
# repo clone
Cloning into 'fastcampus-kafka-message-queue'...
remote: Enumerating objects: 533, done.
remote: Counting objects: 100% (58/58), done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 533 (delta 46), reused 43 (delta 43), pack-reused 475 (from 1)
Receiving objects: 100% (533/533), 1.16 MiB | 1.15 MiB/s, done.
Resolving deltas: 100% (172/172), done.
ahn@Ahns-m1Pro14 rkaehdaos %

Docker  Compose 이미지 다운로드

  • 이미지 미리 다운로드 -  pull
# 도커 이미지 다운로드
ahn@Ahns-m1Pro14 fastcampus-kafka-message-queue % docker compose pull
WARN[0000] /Users/ahn/dev/repo/rkaehdaos/fastcampus-kafka-message-queue/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] Pulling 5/42
 ✔ kafka1 Skipped - Image is already being pulled by kafka3                0.0s
 ✔ kafka2 Skipped - Image is already being pulled by kafka3                0.0s
 ⠧ zookeeper [⠀] Pulling                                                  21.8s
 ⠧ cmak [⣄⣶⣿⣿⣿⠀⠀] Pulling                                                 21.8s
 ⠧ redpanda-console [⠀⠀⠀⠀⠀⠀⠀] Pulling                                     21.8s
 ⠧ kafka3 [⠀] Pulling                                                     21.8s
 ⠧ kafka-ui [⠀⠀⠀⠀⠀⠀⠀] Pulling                                             21.8s
 ⠧ mysql [⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀] Pulling                                            21.8s

2 docker 관련 커맨드

  • docker compose up -d
    • compose 환경 올리기
    • -d 옵션은 background 옵션
      • 필요할때만 로그를 보도록 하자
ahn@Ahns-m1Pro14 fastcampus-kafka-message-queue % docker compose up -d
WARN[0000] /Users/ahn/dev/repo/rkaehdaos/fastcampus-kafka-message-queue/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] Running 8/8
 ✔ Container mysql             Running                                                                                                                                                                           0.0s
 ✔ Container zookeeper         Running                                                                                                                                                                           0.0s
 ✔ Container kafka1            Running                                                                                                                                                                           0.0s
 ✔ Container kafka3            Running                                                                                                                                                                           0.0s
 ✔ Container kafka2            Running                                                                                                                                                                           0.0s
 ✔ Container cmak              Running                                                                                                                                                                           0.0s
 ✔ Container kafka-ui          Running                                                                                                                                                                           0.0s
 ✔ Container redpanda-console  Running                                                                                                                                                                           0.0s
ahn@Ahns-m1Pro14 fastcampus-kafka-message-queue %
  • docker compose down
    • 환경 내리기
    • 실습 끝나면 실행
ahn@Ahns-m1Pro14 fastcampus-kafka-message-queue % docker compose down
WARN[0000] /Users/ahn/dev/repo/rkaehdaos/fastcampus-kafka-message-queue/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] Running 9/9
 ✔ Container mysql                                 Removed                                                                                                                                                       1.3s
 ✔ Container cmak                                  Removed                                                                                                                                                       0.6s
 ✔ Container redpanda-console                      Removed                                                                                                                                                       0.2s
 ✔ Container kafka-ui                              Removed                                                                                                                                                       2.3s
 ✔ Container kafka1                                Removed                                                                                                                                                       1.0s
 ✔ Container kafka2                                Removed                                                                                                                                                       5.9s
 ✔ Container kafka3                                Removed                                                                                                                                                       1.0s
 ✔ Container zookeeper                             Removed                                                                                                                                                       0.6s
 ✔ Network fastcampus-kafka-message-queue_default  Removed                                                                                                                                                       0.3s
ahn@Ahns-m1Pro14 fastcampus-kafka-message-queue %
  • docker ps
    • 컨테이너 리스트 
    • container id 를 확인가능
    •  
ahn@Mac study-kafka-message-queue % docker ps -a
CONTAINER ID   IMAGE                                             COMMAND                  CREATED          STATUS          PORTS                                                        NAMES
eddf825abbd0   provectuslabs/kafka-ui:v0.7.1                     "/bin/sh -c 'java --…"   25 seconds ago   Up 23 seconds   0.0.0.0:8081->8080/tcp                                       kafka-ui
2cd28ccba6aa   docker.redpanda.com/redpandadata/console:v2.3.7   "./console"              25 seconds ago   Up 23 seconds   0.0.0.0:8989->8080/tcp                                       redpanda-console
0487f9aaa9b0   hlebalbau/kafka-manager:3.0.0.5                   "/kafka-manager/bin/…"   25 seconds ago   Up 23 seconds   0.0.0.0:9000->9000/tcp                                       cmak
a62592fd749e   bitnami/kafka:3.6.0                               "/opt/bitnami/script…"   25 seconds ago   Up 23 seconds   9092/tcp, 0.0.0.0:9094->9094/tcp, 0.0.0.0:54745->19092/tcp   kafka3
9160af910160   bitnami/kafka:3.6.0                               "/opt/bitnami/script…"   25 seconds ago   Up 23 seconds   0.0.0.0:9092->9092/tcp, 0.0.0.0:54742->19092/tcp             kafka1
005918c311ce   bitnami/kafka:3.6.0                               "/opt/bitnami/script…"   25 seconds ago   Up 23 seconds   9092/tcp, 0.0.0.0:9093->9093/tcp, 0.0.0.0:54746->19092/tcp   kafka2
db515dd6ee89   mysql:8.0.35                                      "docker-entrypoint.s…"   25 seconds ago   Up 23 seconds   0.0.0.0:3306->3306/tcp, 33060/tcp                            mysql
619b243ab294   bitnami/zookeeper:3.7.2                           "/opt/bitnami/script…"   25 seconds ago   Up 23 seconds   2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp, 8080/tcp         zookeeper
ahn@Mac study-kafka-message-queue %
  • docker logs {컨테이너id}
    • 특정 컨테이너 id를 지정해서 로그를 볼 수 있다.
# ex) docker ui 컨테이너의 로그 보기
ahn@Mac study-kafka-message-queue % docker logs eddf825abbd0
02:08:12,807 |-INFO in ch.qos.logback.classic.LoggerContext[default] - This is logback-classic version 1.4.7
02:08:12,834 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
02:08:12,834 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.xml]
02:08:12,841 |-INFO in ch.qos.logback.classic.BasicConfigurator@e15b7e8 - Setting up default configuration.
02:08:13,700 |-INFO in ch.qos.logback.core.joran.spi.ConfigurationWatchList@1b2abca6 - URL [jar:file:/kafka-ui-api.jar!/BOOT-INF/classes!/logback-spring.xml] is not of type file
02:08:13,824 |-INFO in ch.qos.logback.core.model.processor.AppenderModelHandler - Processing appender named [STDOUT]
02:08:13,824 |-INFO in ch.qos.logback.core.model.processor.AppenderModelHandler - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
02:08:13,859 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - This appender no longer admits a layout as a sub-component, set an encoder instead.
02:08:13,859 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
02:08:13,859 |-WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
02:08:13,860 |-INFO in ch.qos.logback.classic.model.processor.RootLoggerModelHandler - Setting level of ROOT logger to INFO
02:08:13,860 |-INFO in ch.qos.logback.classic.jul.LevelChangePropagator@6392827e - Propagating INFO level on Logger[ROOT] onto the JUL framework
02:08:13,860 |-INFO in ch.qos.logback.core.model.processor.AppenderRefModelHandler - Attaching appender named [STDOUT] to Logger[ROOT]
02:08:13,860 |-INFO in ch.qos.logback.core.model.processor.DefaultProcessor@2ed2d9cb - End of configuration.
02:08:13,860 |-INFO in org.springframework.boot.logging.logback.SpringBootJoranConfigurator@d5b810e - Registering current configuration as safe fallback point

 _   _ ___    __             _                _          _  __      __ _
| | | |_ _|  / _|___ _ _    /_\  _ __ __ _ __| |_  ___  | |/ /__ _ / _| |_____
| |_| || |  |  _/ _ | '_|  / _ \| '_ / _` / _| ' \/ -_) | ' </ _` |  _| / / _`|
 \___/|___| |_| \___|_|   /_/ \_| .__\__,_\__|_||_\___| |_|\_\__,_|_| |_\_\__,|
                                 |_|                                             

2025-04-07 02:08:13,919 INFO  [background-preinit] o.h.v.i.u.Version: HV000001: Hibernate Validator 8.0.0.Final
2025-04-07 02:08:14,022 INFO  [main] c.p.k.u.KafkaUiApplication: Starting KafkaUiApplication using Java 17.0.6 with PID 1 (/kafka-ui-api.jar started by kafkaui in /)
2025-04-07 02:08:14,022 DEBUG [main] c.p.k.u.KafkaUiApplication: Running with Spring Boot v3.0.6, Spring v6.0.8
2025-04-07 02:08:14,023 INFO  [main] c.p.k.u.KafkaUiApplication: No active profile set, falling back to 1 default profile: "default"
2025-04-07 02:08:16,472 DEBUG [main] c.p.k.u.s.SerdesInitializer: Configuring serdes for cluster local
2025-04-07 02:08:16,949 INFO  [main] o.s.b.a.e.w.EndpointLinksResolver: Exposing 2 endpoint(s) beneath base path '/actuator'
2025-04-07 02:08:16,979 INFO  [main] o.s.b.a.s.r.ReactiveUserDetailsServiceAutoConfiguration: 

Using generated security password: ea329ee7-fe3f-4a3a-a2d1-6ca6a90572fb

2025-04-07 02:08:17,107 WARN  [main] c.p.k.u.c.a.DisabledAuthSecurityConfig: Authentication is disabled. Access will be unrestricted.
2025-04-07 02:08:17,378 INFO  [main] o.s.b.w.e.n.NettyWebServer: Netty started on port 8080
2025-04-07 02:08:17,401 INFO  [main] c.p.k.u.KafkaUiApplication: Started KafkaUiApplication in 4.307 seconds (process running for 5.057)
2025-04-07 02:08:18,006 DEBUG [parallel-2] c.p.k.u.s.ClustersStatisticsScheduler: Start getting metrics for kafkaCluster: local
2025-04-07 02:08:18,012 INFO  [parallel-2] o.a.k.c.a.AdminClientConfig: AdminClientConfig values: 
        bootstrap.servers = [kafka1:19092, kafka2:19092, kafka3:19092]
        client.dns.lookup = use_all_dns_ips
        client.id = kafka-ui-admin-1743991698-1
        connections.max.idle.ms = 300000
        default.api.timeout.ms = 60000
        metadata.max.age.ms = 300000
        metric.reporters = []
        metrics.num.samples = 2
        metrics.recording.level = INFO
        metrics.sample.window.ms = 30000
        receive.buffer.bytes = 65536
        reconnect.backoff.max.ms = 1000
        reconnect.backoff.ms = 50
        request.timeout.ms = 30000
        retries = 2147483647
        retry.backoff.ms = 100
        sasl.client.callback.handler.class = null
        sasl.jaas.config = null
        sasl.kerberos.kinit.cmd = /usr/bin/kinit
        sasl.kerberos.min.time.before.relogin = 60000
        sasl.kerberos.service.name = null
        sasl.kerberos.ticket.renew.jitter = 0.05
        sasl.kerberos.ticket.renew.window.factor = 0.8
        sasl.login.callback.handler.class = null
        sasl.login.class = null
        sasl.login.connect.timeout.ms = null
        sasl.login.read.timeout.ms = null
        sasl.login.refresh.buffer.seconds = 300
        sasl.login.refresh.min.period.seconds = 60
        sasl.login.refresh.window.factor = 0.8
        sasl.login.refresh.window.jitter = 0.05
        sasl.login.retry.backoff.max.ms = 10000
        sasl.login.retry.backoff.ms = 100
        sasl.mechanism = GSSAPI
        sasl.oauthbearer.clock.skew.seconds = 30
        sasl.oauthbearer.expected.audience = null
        sasl.oauthbearer.expected.issuer = null
        sasl.oauthbearer.jwks.endpoint.refresh.ms = 3600000
        sasl.oauthbearer.jwks.endpoint.retry.backoff.max.ms = 10000
        sasl.oauthbearer.jwks.endpoint.retry.backoff.ms = 100
        sasl.oauthbearer.jwks.endpoint.url = null
        sasl.oauthbearer.scope.claim.name = scope
        sasl.oauthbearer.sub.claim.name = sub
        sasl.oauthbearer.token.endpoint.url = null
        security.protocol = PLAINTEXT
        security.providers = null
        send.buffer.bytes = 131072
        socket.connection.setup.timeout.max.ms = 30000
        socket.connection.setup.timeout.ms = 10000
        ssl.cipher.suites = null
        ssl.enabled.protocols = [TLSv1.2, TLSv1.3]
        ssl.endpoint.identification.algorithm = https
        ssl.engine.factory.class = null
        ssl.key.password = null
        ssl.keymanager.algorithm = SunX509
        ssl.keystore.certificate.chain = null
        ssl.keystore.key = null
        ssl.keystore.location = null
        ssl.keystore.password = null
        ssl.keystore.type = JKS
        ssl.protocol = TLSv1.3
        ssl.provider = null
        ssl.secure.random.implementation = null
        ssl.trustmanager.algorithm = PKIX
        ssl.truststore.certificates = null
        ssl.truststore.location = null
        ssl.truststore.password = null
        ssl.truststore.type = JKS

2025-04-07 02:08:18,045 INFO  [parallel-2] o.a.k.c.u.AppInfoParser: Kafka version: 3.3.1
2025-04-07 02:08:18,045 INFO  [parallel-2] o.a.k.c.u.AppInfoParser: Kafka commitId: e23c59d00e687ff5
2025-04-07 02:08:18,045 INFO  [parallel-2] o.a.k.c.u.AppInfoParser: Kafka startTimeMs: 1743991698044
2025-04-07 02:08:18,279 DEBUG [parallel-10] c.p.k.u.s.ClustersStatisticsScheduler: Metrics updated for cluster: local
2025-04-07 02:08:47,419 DEBUG [parallel-1] c.p.k.u.s.ClustersStatisticsScheduler: Start getting metrics for kafkaCluster: local
2025-04-07 02:08:47,460 DEBUG [parallel-6] c.p.k.u.s.ClustersStatisticsScheduler: Metrics updated for cluster: local
2025-04-07 02:09:17,405 DEBUG [parallel-7] c.p.k.u.s.ClustersStatisticsScheduler: Start getting metrics for kafkaCluster: local
2025-04-07 02:09:17,437 DEBUG [parallel-2] c.p.k.u.s.ClustersStatisticsScheduler: Metrics updated for cluster: local
2025-04-07 02:09:47,407 DEBUG [parallel-3] c.p.k.u.s.ClustersStatisticsScheduler: Start getting metrics for kafkaCluster: local
2025-04-07 02:09:47,453 DEBUG [parallel-8] c.p.k.u.s.ClustersStatisticsScheduler: Metrics updated for cluster: local
ahn@Mac study-kafka-message-queue %
  • docker compose exec {컨테이너 서비스명} {컨테이너 안에서 실행할 명령어}
    • 특정 컨테이너 내부에서 명령어 실행 하기
    • error 발생 
ahn@Mac study-kafka-message-queue % docker compose exec kafka1 kafka-topics.sh --create --topic my-topic --bootstrap-server localhost:9092,localhost:9093,localhost:9094 --replication-factor 1 --partitions 1

[2025-04-07 03:31:03,427] WARN [AdminClient clientId=adminclient-1] Connection to node 3 (localhost/127.0.0.1:9094) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)

[2025-04-07 03:31:03,428] WARN [AdminClient clientId=adminclient-1] Connection to node 2 (localhost/127.0.0.1:9093) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)

해당 부분은 수정 후 패캠 커뮤니티에 올렸다. (나같은 삽질 하지말라고.. ㅋㅋ)

https://fastcampus.co.kr/community/100810

 

파트2 에서 topic 안만들어지시는 분들.(특히 맥) | 패스트캠퍼스

패스트캠퍼스 커뮤니티 | 질문/답변

fastcampus.co.kr

 

 

아 실습.. 기쁘다..

 

블로그 이미지

감동맨

rkaehdaos의 블로그

,

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
https://bit.ly/4hTSJNB


I. 학습 인증샷 4장 이상 포함

1. 공부시작: 날짜, 시각 다 나오도록

공부 시작

2. 공부 종료: 날짜 시각 다 나오도록

공부 종료

3. 1개 클립 수강 (강의장 목록 캡쳐, 수강화면이 보이지 않도록) 1장

clip32

4. 학습 인증샷 1장(필기 촬영이나 작업물 촬영)

아 드디어 실습..


II. 학습 후기 700자 이상 (공백 제외)

드디어 이론 편이 끝나고 백엔드 파트이다.. 첫시작은 OTfh 파트2의 전체적인 내용을 설명하고 있다.

  •  Spring/Java를 활용하여 백엔드 개발에서 Apache Kafka를 사용하는 방법을 초보자에게 설명하는 데 초점이 맞춰져 있다고 한다. (기쁘다)
  •  선수 지식으로 메시징 큐 이론, Spring Boot, Java에 대한 기본 이해가 요구된다고 한다.

개발 환경 및 기술 스택

  • 실습 환경:
    • JDK 17
    • Spring Boot 3.2.0
    • IntelliJ Ultimate IDE.
  • 인프라:
    • Apache Kafka 3.6.0
    • Zookeeper 3.7.2
    • MySQL 8.0.35
    • Docker Desktop 및 Docker Compose.
      • 모든 인프라는 도커환경에서 사용되는 것 같다
  • 주요 라이브러리: `spring-kafka` 사용

Kafka 관련 도구 소개

  • Kafka CLI: 명령줄 도구로 토픽 생성, 수정, 삭제 등을 수행.
  • Kcat: 메시지 생산 및 소비를 테스트하는 도구.
  • CMAK: 클러스터 관리 도구로 브로커 상태를 시각화.
  • Redpanda Console 및 Kafka UI: Kafka 클러스터를 시각적으로 관리하는 웹 기반 도구.

실습 준비

  • Github 저장소 클론
    • develop 브렌치는 초기 상태이며, release 브렌치는 완성 상태
    • 중간부터 실습 하고 싶은 경우 branch로 체크 포인트를 제공하는 것 같다.
  • docker 실행
    • docker compose로 환경을 세팅 가능
  • IntelliJ IDEA 설치 및 프로젝트 초기 상태에서 시작 가능.

---
드디어 기다리던 실습이다.

  • 솔직히 이론 너무 길었다 ㅠㅠ
  • 초보자에게 맞게 도구 소개부터 시작한다.
    위 이미지에서 보듯 도구만 봐도 생소한게 너무 많아서 공부에 도움이 될 것 같다
  • 개발환경 세팅도 내가 관심하는 스프링 클라우드 방법도 알려준다고 해서 기대가 크다.
  • 깃허브 저장소와 환경 구성도 강사님이 제공하는 docker compose로 바로 환경설정이 가능한듯하다.
  • 실습에서 jpa나 mysql등 카프카 실습과 더불어서 사용되는 기술은 크게 다루지 않는다고 한다.
  • Kafka CLI와 Kcat 같은 도구를 사용해 직접 토픽을 생성하고 메시지를 생산/소비해보는 실습이 기대된다.

 

블로그 이미지

감동맨

rkaehdaos의 블로그

,

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
https://bit.ly/4hTSJNB


I. 학습 인증샷 4장 이상 포함

1. 공부시작: 날짜, 시각 다 나오도록

공부 시작

2. 공부 종료: 날짜 시각 다 나오도록

공부 종료

3. 1개 클립 수강 (강의장 목록 캡쳐, 수강화면이 보이지 않도록) 1장

clip31 Kraft Mode

4. 학습 인증샷 1장(필기 촬영이나 작업물 촬영)

주키퍼 모드와 KRaft모드.. ㅅㅂ 주키퍼 이론 왜 배운거냐.


II. 학습 후기 700자 이상 (공백 제외)

이번 강의는 슬라이드도 제공하지 않는다. ㅅㅂ

요약

 Zookeeper의 역할

Zookeeper

  • 메타 정보 저장
    • broker IDs
    • racks
    • topics
    • partions
    • ISR information
  • 아래의 상황에 사용.
    • Controller election
    • Watchers to determine broker availability
  • 요약 
    • Kafka 의 쿼럼 및 메타데이터 관리를 포함하여 많은 중요한 분산 시스템 문제를 담당한다.
  • 문제점
    • 제한된 확장성
      • 운영자가 2가지 시스템과 보안 모델을 관리해야 한다
      • 복잡성이 가중된다
    • Zookeeper 데이터가 컨트롤러에 반영되어야 한다.
      • 이중 캐싱 문제
      • 비동기화 상태 가능성 존재

KIP-500

  • Zookeeper를 Kafka 자체의 일부인 메타데이터 관리 서비스로 대체하기 위한 카프카 개선제한

KRaft에서는 컨트롤플레인과 Data 플레인 구분이 ZK모드와 많이 다르다.

KRaft

  • Zookeeper를 대체하는 새로운 메타데이터 관리 메커니즘
  • KRaft는 Kafka를 더욱 사용하기 쉽고 효율적으로 만듬
  • KRaft = Kafka + Raft Metadata Consensus

KRaft 장점

예기된 셧다운과 예기치 못한 셧다운 복구시간.. 예기치 못한 장애 복구 시간이 비교가 되지 않는다.

  • 카프카 관리 및 배포 단순화
    • 주키퍼를 안배워도 된다..
      • 아니 이론에서 계속 나와서 공부했었는데
      • 아니 이러면 지금까지 Zookeeper 이론은 왜 배운거에요 ㅠㅠ
  • 카프카 클러스터를 수백만 개의 파티션으로 확장
    • 기존 주키퍼의 제한성 : 수백만개 확장은 제한됨
    • 굉장히 높은 수의 파티션 수가 가능해짐
  • 카프카의 안정성 및 장애 조치 성능 향상
    • 위 그림에서 보듯이 예기치 않은 장애 복구 장애가 탁월하다.

KRaft 하드웨어 권장 사항

  • 일반적으로 ZK를 실행하는 서버와 사양이 비슷한 서버에서 KRaft를 실행
  • 운영 권장사양
    • 최소 4GB RAM
    • 서버를 공유하는 경우(vm) 전용 cpu 코어 할당을 고려해야 한다
    • 최소 64GB SSD 권장
    • 최소 1GB Heap Memory 권장

이론편 파트1 끝이다..

  • 이론편 강의 자체는 나쁘지 않음
    • 이론편의 강의 퀄은 좋은 것 같다. 다른 어떤 곳에서도 찾을수가 없다.
  • 다만 지금 판단으론 이론 실습 이론 실습 이렇게 해야 하지 않을까 싶다. 왜냐면
    • 이론편의 후반인 트러블 슈팅 및 운영환경 튜닝은.... 제일 나중에 나와야 하지 않았을까 싶다.
    • 솔직히 나중에 보고 써먹을 강의 슬라이드 말고는 기억에 잘 남지 않는다.
    • 트러블 슈팅과 튜닝은 계속 상황에 맞게 조절하도록 명령어들이 나오는데 실제로  써먹질 못하니
    • 환급 아니었으면 솔직히 건너 뛰고 실습편 다 하고 마지막에 봤을 것 같음
  • 드디어 다음부터 실습편이다. 
블로그 이미지

감동맨

rkaehdaos의 블로그

,

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
https://bit.ly/4hTSJNB


I. 학습 인증샷 4장 이상 포함

1. 공부시작: 날짜, 시각 다 나오도록

공부 시작

2. 공부 종료: 날짜 시각 다 나오도록

공부 종료

3. 1개 클립 수강 (강의장 목록 캡쳐, 수강화면이 보이지 않도록) 1장

clip30: 3번째 튜닝.. ㅠㅠ

4. 학습 인증샷 1장(필기 촬영이나 작업물 촬영)

병렬처리 최대화


II. 학습 후기 700자 이상 (공백 제외)

또 튜닝.. 마지막이다... 진짜..Consumer 튜닝에 대한 내용이다.

  • Kafka Consumer Group의 병렬 처리를 최적화하는 방법을 설명한다
    • 각 Partition은 특정 Consumer Group의 단일 Consumer에 의해서만 소비된다
    • Consumer는 Topic내의 다수의 Partition들을 Consume할 수 있다
    •  Partition Assignment Strategy에 따라 어떤 Partition이 어떤 Consumer에게 할당되는지가 결정된다
    • Strategy 종류
      • Range
      • RoundRobin
      • Sticky
      • CooperativeSticky
      • Custom
    • 하나의 Consumer Group에 둘 이상의 Consumer들을 추가하여 Consume 작업을 병렬화 할 수 있습니다.
  • Consumer Liveness
    • 각 Consumer는 전용 Thread를 통해 Group Coordinator(Broker)에게 주기적인 Liveness Signal를 보냄
    • session.timeout.ms 이상 Liveness Signal 이 수신되지 않으면
      • Consumer는 죽은 것으로 간주
      • Group Coordinator는 Partition 재할당을 Trigger
    •  나머지 Consumer Group 구성원에 대한 Partition 할당 계산은 Group Leader에게 위임
    • 그런 다음 Group Coordinator는 Group의 각 Consumer에게 새 Partition 할당을 전달
    • heartbeat.interval.ms
      • 두 개의 연속 하트비트 신호 사이의 간격이 얼마나 긴지 정의
    • Consumer의 Liveness Thread가 여전히 작동하지만,
      데이터에
      대한 Polling을 수행하는 Main Thread가 ”hang”이 걸려서 max.poll.interval.ms 을 초과하면
      해당 Consumer는 죽은
      것으로 간주
    • Group Coordinator 가 Partition 재할당을 Trigger합니다.
  • Consumer Group Join/Leave:
    • Consumer가 그룹에 Join하거나 Leave할 때 발생하는 Rebalancing 과정과 Group Coordinator의 역할 설명.

---

  • Apache Kafka에 대한 첫걸음을 떼기 위해 이 강의를 구매했는데....
  • 처음에는 이론부터 알려줘서 좋은데.. 현재 튜닝과 최적화까지 이론으로 계속 접하니... 이제 이게 맞는지 아리송하다..
  • 일단 Consumer 튜닝과 관련된 다양한 설정 옵션을 설명하는 강의이다.
  • 병렬 처리 최대화에 대한 내용은 심플하지만 명확한 지침을 주고 있다
    • 각 Partition은 특정 Consumer Group의 단일 Consumer에 의해서만 소비된다
    • Consumer는 Topic내의 다수의 Partition들을 Consume할 수 있다
  • 이 2가지의 명제는 변하지 않는다.opic의 Partition 수보다 Consumer가 많으면 일부 Consumer가 Idle 상태로 남는다는 점이 앞선 강의부터 계속 반복된다.
  • Offset Commit 전략은 Kafka가 얼마나 유연한 시스템인지(그리고 공부하기 얼마나 그지 같은지) 느끼게 해준 부분이다
    • Auto Commit은 간단하지만 중복 처리 가능성이 있고,
    • Manual Commit은 복잡하지만 더 정교한 제어가 가능하다
    • 특히 commitSync()와 commitAsync()의 차이를 배우며 상황에 맞게 설정을 조정해야 한다는 점이 
      미치게 한다( 상황에 맞게 설정을 그러니까 어떻게)
    • Partition 개수를 몇 개로 설정하는 것이 이상적일까?
      • 강의에서는  Broker 수와 Consumer 수를 고려하라고 했지만,
        실제로 어떤 기준으로 결정해야 하는지 더 구체적인 사례를 절대 주지 않는다
    • Fetch Request에서 fetch.min.bytes와 fetch.max.wait.ms를 조정할 때,
      Latency와 Throughput 간의 균형점을 어떻게 찾아야 하는가?
      • 삽질 안하도록 구체적인 가이드를 줬으면 좋겠다...
      • 하지만 주지 않는다 ㅠ
블로그 이미지

감동맨

rkaehdaos의 블로그

,

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
https://bit.ly/4hTSJNB


I. 학습 인증샷 4장 이상 포함

1. 공부시작: 날짜, 시각 다 나오도록

2. 공부 종료: 날짜 시각 다 나오도록

공부 종료

3. 1개 클립 수강 (강의장 목록 캡쳐, 수강화면이 보이지 않도록) 1장

clip29 아니 또 튜닝..

4. 학습 인증샷 1장(필기 촬영이나 작업물 촬영)

Rebalancing등으로 극단적으로 모든 네트워크 자원 사용으로 운영에 위협을 받지 않도록 쿼터를 줘서 보호한다.


II. 학습 후기 700자 이상 (공백 제외)

....역시 튜닝이다... 이번엔 프로듀서

요약

 1.  데이터 포맷 및 직렬화/역직렬화

 

Deserializer (kafka 3.6.2 API)

An interface for converting bytes to objects. A class that implements this interface is expected to have a constructor with no parameters. Implement ClusterResourceListener to receive cluster metadata once it's available. Please see the class documentation

kafka.apache.org

 

 

Serializer (kafka 3.6.2 API)

An interface for converting objects to bytes. A class that implements this interface is expected to have a constructor with no parameter. Implement ClusterResourceListener to receive cluster metadata once it's available. Please see the class documentation

kafka.apache.org

 

 

2 . AVRO 권장

  • HDFS에 Persistent Data를 저장하기 위해 널리 사용되는 컴팩트 바이너리 형식에 대한 Data Serialization Standard
  • 카프카 외에도 하둡에서도 널리 사용되므로 지원 도구가 많음
  • SON과 직접 맵핑
  • 매우 콤팩트한 Format을 가지고 있으며, 매우 빠름
  • 다양한 프로그래밍 언어에 대한 뛰어난 바인딩
    • 이벤트 데이터 작업을 더 쉽게 만드는 자바 객체 생성 가능
  • 데이터 파일을 읽거나 쓰거나 RPC 프로토콜을 사용하거나 구현하는 데 코드 생성이 필요하지 않음
    • 코드 생성은 선택적 최적화 방안
  • 순수 JSON으로 정의된 풍부하고 확장 가능한 스키마 언어 존재.
  • 시간이 지남에 따라 데이터가 발전할 수 있도록 최고의 호환성 개념을 가지고 있음
  • https://www.confluent.io/blog/avro-kafka-data/
 

Why Avro for Kafka Data? | Confluent

Confluent is building the foundational platform for data in motion so any organization can innovate and win in a digital-first world.

www.confluent.io

3. 중요 설정 파라미터

  • `batch.size`: 메시지를 묶어서 처리하는 크기.
  • `linger.ms`: 메시지 전송 전 대기 시간.
  • `buffer.memory`: 프로듀서가 사용할 수 있는 메모리 크기.
  • `acks`: 메시지 내구성(Durability)에 영향을 미치는 옵션.
  • 2

4. 파티셔닝 전략

  • 기본적으로 키의 해시값을 기반으로 파티션에 데이터를 분배.
  • 일반적으로는 대부분 상황에서  맞음
  • 특정 상황(기본 전략에서 불균형이 이루어지는 )에서는 커스텀 파티셔닝 전략이 필요할 수 있음.
    • 최대한 분배가 되도록 파티셔닝 전략

5. 압축 및 처리량 최적화

  • 메시지 압축을 통해 네트워크 효율성을 높임 (gzip, snappy, zstd 등 지원).
  • Throughput(처리량), Latency(지연시간), Durability(내구성) 등 서비스 목표에 따른 최적화 값을 제시해준다.
    (그래 이걸 원했다..정답을 주세요)
  •  

---

  • 튜닝 2번째 시간이다. (아무리 생각해도..에바다...해보지도 않고 튜닝...)
  • 데이터 포맷과 직렬화/역직렬화**에 대한 상세내용을 복습한다
  • 실제 제공하는 데이터 포맷이 많다.
  •  AVRO!
    • AVRO가 빠르고 가볍다는 점,
    • 그리고 컴팩트 표준을 지향하고 있다는 부분
    • 다양한 언어와의 호환성이 뛰어나다는 점
    • 사실상  Kafka를 사용할 때 AVRO를 꼭 써라라는 분위기의 설명이다.
    • 설정과 튜닝시 중요한 파라미터를 다룬 부분은 어느 정도 도움이 된다.
      • 튜닝에 대한 부분은 아무리 생각해도 이상하지만 그래도 어느 정도의 기본 값을 설명하는 부분에서
        실전에서 바로 적용할 수 있을 것 같다.
      • (하지만 이 수업은  한번도 카프카 명령어를 쳐본적이 없다.)
      • 예를 들어, `batch.size`와 `linger.ms`를 조정하면 처리량을 크게 개선할 수 있다는 점은 알겠지만,
        실제 환경에서 바로 적용해 보고 싶다는 생각이 들었다. (하지만 해볼 수 없다.) 이게 수업에 집중력이 떨어지는 요인이다.
      • 언제까지 이론을..
      • 여튼 각 설정이 시스템 성능에 어떤 영향을 미치는지를 이해하는 것도 초보자에게는 중요하니까..
    • 강의에서는 기본 해시 기반 전략이 대부분의 경우 적합하다고 설명했지만, 데이터가 특정 키에 집중되는 경우 불균형 문제가 발생할 수 있으, 이때는 커스텀 전략을 설계해야 한다고 한다.
      • 이런 경우 실제로 어떻게 커스텀 전략을 설계하는지 예시가 더 필요하다
      • 또한 불균형 문제가 생기는 상황이나 시나리오도 몇가지 알려주면 좋을텐데
    • 여러 압축 방식(gzip, snappy, zstd 등)을 소개했는데, 각각의 방식이 성능에 미치는 영향을 비교했으면 어땠을까?
      • 예를 들어, 네트워크 대역폭이 제한된 환경에서는 어떤 압축 방식이 가장 효율적인가

여튼..길면서도 어렵다..

블로그 이미지

감동맨

rkaehdaos의 블로그

,

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
https://bit.ly/4hTSJNB


I. 학습 인증샷 4장 이상 포함

1. 공부시작: 날짜, 시각 다 나오도록

공부 시작

2. 공부 종료: 날짜 시각 다 나오도록

공부 종료

3. 1개 클립 수강 (강의장 목록 캡쳐, 수강화면이 보이지 않도록) 1장

clip28

4. 학습 인증샷 1장(필기 촬영이나 작업물 촬영)


II. 학습 후기 700자 이상 (공백 제외)

브로커 튜닝에 다루고 있다.

  •  브로커 및 토픽 모니터링, 성능 최적화 가이드라인, 프로듀서 요청 처리 메커니즘 등을 설명한다.
  • 다른 동영상에 비해 엄청 길다.
  • 브로커의 네트워크/디스크 리소스 관리, 파티션 리더 분배 전략, 로그 압축 시 주의사항 등 실무적 가이드라인을 제시한다.
    (튜닝은 에바지만.. 권장 값을 준다는 면에서는 너무 초보자에게 필요한 부분이다.)
  • 브로커 간 리더십 분배 원리쪽을 보고 기존 내가 생각했던 아키텍처를 다 뒤집어야 했다.
    • 리더 1대가 팔로워 2대보다 4배 많은 부하를 처리한다는 설명을 보며 파티션 배분의 중요성을 다시 한번 실감
    • 위의 그림에서 봤듯이 잘못하면 12배가 될 수도..
  • 충분한 OS Page 캐시가 필요하다!
    • 아주 중요한 부분이다.
    • 하지만 이 충분한(!)이라는 단어가 얼마나일까?
    • 해당 캐시에 대한 값들도 제시해줬으면
    • 아니면 실제 운영에 반영할 수 있는 캐시 관리 팁이라도 알려주면 좋았을 텐데..
  • 프로듀서 요청 처리 단계의  다이어그램으로 설명한 부분은 아무리봐도 잘 이해가 안된다...
  • 네트워크 스레드와 I/O 스레드의 협업 과정을 반복 학습하니 메시지 전달 부분은 조금 와닿기는 한데..어렵다.
  • '로그 압축 실패 시 파티션이 무한히 커진다'
    • 역시 추가적인 메모리와 cpu리소스가 필요하다라고만 할뿐 구체적인 값을 주지 않는다.
    • 그나마 튜닝값들을 보면 기본값이 있으니 거기서부터 조절이 가능한 부분이라는 것을 알게되는 부분
  • 성능 체크 리스트는 아주 도움이 될 것 같다.
    • CPU 사용률 확인, 네트워크 대역폭 포화 상태 진단 등 구체적인 항목들이 적혀있다.
    • 하지만 'num.io.threads' 값을 증가시키면 처리량이 개선된다'라는 문구를 보고 또 좌절했다.
      • 스레드 풀 크기와 하드웨어 사양의 상관관계를 어떻게 계산해야 하는가? ㅠ
  • 메시지 크기는 1MB 를 초과하면 안된다.
    • Blob저장소의 payload를 저장하고 실제 메시지의 payload에  blob저장소의 uri를 전달하라고 가이드 되어있다.
    • 1메가는 생각보다 너무 적긴하다.
    • 큰 메시지가 꼭 필요한 경우에는 어떤 방법을 써야할까? ...알려주진 않는다.

아무리 봐도 이 강의는...목차가 잘못되었다.....에바다...
아니 실습 한번 안해보고 바로 트러블슈팅에 이제 튜닝이 나온다..이게 의미가 있는가?
실제로 뭘 해보면서 튜닝을 해야 하는게 아닐까? ㅠㅠ
그나마 위안은.. 기본 가이드라인에서 주는 값들..정도..

블로그 이미지

감동맨

rkaehdaos의 블로그

,