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

 


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

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

공부 시작

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

공부 종료

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

이전의 토픽 생성이 카프카 실습이었다면, 이제는 스프링 프로젝트를 위한 카프카 토픽 생성이다.

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

카프카ui를 통한 토픽만들기, 강사님이 설정해둔 컨테이너로 접속해서 만든다. ..위의 날짜는 카프카 프로젝트의 github commit 날짜다.


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

토픽을 생성하는 학습이다. 지금까지 실습해서 늘 해왔던..


기존과 다른 점은
일단 지금까지 토픽의 생성은 카프카의 프로듀스와 컨슘을 이해하기 위한 실습의 토픽 생성이었다면,
이번의 토픽 생성은 스프링 프로젝트에 연결하기 위한 프로젝트의 토픽 생성이란 부분이다.

또한 지금까지 kafka CLI를 통해 만들었던 것과 달리
이번 주에 배웠던 카프카 ui를 이용한 토픽을 생성하는 부분이
다른 부분이 되겠다.

cli를 통한 것돠 매우 다른 경험이다.

스프링 어플리케이션 레벨에서 해당 토픽이 없으면 자동으로 생성하고,
있으면 자동으로 생성하게 끔 할 수가 있다. 강사님은 해당 부분을 끄라고 하신다.

해당 기능을 쓰지 않는 이유
- 위의 기능으로 토픽을 암시적으로 만들지 않고 명시적으로 토픽을 생성하는 방법의 중요성을 강의에서 가르키는 것 같다

  • 파티션 수 조절
  • 설정 값 원하는 대로 조정
  • 더 안정적인 운영 가능

토픽생성 미리 정해줄 수 있는 옵션들을 보면서 운영에 따라 각각 설정을 다르게 줄 수 있다.

설정값

  • Number of Partitions(필수값): 3
    • 현재 실습 환경의 broker가 3개이다.
    • 따라서 파티션 수를 3으로 정하면 각각의 broker에 하나씩 리더 파티션이 할당 되게 된다.
    • 현재 실습 환경에서 적합한 값
    • 운영환경이라면 안정된 운영이 가능할 것이다.
  • Replication Factor: 2
    • 장애상황에서도 데이터를 안전하게 보호하기 위한 최소한의 복제 파티션을 유지하기 위한 상황
    • 카프카 다루는게 미숙해서 단순하게 이용하는 것이 더 중요한 경우 1로 두는 것을 강사님은 권장하심
    • 그래도 최대한 똑같이 해야지 않나 싶어서 난 2로 했다. 
    • 하다가 안되면 1로 바꾸던가 할 순 있겠지만 시작부터 1로 하는 것은... 아닌 것 같다.
  • Time to retain data : 7 day
    • 로그를 연동해서 사용하는 케이스의 경우 데이터가 엄청 많을 수 있기 때문에
      해당 케이스의 경우 12시간이나 하루로 설정을 해야 한다.
    • 실습 환경에서는 7일로 설정한 것으로 보아
      일반적으로는 7일로 설정하는 것이 무방할지도
    • 실제 운영에서는 데이터 쌓이는 속도와 디스크 용량을 보면서 조절을 해야 하는 듯 싶다.

 

처음 프로젝트 실행

여기서 엄청 애먹었는데... ㅠㅠ
아무리봐도 실습이 안되는데...
내가 완성된 예제 branch를 보고 있었다..아오
처음엔 1-run-project라는 branch로 보면 hello world만 찍히는 처음 세팅만 된 환경을 볼 수 있다.
강사님이 너무 친절하게 다 환경을 만들어 놓으셨네..

hello 뿐이지만 swagger-ui가 붙어있는 실습 환경이라 학습하기 좋은 실습 환경이 구성되어 있다.

토픽을 만들고 이제 저 보일러 플레이트에서 개발을 시작하는 듯 하다.

블로그 이미지

감동맨

