Kafka Study Memo
๋ค์ด๊ฐ๋ฉฐ
ํ์ฌ์์ Confluent๋ฅผ ํตํด Kafka ํด๋ฌ์คํฐ๋ฅผ ์ ์ฌ์ฉํ๊ณ ์์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ, ์ด ์นดํ์นด์ ๋ํด์ ์ข๋ ์์ธํ ์๊ณ , ์ ๋ฌธ์ฑ์ ๊ฐ์ถ๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ค์ด์ 2025๋ ์ฒซ ๋ชฉํ๋ก Confluent์ Kafka ์๊ฒฉ์ฆ์ธ Confluent Certified Developer for Apache Kafkaยฎ ์๊ฒฉ์ฆ์ ์ค๋นํ๊ณ ์์ต๋๋ค โ๏ธ
์ปจํธ๋กค๋ฌ ๋ธ๋ก์ปค๋ ๋ญ ํ๋ ๋ ์์ธ๊ฐ?
๋ฆฌ๋ ํํฐ์ ์ ๊ฒฐ์ ํ๋ ๋ ์ ์ ๋๋ค. ์ฃผํคํผ๋ก๋ถํฐ ๋ธ๋ก์ปค๋ค์ ์ํ๋ฅผ ์ง์์ ์ผ๋ก ๊ฐ์ ธ์ต๋๋ค.
๋ฆฌ๋ ํํฐ์ ์ด ์๋ ๋ธ๋ก์ปค๊ฐ ์ ์ค๋๋ฉด, ์ฃผํคํผ์ ์ ์ฅ๋์ด ์๋ ๋๋จธ์ง ๋ธ๋ก์ปค์ ์ํ๋ฅผ ๋ฐํ์ผ๋ก ๋จ์ ํ๋ก์ ํํฐ์ ์ค ํ๋๋ฅผ ์๋ก์ด ๋ฆฌ๋ ํํฐ์ ์ผ๋ก ์น๊ฒฉํฉ๋๋ค. ๋ฆฌ๋ ํํฐ์ ์ด ์ฌ์ ์ ๋๋ฉด, ์ฃผํคํผ์๊ฒ ์ด๋ฅผ ์๋ ค์ค๋๋ค.
์ฃผํคํผ์ ํต์ ํ๋ฉฐ, ํด๋ฌ์คํฐ์ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ์ฑํฌ ํฉ๋๋ค.
์ปจํธ๋กค ํ๋ ์ธ zookeeper๋ Kraft ๋ชจ๋์ด๋ ์ปจํธ๋กค๋ฌ ๋ธ๋ก์ปค๋ ๋ฆฌ๋ ํํฐ์ ์ ์ ์ ํฉ๋๋ค. ๋ค๋ง, ๋ ๋ชจ๋์ ๋ฐ๋ผ์ ์ปจํธ๋กค๋ฌ ๋ธ๋ก์ปค๊ฐ ์ ์ค๋ ์ํ์์ ์๋ก์ด ์ปจํธ๋กค๋ฌ ๋ธ๋ก์ปค๋ฅผ ์ ์ถํ๋ ๋ฐฉ์์ด ๋ค๋ฅธ ๊ฒ์ ๋๋ค.
- zookeeper ๋ชจ๋
- ์ฃผํคํผ๊ฐ ๋จ์ ๋ธ๋ก์ปค ์ค ํ๋๋ฅผ ์ปจํธ๋กค๋ฌ ๋ธ๋ก์ปค๋ก ์ ์ถํฉ๋๋ค.
- Kraft ๋ชจ๋
- Raft ํ๋กํ ์ฝ์ ๋ฐ๋ผ ํฌํ ๋ฐฉ์์ผ๋ก ์ปจํธ๋กค๋ฌ๋ฅผ ์ ์ถ ํฉ๋๋ค.
์ฃผํคํผ๋ ๋ญ ํ๋ ๋ ์์ธ๊ฐ?
Kafka ํด๋ฌ์คํฐ ๊ด๋ฆฌ๋ฅผ ์ํด ์ฌ๋ฌ ์ญํ ์ ํฉ๋๋ค.
- ์ปจํธ๋กค๋ฌ ๋ธ๋ก์ปค๋ฅผ ์ ์ถ
- ๋ธ๋ก์ปค ๋ฑ๋ก๊ณผ ์ํ ๊ด๋ฆฌ
- znode ์ด์ฉ๊ตฌโฆ (TODO)
- ๊ฐ ํ ํฝ์ ํํฐ์
์ ๋ณด
- ๋๊ฐ ๋ฆฌ๋๊ณ , ๋๊ฐ ํ๋ก์์ธ์ง
- ISR ์งํฉ์ ์ด๋ป๊ฒ ๋์ด ์๋์ง
- ๊ฐ ํ ํฝ์ ๋ฉํ๋ฐ์ดํฐ
- ์ด๋ฆ, config, retention ๋ฑ๋ฑ
- ๊ฐ ํ ํฝ์ ACL
๋ชจ๋ ์ํธ์์ฉ์ ์ค์ง ๋ฆฌ๋ ํํฐ์ ๋ง!
ํ๋ก๋์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ๋, ๊ทธ๋ฆฌ๊ณ ์ปจ์๋จธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋, ๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋ฆฌ๋ ํํฐ์ ์ด ์๋ ๋ธ๋ก์ปค์ ์ํธ์์ฉ ํ๋ ๊ฒ์.
ํ๋ก์ ํํฐ์
์ ๋ฐ์ดํฐ๋ ์ค์ง ์ฅ์ ๋ณต๊ตฌ๋ฅผ ์ํ ์ฉ๋์ผ ๋ฟ์!! replication.factor
๊ฐ ํฌ๋ค๊ณ ํด์ ํ๋ก๋์/์ปจ์๋จธ์ ์ฒ๋ฆฌ๋์ด ์ ํ ๋์ด๋์ง ์์.
๋ถํธ์คํธ๋ฉ ์๋ฒ์ ๋ํด
์นดํ์นด ํด๋ฌ์คํฐ๋ฅผ ์ด๋ฃจ๋ ๋ชจ๋ ๋ธ๋ก์ปค๊ฐ ์นดํ์นด ํด๋ฌ์คํฐ์ ์ง์ ์ ์ด ๋ ์ ์์. ์ฆ, ๋ธ๋ก์ปค๊ฐ ์ปจํธ๋กค๋ฌ ๋ธ๋ก์ปค์ผ ํ์๋ ์์.
์๋ ์ ํท๊ฐ๋ ธ๋ ๊ฑด Kafka Properties์ ์ ๋ bootstrap.servers
๊ฐ ์ฃผํคํผ์ ์ฃผ์์ธ ์ค ์์์. ๊ทธ๋ฐ๋ฐ, ๊ทธ๊ฒ ์ ํ ์๋๊ณ ๊ฐ ๋ธ๋ก์ปค์ ์ฃผ์๋ฅผ ๋งํจ.
๊ทธ๋์ bootstrap.servers
์ ์๋์ ๊ฐ์ด ์ฌ๋ฌ ๋ธ๋ก์ปค์ ์ฃผ์๋ฅผ ์ ๋๊ฒ ๊ฐ๋ฅํจ.
bootstrap.servers=broker1:9092,broker2:9092,broker3:9092
ํด๋ฆฐ ๋ก๊ทธ vs. ๋ํฐ ๋ก๊ทธ
ํ ํฝ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฆฌํ๋ ๋ฐฉ๋ฒ ์ค์ Log Compaction์ ํ ๋ ์ฐ๋ ์ฉ์ด.
Active Segment๋ ํ์ฌ ๋ฐ์ดํฐ๊ฐ ์ค์๊ฐ์ผ๋ก ์์ด๊ณ ์์ผ๋ ์์ถ ๋์์ด ์๋! ๊ทธ๋์ Inactive Segment ๋ค์ด ๋ก๊ทธ ์์ถ์ ๋์์ด ๋จ.
์ธ๊ทธ๋จผํธ์๋ key ๋ณ๋ก latest ๋ก๊ทธ๋ ์๊ณ , non-latest ๋ก๊ทธ๋ ์์ ๊ฒ์. ๋ง์ฝ, latest ๋ก๊ทธ๋ผ๋ฉด ์ญ์ ๋์ง ์๊ณ ๋ณด์กด๋จ. non-latest ๋ก๊ทธ๋ผ๋ฉด ๋ก๊ทธ๊ฐ ์ญ์ ๋จ. ๊ทธ๋์ ๋ณด์กด๋๋ latest ๋ก๊ทธ๋ฅผ โํด๋ฆฐ ๋ก๊ทธโ๋ผ๊ณ ํ๊ณ , ์ญ์ ์ฒ๋ฆฌ ๋๋ non-latest ๋ก๊ทธ๋ฅผ โ๋ํฐ ๋ก๊ทธโ๋ผ๊ณ ํจ.
Log Compaction์์ Tombstone ๋ ์ฝ๋
Log Compaction์ด ํ์ฑํ๋ ํ ํฝ์์๋ ํน์ key์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ์ ์์.
๋ฐฉ๋ฒ์ ๊ทธ๋ฅ null value ๊ฐ์ ์ญ์ ํ๋ ค๋ key๋ฅผ ๋ฌถ์ด์ ๋ ์ฝ๋๋ก ์๋ฉด ๋จ. ์ด๋ ๊ฒ ์ญ์ ๋ฅผ ์ํด ๋ณด๋ด๋ null value ๋ ์ฝ๋๋ฅผ โTombstone ๋ ์ฝ๋โ๋ผ๊ณ ํจ.
Tombstone ๋ ์ฝ๋๊ฐ ์๊ธฐ๋ฉด, ๊ธฐ์กด์ ํด๋น key์ ์กด์ฌํ๋ ๊ฐ์ด non-latest๊ฐ ๋๊ณ , Log Compaction์ด ๋ ๋ ์ญ์ ์ฒ๋ฆฌ๊ฐ ๋จ.
Tombstone ๋ ์ฝ๋๋ ํด๋น key์ ๋ํ latest ๋ ์ฝ๋์ด๋ฏ๋ก, Log Compaction์ ๋์์ด ๋์ง ์๊ณ , ์์ํ ์กด์ฌํ ๊ฐ๋ฅ์ฑ์ด ์์. ๊ทธ๋์ Kafka์์๋ delete.retention.ms
๋ฅผ ์ค์ ํ์ฌ ์ฃผ๊ธฐ์ ์ผ๋ก Tombstone ๋ ์ฝ๋๋ฅผ ์ ๋ฆฌํจ!!
์ด ๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ด 24์๊ฐ์ผ๋ก ์ค์ ๋์ด ์๊ณ , Tombstone ๋ ์ฝ๋๋ก ์ธํ non-latest ๋ ์ฝ๋ ์ ๋ฆฌ(Log Compaction) ์ฃผ๊ธฐ ๋ณด๋ค ์ถฉ๋ถํ ๊ธธ๊ฒ ์ค์ ํด์ค์ผ ํจ. Log Compaction ์ฃผ๊ธฐ๋ 2๊ฐ์ง ์์ฑ์ ์ํด ์ํฅ์ ๋ฐ๋๋ฐ, min.cleanable.dirty.ratio
(default: 0.5), log.cleaner.backoff.ms
(default: 15,000 ms)๋ก ๋์ด ์์. ๊ทธ๋์ ์ ๋งํ๋ฉด Tombstone ๋ ์ฝ๋๊ฐ ์ญ์ ๋๊ธฐ ์ ์, non-latest ๊ฐ๋ค์ด ์ ๋ฆฌ ๋จ.
์ด๋ ๊ฒ Delete ๋ ์ฝ๋๋ฅผ ํ์๋ฅผ ์ง์ํ๋ ์ด์ ๋ GDPR๊ณผ ๊ฐ์ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ์๊ตฌ ์ฌํญ์ ๋ง์กฑํ๊ธฐ ์ํด์์.
๋ ์ฝ๋ ์ญ์ ์ ๋ํด
Kafka ํ ํฝ์ ๋ฐ์ดํฐ๋ ํ๋ก๋์๋, ์ปจ์๋จธ๋ ์๋ ์ค์ง ๋ธ๋ก์ปค๋ง์ด ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ์ ์์.
๋ฐ์ดํฐ ์ญ์ ๋ ํ์ผ ๋จ์๋ก ์ด๋ค์ง๋๋ฐ, ์ด ๋จ์๋ฅผ ๋ก๊ทธ ์ธ๊ทธ๋จผํธ(log segment)๋ผ๊ณ ํจ. ์ญ์ ๊ฐ ํ์ผ ๋จ์๋ก ์ด๋ค์ง๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ฒ๋ผ ํน์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ณํด ์ญ์ ํ๋๊ฒ ๋ถ๊ฐ๋ฅํจ.
Confluent ํด๋ฌ์คํฐ๋ ๋ช๊ฐ์ ๋ธ๋ก์ปค ๊ตฌ์ฑ ๋์ด ์๋๊ฐ?
Confluent๋ Serverless Kafka ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์, Kafka ํด๋ฌ์คํฐ๊ฐ ์ผ๋งํผ์ ๋ธ๋ก์ปค๋ก ๊ตฌ์ฑ ๋์ด ์๋์ง ์ ์ ์์ต๋๋ค. Confluent ํด๋ฌ์คํฐ๋ ์ผ๋ง๋งํผ์ ํผํฌ๋จผ์ค๋ฅผ ๋ณด์ฅํ๊ณ , ์ฌ์ฉ๋์ ๋ฐ๋ผ ๊ณผ๊ธ ํ๋ ๊ฒ์ผ๋ฟ Kafka ํด๋ฌ์คํฐ ๊ด๋ฆฌ๋ ๊ณ ๊ฐ์ด ํ์ง ์์ต๋๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ! Cluster๋ฅผ ์ด๋ฃจ๋ Broker ๊ฐฏ์๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค!! Kafka Shell์ kafka-broker-api-versions.sh
๋ฅผ ์ฌ์ฉ ํ๋ฉด ๋ฉ๋๋ค!
$ kafka-broker-api-versions.sh \
--bootstrap-server xxxx.xxxx.xxx.confluent.cloud:9092 \
--command-config /xxxx/client.properties
์ด๋ ๊ฒ ํ๋ฉด, ๊ฐ ๋ธ๋ก์ปค์ ๋ชฉ๋ก์ ํ์ธํ ์ ์์ต๋๋ค. ์ ์ ๊ฒฝ์ฐ๋ ์๋์ ๊ฐ์ด ์ถ๋ ฅ ๋์์ต๋๋ค.
b0-xxxx.xxxx.aws.confluent.cloud:9092 (id: 8 rack: usw2-az2) -> (
Produce(0): 0 to 11 [usable: 11],
Fetch(1): 0 to 17 [usable: 17],
ListOffsets(2): 0 to 10 [usable: 9],
Metadata(3): 0 to 13 [usable: 12],
...
)
b1-xxxx.xxxx.aws.confluent.cloud:9092 (id: 7 rack: usw2-az3)
b2-xxxx.xxxx.aws.confluent.cloud:9092 (id: 6 rack: usw2-az4)
BASIC
ํ๋์ ํด๋ฌ์คํฐ ์๋๋ฐ, ์ด 18๊ฐ์ ๋ธ๋ก์ปค๋ก ๊ตฌ์ฑ ๋์ด ์์์ต๋๋ค!
from confluent_kafka.admin import AdminClient
# Kafka ํด๋ผ์ด์ธํธ ์ค์
admin_client = AdminClient({
"bootstrap.servers": "xxxx.xxxx.aws.confluent.cloud:9092",
"security.protocol": "SASL_SSL",
"sasl.mechanism": "PLAIN",
"sasl.username": "xxxx",
"sasl.password": "xxxx"
})
# ๋ธ๋ก์ปค ์ ๋ณด ์ถ๋ ฅ
brokers = admin_client.describe_cluster()
print("Cluster ID:", brokers.result().cluster_id)
print("Controller:", brokers.result().controller)
for node in brokers.result().nodes:
print(node)
์๋ฐ Python ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด, ๋ธ๋ก์ปค ์ด๋ฆ๋ง ์ถ๋ ฅํด ํ์ธํ ์ ์์ต๋๋ค!
Kafka ํ์ฉ ์ฌ๋ก
- Kakao
- ์นดํ์นด, ๋๊ท๋ชจ ํด๋ฌ์คํฐ ์ด์ ํ๊ธฐ / if(kakao)2022
- ์จํ๋ ๋ฏธ์ค์์ Kafka ํด๋ฌ์คํฐ๋ฅผ ์ด์ํ๋ ๋ ธํ์ฐ๊ฐ ์๋ฉ ์๊ฐ ๋์ด ์์.
- RAID์ ๊ฐ์ด ๋์คํฌ ํ๋กํ ์ฝ์ ๋ํด์๋ ๋ค๋ฃจ๊ณ , SSD๊ฐ ์ข์์ง HDD๊ฐ ์ข์์ง ๊ฐ์ low-level ๋ด์ฉ๋ ํฅ๋ฏธ๋ก์ ์.
- Disk ์ชฝ ์ฅ์ ๊ฐ ๋ง์์ ์ฅ์ ๋ณต๊ตฌ๋ฅผ ์๋ํ ํ๋ค๋ ๊ฒ๋ ํฅ๋ฏธ๋ก์.
- ์นดํ์นด๋ Kernel ๋จ์์ zero-copy๋ก ์ฒ๋ฆฌํ๋ค๊ณ ์ธ๊ธ๋๋๋ฐ, ์ข๋ ์์๋ด์ผ ๊ฒ ์.
- Kafka๋ Page Cache๋ฅผ ์ต๋ํ ํ์ฉํ๊ธฐ ๋๋ฌธ์, Heap ๊ณต๊ฐ์ 6GB๋ก (๋น๊ต์ ) ์๊ฒ ํ ๋นํ๋ค๊ณ ํจ
- Kafka Parameter๋ฅผ ๊ธฐ๋ณธ๊ฐ์ด ์๋๋ผ ์ปค์คํ ๊ฐ ์ฌ์ฉํ ๊ฒ๋ค๋ ์ด์ ์ ๋ ธํ์ฐ๋ฅผ ์น์ ํ ์๋ ค์ฃผ์ฌ
- ๋ณธ๋
log.dir
์/tmp
๊ฒฝ๋ก์ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฌํ๋๋ฐ, ์๊ฒ OS ํ๊ฒฝ์ ๋ฐ๋ผ ์๋ ์ญ์ ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฒฝ๋ก๋ ๋ฐ๊ฟ์ค์ผ ํ๋ค๊ณ ํจ.
- ์นดํ์นด, Kraft๋ฅผ ๋ง๋๋ค: ์ฃผํคํผ ์์ด ์ด์ํ๋ ์นดํ์นด์ ์ค์ ์ด์ ๋
ธํ์ฐ / if(kakaoAI)2024
- ์ปจ์๋จธ ๊ทธ๋ฃน ๊ด๋ฆฌ์ ๋ํ ๋ฉํ ์ ๋ณด๋ฅผ ๊ธฐ์กด์๋ Zookeeper์์ ๊ด๋ฆฌ ํ๋๋ฐ, ์ด๊ฑธ ๋์ค์ System Topic์ธ
__consumer_offsets
์ผ๋ก ์ฎ๊ฒผ๋ค๋ ์๊ธฐ๋ ์ ์์์ผ๋ก ์ฒ์ ์๊ฒ ๋จ! __cluster_metadata
๋ผ๋ System Topic์ผ๋ก ํด๋ฌ์คํฐ ๋ฉํ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํจ.- ์ด ์ ๋ณด๋ ์ปจํธ๋กค๋ฌ ๋ ธ๋ ๋ฟ๋ง ์๋๋ผ ์ต์ ๋ ๋ ธ๋๋ ํด๋น ํ ํฝ์ ๋ํ ํํฐ์ ์ ๊ฐ์ง๊ณ ์์.
- Checkpoint๋ฅผ ๊ตฌ์ฑํ์ฌ, ๋น ๋ฅธ ๋ณต๊ตฌ๊ฐ ๊ฐ๋ฅํ๋๋ก ํจ.
- ์ ๋ง ๊ผผ๊ผผํ๊ฒ ๋ฒค์น๋งํฌ ํ
์คํธ๋ฅผ ์งํํด์ ๋๋์! (์ ๋ง ๋ฐฐ์์ผ ํ ์ ์ด๋ผ๊ณ ์๊ฐํจ)
- trogdor: Trogdor is a test framework for Apache Kafka.
- ๋ฐ์ดํฐ ์ผํฐ์ ์ง์ ๋ฐฉ๋ฌธํด์ ๋ฌผ๋ฆฌ์ ์ธ ์ฅ์ ๋ฅผ ์ง์ ๋ง๋ค์ด๋ณผ ์ ๋๋ผ๋!
- ๋ธ๋ก์ปค์ ํ๋ก๋์์ ์์ถ ๋ฐฉ์์ด ๋ค๋ฅด๋ฉด, ์์ถ์ ํ๊ณ ๋ค์ ์์ถ ํ๋ ๊ณผ์ ์ด ๋ค๊ธฐ ๋๋ฌธ์, ์ ๋งํ๋ฉด ๋ธ๋ก์ปค์ ํ๋ก๋์์ ์์ถ ๋ฐฉ์์ ๋์ผํ๊ฒ ๋ง์ถฐ์ฃผ๋๊ฒ ์ข๋ค๊ณ ํจ.
- ์ปจ์๋จธ ๊ทธ๋ฃน ๊ด๋ฆฌ์ ๋ํ ๋ฉํ ์ ๋ณด๋ฅผ ๊ธฐ์กด์๋ Zookeeper์์ ๊ด๋ฆฌ ํ๋๋ฐ, ์ด๊ฑธ ๋์ค์ System Topic์ธ
- ์นดํ์นด, ๋๊ท๋ชจ ํด๋ฌ์คํฐ ์ด์ ํ๊ธฐ / if(kakao)2022