이전의 토픽 생성이 카프카 실습이었다면, 이제는 스프링 프로젝트를 위한 카프카 토픽 생성이다.
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가 붙어있는 실습 환경이라 학습하기 좋은 실습 환경이 구성되어 있다.
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까지 한 번에 볼 수 있다.
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 %
현재 강의에는 특별히 데이터를 만들지 않았으므로 어제 강의의 토픽을 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
# 위의 전시간 읽어온 명령어에서 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보다 더 강력하고 다양한 기능 제공
이라고 한다.
사실 실습만으로는 원래 본거에서 뭐가 그렇게 크게 다른지 모르겠다 오히려 토픽도 못만드는 부분이 더 크게 다가오는데..
# 도커 이미지 다운로드
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)