rkaehdaos의 블로그

,

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

 


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

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

공부 시작

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

공부 종료

 

 

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

실습인 파트2에서 드디어 스프링 프로젝트 등장

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


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

실습파트2에서  드디어 실제 프로젝트를 소개하는 ch3이 시작되는 순간이다.
나는 지금까지 카프카는 `kafka-clients`를 무조건 사용해야 하는지 알고 있었다.

강의에서 내가 몰랐던 2가지를 소개하고 있다.

스프링 부트에서 카프카를 사용하기 위해서는?

  • 내가 사용한 것처럼 `kafka-clients`를 사용하는 경우는
    • Spring의 의존성이 불필요한 경우
    • Spring 버전이 너무 낮아서 Spring kafka 사용이 불가능한 경우
  • 보통은 Spring-kafka나 spring-cloud-stream을 많이 사용한다고 한다

Spring- kafka와 spring-cloud stream의 차이(느낌)

Spring- kafka의 느낌

동일한 Config를 사용하다가 별도의 분리나 설정이 필요하게 된다면???
별도의 컨피규레이션 클래스를 하나 만듬

  • 기본적으로 하나를 만들어서 설정을 재활용 하는 방법 , 필요하면 하나 더 만들기 -> spring cloud의 느낌

 

Spring- cloud-stream 의 느낌

  • 하나의 커다란 Configuration
  • 설정과 비즈니스로직이 완전 분리
  • 하나의 Config에 세분화된 설정을 사용 가능
  • 공통화된 영역도 존재
  •  

그럼 언제 어떻게 사용해야 하나?

  • 라고 gpt에게 물어봄

 

Spring-Kafka

  • 장점
    • Kafka의 고급 기능(예: Kafka Streams, 트랜잭션)을 직접 사용 가능
    • 메시지 송수신을 세밀하게 제어 가능
    • @KafkaListener와 같은 어노테이션을 통해 간단하게 메시지 소비자 생성 가능
    • 실시간 데이터 처리 및 복잡한 데이터 변환 작업에 적합.
  • 단점
    • Kafka에 특화되어 있어 다른 메시징 시스템과의 통합이 어려움.
  • 적합한 상황
    • Apache Kafka만 사용하는 환경
    • 실시간 분석, 복잡한 스트림 처리 또는 데이터 변환이 필요한 경우
    • Apache Kafka만 사용하는 환경에서 고성능 실시간 데이터 처리가 필요한 경우
    • 개발자가 Kafka의 내부 동작을 잘 이해하고 있는 경우.
    • 복잡한 스트림 처리(예: 데이터 집계, 변환, 윈도우 연산 등)가 요구되는 애플리케이션.
    • 시스템이 이미 Kafka 중심으로 설계되어 있고, 세부적인 제어가 필요한 경우.

Spring-cloud-stream

  • 장점
    • Binder 추상화를 통해 다양한 메시징 시스템과 쉽게 통합 가능
    • 선언적 프로그래밍 모델로 빠른 개발 가능
    • 이벤트 중심 마이크로서비스 아키텍처 구축에 최적화
    • Spring Cloud와의 자연스러운 통합으로 확장성과 관리 용이성 제공
  • 단점
    • Kafka의 고급 기능(예: Streams API)에 대한 접근이 제한적.
    • 추상화가 많아 성능 최적화나 세부 제어가 어려울 수 있음.
  • 적합한 상황:
    • 다양한 메시징 시스템을 사용하는 환경
    • 여러 메시징 시스템(Kafka, RabbitMQ 등)을 통합해야 하는 환경.
    • 이벤트 중심 마이크로서비스를 빠르게 구축해야 하는 경우.
    • Spring 생태계를 사용하는 팀에서 빠른 개발과 배포가 중요한 경우.
    • Spring Boot와 Spring Cloud를 사용하는 팀에서 생산성과 유지보수성을 중요하게 여기는 경우.

 

  • spring-kafka는 kafka-clients를 의존
  • spring-cloud-stream은 spring-kafka에 의존하고 있음
  • spring-cloud-stream은 kafka만 보고 만든게 아님
    • kafka보단 일반화된 용어를 많이 씀
    • kafka의 topic을 spring-cloud-stream에서는 destination이라고 한다
  • 커스터마이징을 하고 싶다면 spring-cloud-stream
    • kafka-spring은 커스터마이징 하려면 모든 configuration을 각각 커스터마이징을 해야 한다.
    • 추상화가 많아 성능 최적화나 세부 제어가 어려울 수 있음
