λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
✨ 데브옡슀: DevOps

Kafka κ°œλ… 정리 (Pub/Sub λͺ¨λΈ, Zookeeper, Broker, Topic, Partition, Offset, Producer, Consumer)

by 🐀 쀀콩이 2023. 6. 22.

πŸ€” Kafka κ°€ 뭔데?

 

Kafka λŠ” LinkedIn μ—μ„œ 개발된 μ˜€ν”ˆ μ†ŒμŠ€ λ©”μ‹œμ§• μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.

ν˜„μž¬λŠ” Apache Software Foundation μ—μ„œ κ΄€λ¦¬λ˜λŠ” Apache Kafka ν”„λ‘œμ νŠΈλ‘œ λ°œμ „ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

Kafka λ„μž… μ „

 

Kafka κ°€ λ„μž…λ˜κΈ° μ „μ—λŠ” μœ„μ™€ 같이 end-to-end μ—°κ²° λ°©μ‹μœΌλ‘œ μ—¬λŸ¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜λ“€μ΄ 데이터λ₯Ό μ£Όκ³  λ°›μ•˜μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ„œλΉ„μŠ€κ°€ μ»€μ§€λ©΄μ„œ λ³΅μž‘λ„κ°€ μ¦κ°€ν–ˆκ³  ν™•μž₯이 μ–΄λ €μ›Œμ§€κ³  μž₯μ•  λ°œμƒ κ°€λŠ₯성이 μ»€μ§€λŠ” 문제점이 λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

 

Kafka λ„μž… ν›„

 

μ΄λŸ¬ν•œ λ¬Έμ œμ λ“€μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ Kafka κ°€ κ°œλ°œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

Kafka λ₯Ό λ„μž…ν•œ κ²°κ³Ό λ°œμƒλ˜λŠ” λͺ¨λ“  데이터와 λ°μ΄ν„°μ˜ 흐름을 μ€‘μ•™μ—μ„œ 관리할 수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ μ„œλΉ„μŠ€μ˜ νŠΉμ • λΆ€λΆ„μ—μ„œ μž₯μ• κ°€ λ°œμƒν•˜λ”λΌλ„ Kafka λŠ” λ°μ΄ν„°μ˜ μœ μ‹€ 및 쀑볡에 λŒ€ν•΄ λŒ€μ²˜ν•  수 μžˆλŠ” μ—¬λŸ¬ 방법이 있기 λ•Œλ¬Έμ— μž₯μ• λ₯Ό μœ μ—°ν•˜κ²Œ μ²˜λ¦¬ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. scale out 이 μš©μ΄ν•œ μ‹œμŠ€ν…œμ΄κΈ° λ•Œλ¬Έμ— μ„œλΉ„μŠ€ ν™•μž₯도 μš©μ΄ν•΄μ‘ŒμŠ΅λ‹ˆλ‹€.

 

 

πŸ‘» Pub/Sub λͺ¨λΈ

 

Kafka λŠ” μ–΄λ–»κ²Œ 데이터 관리λ₯Ό 쀑앙집쀑화 ν•  수 μžˆμ—ˆμ„κΉŒμš”?

μ΄λŠ” Kafka κ°€ Pub/Sub λͺ¨λΈμ„ 기반으둜 λ§Œλ“€μ–΄μ§„ μ‹œμŠ€ν…œμ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

Pub/Sub λͺ¨λΈμ΄λž€ Publish/Subscribe 의 μ€„μž„λ§λ‘œ λ©”μ‹œμ§€ 기반 미듀웨어 μ‹œμŠ€ν…œμ„ μ˜λ―Έν•©λ‹ˆλ‹€.

 

Pub/Sub λͺ¨λΈ

 

Pub/Sub λͺ¨λΈμ—λŠ” 이벀트(λ©”μ‹œμ§€)λ₯Ό λ°œν–‰ν•˜λŠ” Publisher κ°€ μ‘΄μž¬ν•˜κ³ , Publisher λŠ” νŠΉμ • Channel(Topic)에 이벀트λ₯Ό μ „μ†‘ν•©λ‹ˆλ‹€.

