์ฃผํ‚คํผ ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•œ ์นดํ”„์นด ํด๋Ÿฌ์Šคํ„ฐ! ๊ฐ•๊ฑดํ•œ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ณ ๋ฏผ๋“ค์„ ์‚ดํŽด๋ด…์‹œ๋‹ค! ๐Ÿ„

11 minute read

๋“ค์–ด๊ฐ€๋ฉฐ

ํšŒ์‚ฌ์—์„œ Confluent๋ฅผ ํ†ตํ•ด Kafka ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ž˜ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์ด ์นดํ”„์นด์— ๋Œ€ํ•ด์„œ ์ข€๋” ์ž์„ธํžˆ ์•Œ๊ณ , ์ „๋ฌธ์„ฑ์„ ๊ฐ–์ถ”๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด์„œ 2025๋…„ ์ฒซ ๋ชฉํ‘œ๋กœ Confluent์˜ Kafka ์ž๊ฒฉ์ฆ์ธ Confluent Certified Developer for Apache Kafkaยฎ ์ž๊ฒฉ์ฆ์„ ์ค€๋น„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค โœŒ๏ธ

์ฃผํ‚คํผ

Confluent: The Apache Kafka Control Plane

์‚ฌ์‹ค ์ฃผํ‚คํผ๋Š” Kafka๋ฅผ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๋„๊ตฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ฃผํ‚คํผ๋Š” ๋ถ„์‚ฐ์ฒ˜๋ฆฌ ํ™˜๊ฒฝ์˜ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Kafka์™€ ์ฃผํ‚คํผ๊ฐ€ ์„œ๋กœ ๋…์ž์ ์ธ ์ƒํƒœ๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๋œป์ด๋ฉฐ, Kafka ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์šด์˜ํ•˜๋Š” ์‚ฌ๋žŒ์€ ๊ฒฐ๊ตญ ์ฃผํ‚คํผ๋ผ๋Š” ๋ณ„๋„ ์ƒํƒœ๊ณ„๊นŒ์ง€ ๊ณต๋ถ€ํ•˜๊ณ  ๊ฒฝํ—˜์„ ์Œ“์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ฃผํ‚คํผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋˜ ์นดํ”„์นด๊ฐ€ ๊ฐ–๋˜ ๋ฌธ์ œ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

์ฃผํ‚คํผ๋Š” ์นดํ”„์นด ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ์ •๋ณด(ex: ISR๊ณผ ๋ฆฌ๋” ํŒŒํ‹ฐ์…˜ ์ •๋ณด)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์ด๋ฅผ ์ฝ”๋””ํ…Œ์ด์…˜์„ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ ๋ธŒ๋กœ์ปค๋Š” ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ๊ฐœ๋ณ„ ๋ธŒ๋กœ์ปค์— ์ „ํŒŒํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ”Œ๋กœ์šฐ๊ฐ€

์ฃผํ‚คํผ -> ์ปจํŠธ๋กค๋Ÿฌ ๋ธŒ๋กœ์ปค -> ์ผ๋ฐ˜ ๋ธŒ๋กœ์ปค

์ˆœ์„œ๋กœ ์—ฌ๋Ÿฌ ์ ˆ์ฐจ๊ฐ€ ํ•„์š” ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ์ปจํŠธ๋กค๋Ÿฌ ๋ธŒ๋กœ์ปค์™€ ์ผ๋ฐ˜ ๋ธŒ๋กœ์ปค ์‚ฌ์ด์— ๋„คํŠธ์›Œํฌ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์„œ๋กœ ํ†ต์‹ ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ์–ด๋–ค ํ† ํ”ฝ์— ๋Œ€ํ•ด์„œ ๋ฆฌ๋” ์ผ์‹œ์ ์œผ๋กœ 2๊ฐœ๊ฐ€ ๋˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฃผํ‚คํผ ์ชฝ์—์„œ๋Š” ๋ฆฌ๋” ํŒŒํ‹ฐ์…˜์ด ๋ณ€๊ฒฝ ๋˜์—ˆ๋Š”๋ฐ, ์ฃผํ‚คํผ์™€ ์ปจํŠธ๋กค๋Ÿฌ ๋ธŒ๋กœ์ปค ์‚ฌ์ด ์—ฐ๊ฒฐ์ด ์ง€์—ฐ๋˜๋Š” ๊ฒฝ์šฐ๋„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์นดํ”„์นด ๊ฐœ๋ฐœํŒ€์€ ์ด๊ฒƒ์ด ์ ˆ์ฐจ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ณ , ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ดโ€ฆ ์ฃผํ‚คํผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—†์• ์„œ ์ ˆ์ฐจ๋ฅผ ๊ฐ„์†Œํ™” ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค!

