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

,