ν•΄λ‹Ή μ΄λ²€νŠΈλŠ” νŠΉμ • Channel(Topic)을 κ΅¬λ…ν•˜λŠ” Subscriber 에 μ˜ν•΄ μ²˜λ¦¬λ©λ‹ˆλ‹€.

 

μ΄λŸ¬ν•œ λͺ¨λΈμ„ 기반으둜 ν•˜λŠ” Kafka λ₯Ό λ„μž…ν•˜κ²Œ 되면, 각 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 이벀트λ₯Ό λ°œν–‰ν•œ ν›„ 이벀트의 μ²˜λ¦¬μ— λŒ€ν•΄μ„œλŠ” μ‹ κ²½μ“°μ§€ μ•Šμ•„λ„ 되기 λ•Œλ¬Έμ— λ³΅μž‘λ„κ°€ κ°μ†Œν•©λ‹ˆλ‹€. λ˜ν•œ Subscriber 에 μž₯μ• κ°€ λ°œμƒν•˜λ”λΌλ„ λ©”μ‹œμ§• μ‹œμŠ€ν…œλ§Œ μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λ©΄ μ΄λ²€νŠΈκ°€ μœ μ‹€λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μž₯μ• λ₯Ό μœ μ—°ν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆμ–΄μ‘ŒμŠ΅λ‹ˆλ‹€.

 

 

πŸ’‘ Kafka μ£Όμš” κ°œλ…

 

Kafka 에 λŒ€ν•΄ μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ•„λž˜μ™€ 같은 κ°œλ…λ“€μ— λŒ€ν•΄ ν•™μŠ΅ν•΄μ•Όν•©λ‹ˆλ‹€.

μš°μ„  κ°„λ‹¨ν•˜κ²Œ ν•œμ€„ μ„€λͺ…을 보고 λ„˜μ–΄κ°€κ² μŠ΅λ‹ˆλ‹€.

 

  • Zookeeper: Kafka 의 ν΄λŸ¬μŠ€ν„° 메타데이터와 μƒνƒœ 정보λ₯Ό μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” λΆ„μ‚° 코디넀이터 μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.
  • Broker: Kafka ν΄λŸ¬μŠ€ν„°λ₯Ό κ΅¬μ„±ν•˜λŠ” κ°œλ³„ μ„œλ²„ λ…Έλ“œλ‘œ, λ©”μ‹œμ§€ μˆ˜μ‹ , μ €μž₯, λΆ„λ°° λ“±μ˜ 역할을 μˆ˜ν–‰ν•˜λŠ” Kafka μ„œλ²„μž…λ‹ˆλ‹€.
  • Topic: Kafka μ—μ„œ 데이터λ₯Ό μ£Όκ³ λ°›λŠ” 주제λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ‹¨μœ„λ‘œ, κ΄€λ ¨λœ λ©”μ‹œμ§€λ“€μ΄ κ·Έλ£Ήν™”λ˜λŠ” μΉ΄ν…Œκ³ λ¦¬ λ˜λŠ” ν”Όλ“œμž…λ‹ˆλ‹€.
  • Partition: Kafka Topic 을 λΆ„ν• ν•˜μ—¬ μ—¬λŸ¬ νŒŒν‹°μ…˜μœΌλ‘œ λ‚˜λˆ„λŠ” κ²ƒμœΌλ‘œ, 각 νŒŒν‹°μ…˜μ€ μˆœμ„œκ°€ μžˆλŠ” λ©”μ‹œμ§€ μŠ€νŠΈλ¦Όμ„ ν¬ν•¨ν•˜λ©° λ³„λ„μ˜ μ˜€ν”„μ…‹μ„ κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€.
  • Offset: Kafka Topic λ‚΄μ—μ„œ λ©”μ‹œμ§€μ˜ μœ„μΉ˜λ₯Ό μ‹λ³„ν•˜λŠ” κ³ μœ ν•œ μ‹λ³„μžλ‘œ, Consumer κ°€ 읽은 λ©”μ‹œμ§€μ˜ μœ„μΉ˜λ₯Ό μΆ”μ ν•˜κ³  κ΄€λ¦¬ν•˜λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€.
  • Producer: Kafka 에 데이터λ₯Ό μƒμ„±ν•˜μ—¬ νŠΉμ • Topic 으둜 λ³΄λ‚΄λŠ” 역할을 ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ˜λŠ” μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€.
  • Consumer: Kafka λ‘œλΆ€ν„° 데이터λ₯Ό μ†ŒλΉ„ν•˜λŠ” 역할을 ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ˜λŠ” μ»΄ν¬λ„ŒνŠΈλ‘œ, Topic 의 λ©”μ‹œμ§€λ₯Ό 읽고 μ²˜λ¦¬ν•©λ‹ˆλ‹€. Consumer λŠ” Consumer Group 에 속할 수 있으며, λ©”μ‹œμ§€λ₯Ό λ³‘λ ¬λ‘œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