Kraft ๋ชจ๋“œ

Kraft ๋ชจ๋“œ์—์„œ๋Š” โ€œ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์—ฌ๋Ÿฌ๋Œ€โ€ ์žˆ์Œ. ๊ทธ๋ฆฌ๊ณ  โ€œ์ปจํŠธ๋กค๋Ÿฌ ์ค‘ ํ•œ ๋Œ€๊ฐ€ ๋ฆฌ๋”โ€๊ฐ€ ๋จ. ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋ฆฌ๋”๋Š” ๊ธฐ์กด ๋ธŒ๋กœ์ปค์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์žฌํ•˜๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ์˜ค์ง ํด๋Ÿฌ์Šคํ„ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ชจ๋“  ๋ธŒ๋กœ์ปค์˜ ์ƒํƒœ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์›ํ•œ๋‹ค๋ฉด, ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ธŒ๋กœ์ปค ์—ญํ• ๊นŒ์ง€ ๊ฒธํ•˜๋Š” Combined ๋ชจ๋“œ๋กœ ์šด์˜ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. (๋‹ค๋งŒ, Combined ๋ชจ๋“œ๋Š” ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

๊ธฐ์กด์— ์ปจํŠธ๋กค๋Ÿฌ ๋…ธ๋“œ๊ฐ€ ํ•˜๋˜ โ€œ๋ฆฌ๋” ํŒŒํ‹ฐ์…˜ ์„ ์ถœโ€ ๊ธฐ๋Šฅ์€ ์ปจํŠธ๋กค๋Ÿฌ ๋ฆฌ๋” ๋…ธ๋“œ๊ฐ€ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ์ปจํŠธ๋กค๋Ÿฌ ํŒ”๋กœ์›Œ ๋…ธ๋“œ๋Š” ์„ ์ถœ๋œ ๋‚ด์šฉ์„ ๋ฆฌ๋”๋ถ€ํ„ฐ ๋ณต์ œํ•˜์—ฌ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

ํ‰์†Œ์˜ ์ปจํŠธ๋กค๋Ÿฌ ํŒ”๋กœ์›Œ ๋…ธ๋“œ๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ถ„์‚ฐ ์ €์žฅ ์™ธ์— ๋”ฑํžˆ ์—ญํ• ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋กœ ๋ฆฌ๋” ๋…ธ๋“œ๊ฐ€ ์ž˜ ์‚ด์•„์žˆ๋‚˜?๋ฅผ ์ง€์†์ ์œผ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

ํŒ”๋กœ์›Œ ๋…ธ๋“œ๋Š” ๋ฆฌ๋” ๋…ธ๋“œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•ด ๋ฆฌ๋” ๋…ธ๋“œ ์„ ์ถœ์ด ํ•„์š”ํ•  ๋•Œ ์—ญํ• ์„ ์ˆ˜ํ–‰ ํ•ฉ๋‹ˆ๋‹ค. ํŒ”๋กœ์›Œ ๋…ธ๋“œ๊ฐ€ ์ž…ํ›„๋ณด๊ฐ€ ๋˜์–ด ์„ ๊ฑฐ๋ฅผ ์น˜๋ฅด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ์ผ๋ฐ˜ ๋ธŒ๋กœ์ปค๋Š” ํˆฌํ‘œ ๊ณผ์ •์— ์ž…ํ›„๋ณด ํ•  ์ˆ˜๋„ ์—†๊ณ , ํˆฌํ‘œ๊ถŒ์„ ํ–‰์‚ฌํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ผ๋ฐ˜ ๋ธŒ๋กœ์ปค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•˜๊ณ  ์ €์žฅํ•˜๋Š” ์—ญํ• ๋งŒ ์ง‘์ค‘ํ•ฉ๋‹ˆ๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ›„๋ณด์ž๋กœ ์ „ํ™œ ๋  ๋•Œ๋Š” ๋ฏธ๋ฆฌ ์„ค์ •๋œ ๋žœ๋ค Timeout ๊ฐ’์— ์˜ํ•ด ์ „ํ™˜ ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์ปจํŠธ๋กค๋Ÿฌ๋งˆ๋‹ค ๋ถ€์—ฌ๋ฐ›์€ Timeout ๊ฐ’์ด ์ œ๊ฐ๊ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ํˆฌํ‘œํ•  ํ›„๋ณด์ž๊ฐ€ 2๋ช…์ด ๋˜๋Š” ์ผ์€ ์•„์ฃผ ๋“œ๋ญ…๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋งŒ์•ฝ, ํ›„๋ณด๊ฐ€ 2๋ช… ์ƒ๊ฒผ๋‹ค๋ฉด, Kraft์—์„œ๋Š” ๋” ์ตœ์‹  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋กœ๊ทธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ์ชฝ์ด ํˆฌํ‘œ๋ฅผ ๋ฐ›๋„๋ก ๊ฐ•์ œ ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ, ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋™๋ฅ ์ด ๋‚˜์˜จ๋‹ค๋ฉด, ์ƒˆ๋กœ์šด ๋žœ๋ค Timeout์„ ๋‹ค์‹œ ๋ถ€์—ฌ ํ•˜๊ณ , ๋‹ค์Œ ์„ ๊ฑฐ๊ฐ€ ์—ด๋ฆฌ๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

Deploy on Kubernetes

์ด์ „์˜ Deploy Kafka on Kubernetes์—์„œ ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ bitnami-kafka Helm Chart๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ €, ์•„๋ž˜์™€ ๊ฐ™์ด helmfile.bitnami-kafka-kraft.yaml์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.

# @helmfile.bitnami-kafka-kraft.yaml
repositories:
  - name: bitnami
    url: https://charts.bitnami.com/bitnami

releases:
  - name: bitnami-kafka
    namespace: kafka
    chart: bitnami/kafka
    version: 31.1.1
    values:
      - ./values.bitnami-kafka-kraft.yaml

๋ณธ๋ž˜ bitnami-kafka๋Š” Kraft ๋ชจ๋“œ๋กœ ์นดํ”„์นด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค๋งŒ, ์ €ํฌ๋Š” ์•ฝ๊ฐ„ ์ปค์Šคํ…€์„ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ values.bitnami-kafka-kraft.yaml ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

# @values.bitnami-kafka-kraft.yaml
zookeeper:
  enabled: false

kraft:
  enabled: true

broker:
  replicaCount: 3

controller:
  replicaCount: 3

listeners:
  client:
    protocol: 'PLAINTEXT'
  controller:
    protocol: 'PLAINTEXT'
$ kgp
NAME                         READY   STATUS    RESTARTS      AGE
bitnami-kafka-controller-1   1/1     Running   0             113s
bitnami-kafka-controller-2   1/1     Running   0             113s
bitnami-kafka-controller-0   1/1     Running   0             113s
bitnami-kafka-broker-1       1/1     Running   0             113s
bitnami-kafka-broker-2       1/1     Running   0             113s
bitnami-kafka-broker-0       1/1     Running   0             113s

3๋Œ€์˜ ์ปจํŠธ๋กค๋Ÿฌ์™€ 3๋Œ€์˜ ์ผ๋ฐ˜ ๋ธŒ๋กœ์ปค๋กœ ์นดํ”„์นด ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๊ตฌ์„ฑ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ์‹ ๊ธฐํ•œ ์ ์€ Zookeeper ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์—†๋‹ค๋Š” ์ ์ด์ฃ ! (๋Œ€์‹  Controller๋“ค์ด ์ƒ๊ฒผ์œผ๋‹ˆ ๋ฆฌ์†Œ์Šค๋Š” ๋น„์Šทํ•˜๊ฒŒ ์“ฐ๋ ค๋‚˜์š”? ๐Ÿค”)

Check Kraft Metadata

Kraft ํด๋Ÿฌ์Šคํ„ฐ์˜ ํ˜„์žฌ ์ •๋ณด๋ฅผ ํ™•์ธํ•ด๋ด…์‹œ๋‹ค.

$ kafka-metadata-quorum.sh \
  --bootstrap-server bitnami-kafka:9092 \
  describe --status
ClusterId:              uCTcACi4VDHJQ1KNvNxjrb
LeaderId:               0
LeaderEpoch:            5
HighWatermark:          718
MaxFollowerLag:         0
MaxFollowerLagTimeMs:   0
CurrentVoters:          [{"id": 0, "directoryId": null, "endpoints": ["CONTROLLER://bitnami-kafka-controller-0.bitnami-kafka-controller-headless.kafka.svc.cluster.local:9093"]}, {"id": 1, "directoryId": null, "endpoints": ["CONTROLLER://bitnami-kafka-controller-1.bitnami-kafka-controller-headless.kafka.svc.cluster.local:9093"]}, {"id": 2, "directoryId": null, "endpoints": ["CONTROLLER://bitnami-kafka-controller-2.bitnami-kafka-controller-headless.kafka.svc.cluster.local:9093"]}]
CurrentObservers:       [{"id": 102, "directoryId": "Hw2L-tv6Xs9Ho7qENmW71g"}, {"id": 100, "directoryId": "4ES0SAcYLzFQVJ2diLkQ6A"}, {"id": 101, "directoryId": "GMd5xaITd4TWXvhvAJ_VEQ"}]

ํ˜„์žฌ ๋ˆ„๊ฐ€ ๋ฆฌ๋” ๋…ธ๋“œ์ธ์ง€, ์ง€๊ธˆ๊นŒ์ง€ ๋ช‡ ๋ฒˆ์˜ ์„ ๊ฑฐ๊ฐ€ ์žˆ์—ˆ๋Š”์ง€(Leader Epoch), Kraft๊ฐ€ ๋ช‡๊ฐœ์˜ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๊ตฌ์„ฑ ๋˜์–ด ์žˆ๋Š”์ง€ ๊ทธ๋ฆฌ๊ณ  Kraft๋ฅผ ์ด๋ฃจ๋Š” ์ผ๋ฐ˜ ๋ธŒ๋กœ์ปค๋“ค์ธ Observer๋Š” ์–ผ๋งˆ๋‚˜ ๋˜๋Š”์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ์ƒํƒœ์—์„œ ํ˜„์žฌ ๋ฆฌ๋” ๋…ธ๋“œ์ธ 0๋ฒˆ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ kubectl delete๋กœ ์ž ์‹œ ๋‹ค์šด ์‹œ์ผœ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ kafka-metadata-quorum.sh๋กœ ํ™•์ธํ•˜๋ฉด

ClusterId:              uCTcACi4VDHJQ1KNvNxjrb
LeaderId:               1
LeaderEpoch:            6
HighWatermark:          1130
MaxFollowerLag:         0
MaxFollowerLagTimeMs:   28
CurrentVoters:          [{"id": 0, "directoryId": null, "endpoints": ["CONTROLLER://bitnami-kafka-controller-0.bitnami-kafka-controller-headless.kafka.svc.cluster.local:9093"]}, {"id": 1, "directoryId": null, "endpoints": ["CONTROLLER://bitnami-kafka-controller-1.bitnami-kafka-controller-headless.kafka.svc.cluster.local:9093"]}, {"id": 2, "directoryId": null, "endpoints": ["CONTROLLER://bitnami-kafka-controller-2.bitnami-kafka-controller-headless.kafka.svc.cluster.local:9093"]}]
CurrentObservers:       [{"id": 102, "directoryId": "Hw2L-tv6Xs9Ho7qENmW71g"}, {"id": 100, "directoryId": "4ES0SAcYLzFQVJ2diLkQ6A"}, {"id": 101, "directoryId": "GMd5xaITd4TWXvhvAJ_VEQ"}]

1๋ฒˆ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ƒˆ๋กœ์šด ๋ฆฌ๋” ๋…ธ๋“œ๋กœ ์„ ์ถœ๋˜์—ˆ๊ณ , Leader Epoch๊ฐ€ 5์—์„œ 6์œผ๋กœ ํ•˜๋‚˜ ์ฆ๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค!

__cluster_metadata Topic

Confluent: The Apache Kafka Control Plane

Kraft ๋ชจ๋“œ์—์„œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ๋ชจ๋“  ๋ธŒ๋กœ์ปค๋“ค์ด ๋ถ„์‚ฐ ์ €์žฅ ํ•ฉ๋‹ˆ๋‹ค. __cluster_metadata๋ผ๋Š” ํ† ํ”ฝ์— ํด๋ŸฌํŠธ์„œ ์ •๋ณด๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋ฉฐ, ์ด ํ† ํ”ฝ์€ ๋‹จ์ผ Partition์œผ๋กœ ๊ตฌ์„ฑ ๋ฉ๋‹ˆ๋‹ค.

์ฃผํ‚คํผ ๋ชจ๋“œ์—์„œ๋Š” ๊ฐ ๋ธŒ๋กœ์ปค๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ๋™๊ธฐํ™” ํ•˜๊ธฐ ์œ„ํ•ด ์ฃผํ‚คํผ์— ์ฃผ๊ธฐ์ ์œผ๋กœ fetch ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ด์ œ๋Š” ๋ณธ์ธ์ด ํŒ”๋กœ์›Œ ํŒŒํ‹ฐ์…˜์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” __cluster_metadata ํ† ํ”ฝ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ __cluster_metadata์— ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ์€ ๋ฆฌ๋” ๋…ธ๋“œ๊ฐ€ ๋ฐฐํƒ€์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ์ด ์ •๋ณด๋Š” Kafka์˜ ๋ฆฌ๋”-ํŒ”๋กœ์›Œ ํŒŒํ‹ฐ์…˜ ์‚ฌ์ด์˜ ๋ณต์ œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋”ฐ๋ผ ์ „ํŒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, Kafka-native ํ•˜๊ฒŒ ํด๋Ÿฌ์Šคํ„ฐ ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด์ฃ !! ๐Ÿ˜ฒ

Snapshot

Confluent: The Apache Kafka Control Plane

๊ฐ ๋ธŒ๋กœ์ปค๋Š” __cluster_metadata์˜ ๋‚ด์šฉ์„ ์••์ถ•ํ•ด .snapshot ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด ๋ณด๊ด€ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  __cluster_metadata์˜ ์šฉ๋Ÿ‰์„ Truncate๋กœ ๊ฐ์ถ• ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ .snapshot์„ ๋งŒ๋“œ๋Š” ์ด์œ ๋Š” ๋น ๋ฅธ ๋ณต๊ตฌ๋ฅผ ์œ„ํ•ด์„œ ์ž…๋‹ˆ๋‹ค! ๋งŒ์•ฝ, ๋ธŒ๋กœ์ปค๊ฐ€ ์œ ์‹ค ๋˜์—ˆ๊ณ  ๋ณต๊ตฌ๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์ด๋ผ๊ณ  ํ•ด๋ด…์‹œ๋‹ค. __cluster_metadata์— ์žˆ๋Š” ๋กœ๊ทธ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ณด๋‚ธ๋‹ค๋ฉด ๋ธŒ๋กœ์ปค๊ฐ€ ๋ณต๊ตฌ ๋˜๋Š”๋ฐ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๋น ๋ฅธ ๋ณต๊ตฌ๋ฅผ ์œ„ํ•ด ์••์ถ•๋œ ์ •๋ณด์ธ .snapshot์„ ๋Œ€์‹  ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ธŒ๋กœ์ปค ๋ณต๊ตฌ ์‹œ๊ฐ„์„ ํš๊ธฐ์ ์œผ๋กœ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์ฃผํ‚คํผ๋„ ํˆฌํ‘œ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

Kraft ๋ชจ๋“œ๋ฅผ ์ฒ˜์Œ ๋ฐฐ์šธ ๋•Œ, ์˜คํ•ดํ–ˆ๋˜ ์ ์€ Raft ํ”„๋กœํ† ์ฝœ๋ฅผ ์ฑ„ํƒํ•˜๋Š”๊ฒŒ, Kraft ๋ชจ๋“œ์˜ ๋ชฉํ‘œ์ธ ์ค„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋ž˜๋„ ์ด๋ฆ„์— โ€œRaftโ€๋ผ๊ณ  ๋–กํ•˜๋‹ˆ ์žˆ์œผ๋‹ˆ ๊ทธ๋ ‡๊ฒŒ ์˜คํ•ด ํ–ˆ๋‚˜๋ด…๋‹ˆ๋‹ค;; ๊ธ€์„ ์ ์œผ๋ฉด์„œ ๋Œ์•„๋ณด๋ฉด, Kraft๊ฐ€ ๋„์ž…๋œ ๊ฒƒ์€ ๋” ๊ฐ„ํŽธํ•œ ์นดํ”„์นด ํด๋Ÿฌ์Šคํ„ฐ ์šด์˜๊ณผ ๋ณต๊ตฌ๊ฐ€ ํ•ต์‹ฌ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ฃผํ‚คํผ์—๋„ Kraft์ฒ˜๋Ÿผ Quorum(์ •์กฑ์ˆ˜)๊ฐ€ ์žˆ๊ณ , ๋ฆฌ๋”์™€ ํŒ”๋กœ์›Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋”๊ฐ€ ํด๋ผ์ด์–ธํŠธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ํŒ”๋กœ์›Œ๋Š” ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œ ํ•ด๋’€๋‹ค๊ฐ€, ๋ฆฌ๋” ์ฃผํ‚คํผ ๋…ธ๋“œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ๊ณผ๋ฐ˜์ˆ˜ ํˆฌํ‘œ๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๋ฆฌ๋”๋ฅผ ์„ ์ถœ ํ•ฉ๋‹ˆ๋‹ค. Raft ํ”„๋กœํ† ์ฝœ๊ณผ ์•„์ฃผ ์œ ์‚ฌํ•˜๊ฒŒ ๋Œ์•„๊ฐ€์ฃ . ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฐ ํˆฌํ‘œ ๋ฐฉ์‹์ด Raft ํ”„๋กœํ† ์ฝœ์„ ๋”ฐ๋ฅธ๋‹ค๊ณ  ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ZAB(Zookeeper Atomic Broadcast)๋ผ๋Š” ์ž์ฒด์ ์ธ ํˆฌํ‘œ&ํ•ฉ์˜ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ ์ปจ์…‰์ด ๋น„์Šทํ•˜๊ณ  ์„ธ๋ถ€ ์‚ฌํ•ญ์—์„œ ์กฐ๊ธˆ ๋‹ค๋ฅธ๊ฒŒ ์žˆ๋‚˜๋ด…๋‹ˆ๋‹ค.

๋งบ์Œ๋ง

๊ทธ๋™์•ˆ ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋กœ ์ผ์„ ํ•˜๋ฉด์„œ, ์—ฌ๋Ÿฌ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์„ ์ ‘ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

  • Kubernetes
    • ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ๊ณผ ์›Œ์ปค ๋…ธ๋“œ
    • CPU์™€ Memory ๋“ฑ๋“ฑ์˜ ์ž์›์„ Pod์— ์–ด๋–ป๊ฒŒ ๋ถ„๋ฐฐํ• ์ง€์— ๋Œ€ํ•ด
    • ๊ทธ๋ฆฌ๊ณ  ๋„คํŠธ์›Œํฌ๋‚˜ Topology๋‚˜ ๋“ฑ๋“ฑ๋“ฑ
  • Istio
    • ์„œ๋น„์Šค ๋ฉ”์‰ฌ์— ๋Œ€ํ•ด
    • ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ์˜ ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํ• ์ง€์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜
  • Spark
    • ๋“œ๋ผ์ด๋ฒ„ ๋…ธ๋“œ์™€ ์›Œ์ปค ๋…ธ๋“œ๊ฐ€ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€์— ๋Œ€ํ•ด
    • Map-Reduce์˜ ๊ตฌํ˜„์ฒด
  • ElasticSearch
    • ๋น ๋ฅธ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ
  • Kafka
    • ๊ฐ•๊ฑดํ•œ ๋ถ„์‚ฐ ๋กœ๊น… ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์†”๋ฃจ์…˜

์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ์žฅ์• ๋ฅผ ์–ด๋–ป๊ฒŒ ๋น ๋ฅด๊ฒŒ ๋ณต๊ตฌํ• ๊นŒ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ Kafka๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ œ์ผ ๋งŽ์ด ์ ‘ํ•˜๊ฒŒ ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! ๊ทธ๋งŒํผ Kafka๊ฐ€ Fault Tolerance์— ๊ฐ•๊ฑดํ•˜๋ ค๋Š” ์ฒ ํ•™์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ ์ด๊ฒ ์ฃ  ใ…Žใ…Ž

์ด๊ฒƒ์ €๊ฒƒ ๋งŽ์ด ๋ฐฐ์šฐ๋ฉด, ์ด๋„์ €๋„ ์•ˆ ๋˜๋Š”๊ฒŒ ์•„๋‹Œ๊ฐ€ ์‹ถ์€ ์ƒ๊ฐ๋„ ์žˆ์ง€๋งŒโ€ฆ ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ผ๋Š” ๋ถ„์•ผ๊ฐ€ ๋‘๋ฃจ๋‘๋ฃจ ์•Œ๋ฉด ์ข‹์€ ์ ์ด ๋งŽ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชฉ์ ์„ ์œ„ํ•ด ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ ์ •ํ•ด ๋ฐ”๋กœ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋Š๋‚Œ์ด์ง€๋งŒ, ๋ฐฐ๊ฒฝ์ง€์‹์ด ์–ผ๋งˆ๋‚˜ ๋˜๋Š๋ƒ์— ๋”ฐ๋ผ์„œ ํ”„๋กœ์ ํŠธ์™€ โ€œ์šด์˜โ€์˜ โ€œ๋””ํ…Œ์ผโ€์˜ ์ˆ˜์ค€์ด ๊ฒฐ์ • ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ โ€˜๋งŒ์•ฝ ๋‚ด๊ฐ€ ์ด๋Ÿฐ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๋ฉด, ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค๊นŒ?โ€™๋ผ๋Š” ์ƒ์ƒ๋„ ๋งŽ์ด ํ•˜๊ฒŒ ๋˜๊ตฌ์š” ใ…Žใ…Ž

์•”ํŠผ ์ฃผ์ €๋ฆฌ์ฃผ์ €๋ฆฌ ์˜€๊ตฌ์š”! ์˜ฌํ•ด๋„ ์ƒˆ๋กœ์šด ๋„์ „์„ ์œ„ํ•ด ํŒŒ์ž‡ํž! ํ•ด๋ด…์‹œ๋‹ค!!

References

Categories:

Updated: