[Kafka] ์ปจํ ์ด๋๋ฅผ ์ด์ฉํ Kafka ์ค์น
์ง๋ ํฌ์คํธ์์ ์ฐ๋ฆฌ๋ Kafka๊ฐ ์ด๋ค์์ผ๋ก ๊ตฌ์ฑ๋์๋์ง๋ฅผ ์์๋ดค์ต๋๋ค.
2022.07.31 - [Middleware/Kafka] - [Kafka] ์นดํ์นด์ ์ฝ๋๋ค์ดํฐ Zookeeper
์นดํ์นด๋ฅผ ์ค์นํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
- ์๋ฒ ํธ์คํธ์ ์ง์ ์ค์น
- ์ปจํ ์ด๋๋ฅผ ์ด์ฉํ ์ค์น
์๋ฒ ํธ์คํธ์ ์ง์ ์ค์นํ๋ ๊ฒ์ ํ๊ฒฝ ๋ถ๋ฆฌ ์์ด Homebrew, PPA๋ฅผ ์ด์ฉํด์ ์์ ์ ์๋ฒ ํ๊ฒฝ์ ์ค์นํ๋ ๊ฒ์ ๋๋ค. ๋ ๋ฆฝ๋ ๊ณต๊ฐ์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ์๋ฒ๋ฅผ ์ง์ ์ด์ํ์ฌ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์๋๋ผ๋ฉด ์ด ๋ฐฉ๋ฒ์ ์ถ์ฒ๋๋ฆฌ์ง ์์ต๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ Docker๋ฅผ ์ด์ฉํด ์นดํ์นด๋ฅผ ์ค์นํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Single Node
์ต๋ํ ์ฝ๊ณ ๊ฐ๋จํ๊ฒ ์ค์นํ๊ธฐ ์ํด ์ฑ๊ธ ๋ ธ๋ ๊ตฌ์ฑ์ผ๋ก ์นดํ์นด๋ฅผ ์ค์นํ ๊ฒ์ ๋๋ค.
์ด์ ๊ธ์์๋ ์ฃผํคํผ ํด๋ฌ์คํฐ์ ์ฃผํคํผ ์๋ฒ 2๋ ์ด์(Leader, Follower)์ด ํด๋ฌ์คํฐ ๊ตฌ์กฐ๋ก ๋ ์์๋ธ์ ์ด์ฉํ๋ค๊ณ ํ์ต๋๋ค. ์ค์ ๋ก ๊ทธ๊ฒ์ด ๊ถ์ฅ ์ฌํญ์ด๊ธด ํ์ง๋ง ๋ฐ๋์ ๊ทธ๊ฒ์ด ๋ฐ๋ก ๋ ๋ฆฝ๋์ด์ผ ํ๋ค๋ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์์ ๊ฐ์ด Leader์ Follower๊ฐ ํ๋์ ๋ ธ๋๋ก ๊ตฌ์ฑ๋ ํํ์ ์ฑ๊ธ ๋ ธ๋ ๊ตฌ์ฑ์ผ๋ก ์งํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Network ๊ตฌ์ฑ
Docker์์ ํด๋ฌ์คํฐ ํ๊ฒฝ์ ๊ตฌ์ฑํ๊ธฐ ์ํด ์ฃผํคํผ์ ์นดํ์นด๋ฅผ ์๋ก ์ฐ๊ฒฐํ๊ธฐ ์ํ ๊ทธ๋ค๋ง์ ๋คํธ์ํฌ๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
$ docker network create local-kafka
์ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด์ ํน์ ๋คํธ์ํฌ ๋ธ๋ฆฟ์ง๋ฅผ ์์ฑํฉ๋๋ค.
Zookeeper ์ค์น
์นดํ์นด๋ ๋ถ์ฐ ์ฒ๋ฆฌ ์์คํ ์ ๊ธฐ๋ณธ์ผ๋ก ๋์ํ๋ ๋ถ์ฐ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ์ ๋๋ค. ๋ฐ๋ผ์ ๋จ์ผ๋ก ๋์ํ์ง ์๊ณ , ๋ถ์ฐ๋ ์นดํํค์ ๋ ธ๋๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ์ฝ๋๋ค์ดํฐ ์๋น์ค ์์คํ ์ด ํ์ํ๋ฐ, ์ด์ ๋ํ์ ์ธ ์๋ฃจ์ ์ด ๋ฐ๋ก ์ฃผํคํผ(Zookeeper)์ ๋๋ค.
https://hub.docker.com/_/zookeeper/tags
์ฐ๋ฆฌ๋ Docker๋ฅผ ์ด์ฉํ์ฌ ์นดํ์นด๋ฅผ ์ค์นํด๋ณผ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ฃผํคํผ ๋ํ Docker ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๋๋ค. Macbook์ ์ฌ์ฉํ์๋ ๊ฒฝ์ฐ ์์ ์ ๋งฅ๋ถ์ด M1 ํ๋ก์ธ์์ธ์ง๋ฅผ ํ์ธํ ํ ๋ฒ์ ์ ์ ํํ์๊ธธ ๋ฐ๋๋๋ค.
$ docker pull zookeeper:3.8.0-temurin
์ด ํฌ์คํธ์์๋ ํธ์์ ์ฃผํคํผ์ 3.8 ๋ฒ์ ์ ์ฌ์ฉํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ๋จผ์ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์ต๋๋ค.
์ด๋ฏธ์ง๊ฐ ์ ์์ ์ผ๋ก ๋ฐ์์ก๋ค๋ฉด Pull complete์ด๋ผ๋ ๋ฉ์์ง๊ฐ ๋ํ๋ ๊ฒ์ ๋๋ค.
$ docker run -d --net local-kafka --name local-zookeeper -p 2181:2181 zookeeper:3.8.0-temurin
์ด๋ฏธ์ง๋ฅผ ๋ชจ๋ ๋ฐ์๋ค๋ฉด ์ด์ ์ฃผํคํผ ์๋ฒ๋ฅผ ๋์๋ณผ๊ฑด๋ฐ์. ์ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด์ ํฌํธ ์ฃผ์๋ฅผ 2181์ expose ํ ๋ค์ local-zookeeper๋ผ๋ ์ด๋ฆ์ผ๋ก ์ฃผํคํผ ์๋ฒ๋ฅผ ๋์์ค๋๋ค.
์ปจํ ์ด๋ ํด์ฌ๊ฐ์ด ์ถ๋ ฅ๋ ํ docker ps ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ ๋ local-zookeeper๊ฐ ๋ณด์ธ๋ค๋ฉด ์ฑ๊ณต์ ์ผ๋ก ์ฃผํคํผ๊ฐ ๋์์ง ๊ฒ์ ๋๋ค.
Zookeeper ๊ธฐ๋ณธ ๋ค๋ฃจ๊ธฐ
์ฐ๋ฆฌ๋ Docker์์ 2181๋ฒ ํฌํธ ์ฃผ์๋ง์ expose ํ์์ต๋๋ค. ๊ทธ ์ด์ ๋ ํ์ ๋ ธ๋๊ฐ ์ฃผํคํผ์ ์ฐ๊ฒฐํ ๋ ์ฐ๋ Listen Port๊ฐ 2181 ํฌํธ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋๋จธ์ง ํฌํธ ์ฃผ์๋ ๋ฌด์์ผ๊น์?
- 2181: ์ฃผํคํผ์ ์ฐ๊ฒฐํ ํด๋ผ์ด์ธํธ๋ค์ ์ฐ๊ฒฐ ํฌํธ ์ฃผ์
- 2888: follower๊ฐ leader์๊ฒ ์ฐ๊ฒฐ์ ์์ฒญํ๊ธฐ ์ํ ํฌํธ ์ฃผ์
- 3888: leader๋ฅผ ์ ์ถํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํฌํธ ์ฃผ์
- 8080: Web API ํฌํธ ์ฃผ์
ํ์ฌ ์ด ๊ธ์์ ๋ค๋ฃจ๋ Single Cluster - Single Node์์๋ 2888, 3888 ํฌํธ ์ฃผ์๋ ํฐ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ต๋๋ค. ์ถํ ๋ฉํฐ ํด๋ฌ์คํฐ์ ๋ฉํฐ ๋ ธ๋๋ก ๊ตฌ์ฑํ๋ ์นดํ์นด์ ๋ํด ๋ค๋ฃจ๊ฒ ๋๋ค๋ฉด ์ข ๋ ์ฌ์ธต์ ์ผ๋ก ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ด์ ์ฃผํคํผ๋ฅผ ๋์ ์ผ๋ ๊ฐ๋จํ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ์ฝ๊ฒ๋ ์ฐ๋ฆฌ๊ฐ ๊ด๋ฆฌ์ ํ์ด์ง๋ฅผ ์ง์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ด ์๊ฒ ์ง๋ง ์ด๋ ์ข ๋ ํ์ ๋ณด๋๋ก ํ๊ณ , ๊ธฐ๋ณธ์ ์ผ๋ก ์ฃผํคํผ๋ฅผ ์ปจํธ๋กคํ๋ ์คํฌ๋ฆฝํธ์ธ zocli.sh๋ฅผ ์ฌ์ฉํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
$ docker exec -it local-zookeeper /bin/bash
์ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ์์์ ๋์ด local-zookeeper ํ๊ฒฝ์ bash๋ฅผ ์คํํด๋ด ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ด๋ ๊ฒ local-zookeeper์ bash ์์ด ์คํ๋ ๊ฒ์ ๋๋ค.
bin ๋๋ ํฐ๋ฆฌ์ ์ ๊ทผํ๋ฉด zkCli.sh ํ์ผ์ด ๋ณด์ ๋๋ค. zkCli๋ znode๋ฅผ ์์ฑํ๊ณ ์ญ์ ํ๋ ์คํฌ๋ฆฝํธ๋ก ์ฐ๋ฆฌ๋ ์ด์ ๋ถํฐ ์ด ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
$ ./zkCli.sh
๊ทธ๋ฌ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ ํธ์คํธ์ 2181 ์ฃผ์๋ฅผ ํ์ํ์ฌ ์ ์ํ๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ๋ก์ปฌ์ ์ฃผํคํผ ์๋ฒ์ ์ ์ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
[zk: localhost:2181(CONNECTED) 0] ls /
์ด๋ฒ์ ls / ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด๋ด ์๋ค.
์ด์ ๊ธ์์ ์ด์ผ๊ธฐํ๋ ๊ฒ์ฒ๋ผ ์ฃผํคํผ๋ ๋๋ ํฐ๋ฆฌ ๋จ์(Znode)๋ก ์์์ ๋ฐฐ์นํ๊ณ ๊ด๋ฆฌํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Zookeeper (์๊ธฐ ์์ )์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์๋ฌด๊ฒ๋ ์ฃผํคํผ์ ์ฐ๊ฒฐ๋ ๋ ธ๋๊ฐ ์๊ธฐ ๋๋ฌธ์ด์ฃ .
Kafka ์ค์น
์ ์ด์ ์ฃผํคํผ์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ๊ฒ์ ์ค๋น๊ฐ ๋๋ฌ์ผ๋ ์ด์ ์นดํ์นด๋ฅผ ์ค์นํ๊ณ ๋์๋ณด๊ฒ ์ต๋๋ค.
$ docker pull wurstmeister/kafka:2.13-2.8.1
์ฃผํคํผ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์นดํ์นด์ ์ด๋ฏธ์ง ์ด๋ฆ๋ง ๋ฐ๊ฟ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์๋ค๋ฉด ์ญ์ Pull complete์ด ๋์ฌ ๊ฒ์ ๋๋ค.
$ docker run -d --net local-kafka --name local-kafka-node -p 9092:9092 -e KAFKA_ZOOKEEPER_CONNECT=local-zookeeper:2181 -e KAFKA_LISTENERS=INTERNAL://local-kafka-node:19092,EXTERNAL://localhost:9092 -e KAFKA_ADVERTISED_LISTENERS=INTERNAL://local-kafka-node:19092,EXTERNAL://localhost:9092 -e KAFKA_INTER_BROKER_LISTENER_NAME=INTERNAL -e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT wurstmeister/kafka:2.13-2.8.1
์ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ docker run์ ์คํํฉ๋๋ค. ๋ค์ ๋ช ๋ น์ด๊ฐ ๊ธด๋ฐ, ์ฃผํคํผ ์ฐ๊ฒฐ ์ ๋ณด ์ธ์๋ ๋ค์ํ ์ ๋ณด๋ฅผ ์นดํ์นด์๊ฒ ์ฃผ์ด์ผ ํฉ๋๋ค. ์ฐจ๊ทผ์ฐจ๊ทผ ์์๋ณด๋๋ก ํ์ฃ .
- KAFKA_ZOOKEEPER_CONNECT
Kafka์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ฃผํคํผ ์ฃผ์ (์์๋ธ์ธ ๊ฒฝ์ฐ Comma ๋จ์๋ก ๋ชจ๋ ์ฃผํคํผ์ ์ฃผ์๋ฅผ ์ ์ด์ผ ํจ) - KAFKA_LISTENERS
์นดํ์นด ๋ฆฌ์ค๋ ์ฃผ์(์กด ๋ด)๋ฅผ ์ ๋ ๋ณ์ (ํ์ฌ๋ ํ์๊ฐ์ผ๋ก ๋ค์ด๊ฐ์ผ ํจ) - KAFKA_ADVERTISED_LISTENERS
์นดํ์นด ๋ฆฌ์ค๋ ์ฃผ์(์กด ์ธ)๋ฅผ ์ ๋ ๋ณ์ - KAFKA_INTER_BROKER_LISTENER_NAME
์นดํ์นด๋ผ๋ฆฌ ํต์ ํ ๋ฆฌ์ค๋ ์ด๋ฆ์ ์ ์ - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP
๋ฆฌ์ค๋์ ๋ณด์ ํ๋กํ ์ฝ ์ฌ๋ถ (PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL)
๊ธฐ๋ณธ์ ์ผ๋ก ์นดํ์นด์ ์ฐ๊ฒฐํ ์ฃผํคํผ ์ฃผ์๊ฐ ํ์ํ๊ณ , ์ด์ ์๋ ์นดํ์นด๋ผ๋ฆฌ ํต์ ์ ์ํด ๋ฆฌ์ค๋๋ค์ ๋ชฉ๋ก์ ์ ์ง ์์ผ๋ฉด ๋ชจ๋ ๋คํธ์ํฌ ๋์์ ์นดํ์นด ๋ธ๋ก์ปค๋ค๋ผ๋ฆฌ ๋ฆฌ์ค๋๊ฐ ๋๋๋ก ๊ตฌ์ฑํ ์ ์์์ง๋ง ์ง๊ธ์ ๋ฆฌ์ค๋์ ๋ฒ์๋ฅผ ์ ํด์ค์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ , ADVERTISED_LISTENER์ ๊ฒฝ์ฐ NAT ๋ด์ ์กด์ด ์๋ ์กด ์ธ์ ์นดํ์นด๋ผ๋ฆฌ ํต์ ์ ํด์ผํ ๋ ์ฌ์ฉํฉ๋๋ค. ๋ํ์ ์ผ๋ก ์ฟ ๋ฒ๋คํฐ์ค(Kubernetes, k8s)๊ฐ ์์ต๋๋ค.
LISTENER_SECURITY_PROTOCOL์ ๋ฆฌ์ค๋๋ค๋ผ๋ฆฌ ํต์ ํ ๋ ์ํธํ๋ฅผ ํ ๊ฒ์ธ์ง ํ๋ฌธ์ผ๋ก ํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ ์ต์ ์ผ๋ก ์ฌ๊ธฐ์๋ ํ๋ฌธ์ ์ฌ์ฉํ๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ค์ ์ฃผํคํผ๋ก ์์ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ณด๋ฉด zookeeper ์ธ์ admin, brokers, cluster, consumers ๋ฑ ์นดํ์นด์ ๊ด๋ จ๋ ๋๋ ํฐ๋ฆฌ๊ฐ ์ถ๊ฐ ๋์์์ ๋ณผ ์ ์์ต๋๋ค.
์ฃผํคํผ Web API
์ฃผํคํผ Web API๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผํคํผ๋ฅผ ๊ด๋ฆฌํด๋ณผ ์ ์์ต๋๋ค.
$ docker run -d --net local-kafka --name local-zookeeper -p 2181:2181 -p 8080:8080 zookeeper:3.8.0-temurin
WebAPI๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด 8080 ํฌํธ๋ฅผ EXPOSE ํฉ๋๋ค.
Insomnia, Postman ๋ฑ๊ณผ ๊ฐ์ API ํ ์คํธ ๋๊ตฌ๋ฅผ ์ด์ฉํด ์ฃผํคํผ WebAPI๋ฅผ ํธ์ถํด๋ด ๋๋ค. ๋ง์ฝ CLI ํ๊ฒฝ์ด๋ผ๋ฉด curl ๋ฑ์ ์ด์ฉํ๋ ๊ฒ๋ ์ข์ต๋๋ค.
$ curl http://localhost:8080/commands/stats
GET commands/stats๋ฅผ ํธ์ถํ๋ฉด ์๋ฒ ์ํ์ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค์ ์ ๋ณด๋ฅผ ๋ณผ ์ ์์ต๋๋ค. connections ํญ๋ชฉ์ ์๊น ์ฐ๋ฆฌ๊ฐ ๋์ ๋ ์นดํ์นด๊ฐ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
$ docker inspect local-kafka-node
docker inspect ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด ์์์ ๋์ด ์นดํ์นด์ ์ ๋ณด๋ฅผ ํ์ธํฉ๋๋ค.
IPAddress๋ฅผ ๋ณด๋ฉด 172.22.0.3 ์ฃผ์๊ฐ ์ผ์นํ๋ฉฐ ์ฐ๋ฆฌ๊ฐ ๋์ด ์ฃผํคํผ์ ์ฐ๊ฒฐ๋์์์ ์ ์ ์์ต๋๋ค.
๋ง์น๋ฉฐ...
์นดํ์นด์ ์ค์น๋ ์ผ๋ฐ ์น ์๋ฒ, ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ณด๋ค๋ ์ค์น๊ฐ ๋ณต์กํ๊ณ ์ด๋ ต์ต๋๋ค. ๋ฉํฐ ๋ ธ๋, ์์๋ธ ๊ตฌ์ฑ์ ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋ ์ ๋ ์์ง๋ง ๊ทธ ๊ตฌ์กฐ๋ฅผ ๊ฟฐ๊ธฐ ์ํด ๋คํธ์ํฌ์ ๋ํ ์ง์๋ ํ์คํ๊ฒ ๋ฐ์ณ์ ธ ์์ด์ผ๋ง ์ด ์ค์น ๋ฐฉ๋ฒ์ ์ดํดํ ์ ์์ต๋๋ค.
๋ค์ ํฌ์คํธ์์๋ docker-compose๋ฅผ ์ด์ฉํด ์ข ๋ ์นดํ์นด๋ฅผ ์ฝ๊ฒ ์ค์นํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
'Middleware > Kafka' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kafka] docker-compose๋ฅผ ํ์ฉํ ๋ ์ฌ์ด Kafka ์๋ฒ ์ค์น (1) | 2022.11.12 |
---|---|
[Kafka] ์นดํ์นด์ ์ฝ๋๋ค์ดํฐ Zookeeper (0) | 2022.07.31 |
[Kafka] Apache Kafka๋ ๋ฌด์์ด๊ณ ์ ์ฑ๋ฅ์ด ๋น ๋ฅผ๊น? (0) | 2022.07.30 |