πŸ’Ž Zookeeper 와 Broker

 

Zookeeper 와 Broker

 

Broker λŠ” μΉ΄ν”„μΉ΄ μ„œλ²„ 쀑 1λŒ€λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

Broker μ„œλ²„λ₯Ό μ—¬λŸ¬ λŒ€λ‘œ κ΅¬μ„±ν•˜μ—¬ ν•˜λ‚˜μ˜ ν΄λŸ¬μŠ€ν„°λ‘œ κ΅¬μ„±ν•˜λŠ”λ°, 일반적으둜 λ‘œλ“œλ°ΈλŸ°μ‹±κ³Ό κ°€μš©μ„±μ„ μœ μ§€ν•˜κΈ° μœ„ν•΄ 3개의 Broker 둜 ν΄λŸ¬μŠ€ν„°λ₯Ό κ΅¬μ„±ν•©λ‹ˆλ‹€.

Broker κ°€ n개라고 ν–ˆμ„ λ•Œ, n개의 Broker λŠ” λ¦¬λ”μ˜ 역할을 μˆ˜ν–‰ν•˜λŠ” 리더(leader) 1κ°œμ™€ λ‚˜λ¨Έμ§€ n-1개의 νŒ”λ‘œμ›Œ(follower)둜 κ΅¬λΆ„λ©λ‹ˆλ‹€. λ¦¬λ”μ˜ 데이터가 변경될 λ•Œ νŒ”λ‘œμ›Œλ“€μ—λ„ 데이터가 λ™κΈ°ν™”λ˜κΈ° λ•Œλ¬Έμ— 리더 λ…Έλ“œμ— μž₯μ• κ°€ λ°œμƒν•  경우, λ‚˜λ¨Έμ§€ νŒ”λ‘œμ›Œλ“€ 쀑 ν•˜λ‚˜λ₯Ό λ¦¬λ”λ‘œ μ„ μ •ν•˜μ—¬ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— κ°€μš©μ„±μ„ μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

Zookeeper λŠ” Kafka ν΄λŸ¬μŠ€ν„°λ₯Ό κ΄€λ¦¬ν•˜λŠ” μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.

Broker λŠ” μƒνƒœλ₯Ό κ°€μ§€μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— Zookeeper κ°€ Broker λͺ©λ‘, Topic κ³Ό Partition 의 ꡬ성, 리더 μ„ μΆœ 정보와 같은 ν΄λŸ¬μŠ€ν„° 메타데이터λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.

리더λ₯Ό μ„ μΆœν•˜λŠ” 것 λ˜ν•œ Zookeeper 의 μ—­ν• μž…λ‹ˆλ‹€. 리더 λ…Έλ“œμ—μ„œ μž₯μ• κ°€ λ°œμƒν•  경우, Zookeeper λŠ” μƒˆλ‘œμš΄ λ…Έλ“œλ₯Ό 리더 λ…Έλ“œλ‘œ μ„ μΆœν•©λ‹ˆλ‹€.

 

 

πŸ’Ž Topic κ³Ό Partition, Offset

 

Topic κ³Ό Partition

 

Topic 은 데이터가 μ €μž₯λ˜λŠ” 곡간을 μ˜λ―Έν•˜κ³ , μ—¬λŸ¬ 개의 토픽이 생성될 수 μžˆμŠ΅λ‹ˆλ‹€.

Producer 와 Consumer λŠ” Topic 을 κΈ°μ€€μœΌλ‘œ 데이터λ₯Ό λ°œν–‰ν•˜κ³  κ΅¬λ…ν•©λ‹ˆλ‹€.

 