블로그 이미지

감동맨

rkaehdaos의 블로그

,

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

 


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

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

공부 시작

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

공부 종료

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

카프카 ui??

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

강의시작하자 붙어보라는 localhost:8081의 모습


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

강의 시작은 바로 localhost:8081로 붙어서 실습이 시작되지만...일단 똥인지 된장인지 알아야지?

Kafka UI는 뭘까?

 오픈소스 웹 기반 도구

  • Apache Kafka 클러스터를 관리하고 모니터링하기 위한 오픈소스 웹 기반 도구 인 듯 하다
  • 직관적인 사용자 인터페이스를 제공하여 Kafka의 주요 기능을 쉽게 접근하고 관리할 수 있도록 설계 
  • 특히, Kafka UI는 다중 클러스터 관리, 성능 모니터링, 메시지 브라우징 등 다양한 기능을 지원

Kafka UI의 주요 기능 (구글링)

  • 다중 클러스터 관리: 여러 Kafka 클러스터를 한 화면에서 모니터링하고 관리
  • 성능 모니터링: 브로커, 토픽, 파티션, 생산 및 소비 지표를 실시간으로 추적할 수 있는 경량 대시보드를 제공
  • 토픽 관리:  토픽 생성, 삭제, 설정 변경이 가능하며, 각 토픽의 파티션 수, 복제 상태 및 사용자 정의 구성을 확인 가능
  • 컨슈머 그룹 관리: 토픽 생성, 삭제, 설정 변경이 가능하며, 각 토픽의 파티션 수, 복제 상태 및 사용자 정의 구성을 확인 가능
  • 메시지 브라우징: JSON, Plain Text, Avro 인코딩을 지원하여 토픽 메시지를 탐색하고 필터링 가능
  • 스키마 레지스트리 통합: Avro, JSON Schema, Protobuf 스키마를 등록 및 관리하여 메시지 인코딩을 간소화
  • 보안 및 인증: OAuth 2.0(GitHub, GitLab, Google)을 통한 인증과 역할 기반 접근 제어(Role-Based Access Control)를 지원
  • 데이터 마스킹: 민감한 데이터가 포함된 메시지를 보호하기 위해 데이터 마스킹 기능을 제공
역시 앞선 시간의 레서판다와 마찬가지로 설치와 설정에 대해서는 강의에서 나오지 않는다.
운영 전에 해당 부분은 따로 실습해보고 설치가 필요해 보임.
실습환경의 docker-compose를 보면 환경을 딸 수 있을 듯 하다.

RedPanda처럼 메시지와 검색등을 제공한다.

아니.. 이게 최종 선택일 듯

  • 지금 하루에 한번씩 내가 선택한 툴이 바뀌는데...
  • 일단 더 모던한  느낌?
    • 정보 자체는 CMAK이나 Redpanda와 비슷한 정보와 ui를 보인다
    • Redpanda에서 감동을 먹었던 view도 똑같이 제공한데 더 세련되어보인다.
    • 일반 테마 다크테마도 지원하는 듯하다.
  • 앞으로 강의에서도 이걸 계속 활용한다고 하니.. 이게 최종이다..
블로그 이미지

감동맨

rkaehdaos의 블로그

,

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
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의 블로그

,