Partition 은 Topic λ‚΄μ—μ„œ 데이터λ₯Ό λΆ„μ‚° μ²˜λ¦¬ν•˜λŠ” λ‹¨μœ„λ‘œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

각각의 Topic 은 1개 μ΄μƒμ˜ Partition 으둜 κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

Partition 은 Queue 와 같은 FIFO ν˜•νƒœλ‘œ, Consumer λŠ” κ°€μž₯ 였래된 데이터뢀터 κ°€μ Έκ°‘λ‹ˆλ‹€.

Partition 을 λŠ˜λ¦¬λŠ” μ΄μœ λŠ” 데이터λ₯Ό λΆ„μ‚° μ²˜λ¦¬ν•˜κΈ° μœ„ν•¨μΈλ°, λ§Œμ•½ Producer A, B, C κ°€ 같은 Topic 에 데이터λ₯Ό μ „μ†‘ν–ˆλ‹€κ³  κ°€μ •ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. Topic 에 Partition 이 1개 인 경우, ν•΄λ‹Ή Partition μ—μ„œ A, B, C κ°€ λ³΄λ‚΄λŠ” λͺ¨λ“  데이터λ₯Ό μ²˜λ¦¬ν•΄μ•Όν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ Partition 이 μ—¬λŸ¬κ°œλ‘œ λŠ˜μ–΄λ‚œλ‹€λ©΄ Topic μ•ˆμ˜ μ—¬λŸ¬κ°œμ˜ Partition 듀이 데이터λ₯Ό λ³‘λ ¬μ μœΌλ‘œ μ²˜λ¦¬ν•  수 있게 λ©λ‹ˆλ‹€.

 

Offset

 

Offset 은 각 Partition λ§ˆλ‹€ 데이터가 μ €μž₯λ˜λŠ” μœ„μΉ˜λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

Offset 은 Partition λ§ˆλ‹€ μœ λ‹ˆν¬ν•œ 값을 κ°€μ§€κΈ° λ•Œλ¬Έμ— Consumer κ°€ 읽은 λ©”μ‹œμ§€μ˜ μœ„μΉ˜λ₯Ό μΆ”μ ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 데 μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

πŸ’Ž Producer 와 Consumer

 

Producer 와 Consumer

 

Producer λŠ” Topic 에 데이터λ₯Ό μ „μ†‘ν•˜λŠ” 역할을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

직렬화 → νŒŒν‹°μ…”λ‹ → λ©”μ‹œμ§€ 배치 → μ••μΆ• → 전달 의 과정을 거쳐 데이터λ₯Ό μ „μ†‘ν•©λ‹ˆλ‹€.

 

Consumer λŠ” Broker μ—μ„œ 데이터λ₯Ό κ°€μ Έμ˜€λŠ” 역할을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

ν•˜λ‚˜μ˜ Topic 을 μ—¬λŸ¬ 개의 Consumer 듀이 κ΅¬λ…ν•˜λŠ” 것도 κ°€λŠ₯ν•œλ°, Consumer κ°€ λ©”μ‹œμ§€λ₯Ό μ½μ—ˆμ„ λ•Œ λ©”μ‹œμ§€κ°€ λ°”λ‘œ μ‚­μ œλ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ™μΌν•œ 데이터λ₯Ό μ—¬λŸ¬ Consumer μ—μ„œ λ‹€μ–‘ν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ ν•˜λ‚˜ μ΄μƒμ˜ Consumer 둜 Consumer Group 을 ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.

Consumer Group 은 λ‹€λ₯Έ Consumer Group κ³Ό κ²©λ¦¬λ˜λŠ” νŠΉμ„±μ„ κ°€μ§€κ³  있기 λ•Œλ¬Έμ— λ™μΌν•œ 데이터에 λŒ€ν•΄ 각기 λ‹€λ₯Έ 역할을 ν•˜λŠ” Consumer Group 끼리 영ν–₯을 λ°›μ§€ μ•Šκ²Œ μ²˜λ¦¬ν•  수 μžˆλ‹€λŠ” νŠΉμ§•μ΄ μžˆμŠ΅λ‹ˆλ‹€.