[Kafka] 카프카(Apache Kafka)란?
Programming

[Kafka] 카프카(Apache Kafka)란?

728x90

아파치 카프카(Apache Kafka)는 간단하게 카프카라고도 불리며, 실시간으로 처리할 데이터가 많은 현대의 서비스에서 자주 사용되는 기술인 것 같습니다. 아마 한번쯤 이름은 들어보셨을 것 같아요.

 

자 그럼 바로 한번 알아볼까요?!


카프카(Kafka)란?

카프카는 링크드인(LinkedIn)에서 처음 개발된 분산 메시징 시스템입니다! 네 우리가 아는 그 인맥 소셜 네트워크 서비스입니다!

 

왜 개발이 되었나요?

링크드인은 소셜 네트워크 서비스이다보니 서비스 특성상 많은 데이터의 생성/적재가 필요했습니다. 따라서 데이터를 생성하는 소스 애플리케이션과 데이터가 최종 적재되는 타겟 애플리케이션이 연결되는 파이프라인이 필요했습니다. 초기운영시에는 단방향 통신을 통해 파이프라인을 연동했고 그렇게 복잡하지 않았지만.. 소스->타겟 애플리케이션의 종류와 갯수가 점점 많아지면서 파이프라인이 급격하게 복잡해지기 시작했습니다.

카프카 도입 전 아키텍쳐 (링크드인 공식 블로그 http://bit.ly/3pIwdM8)

위 그림만 봐도 복잡한게 보이지 않나요? 문제는 여기서 끝이아니라 새로운 파이프라인이 생길때마다 악화될것이 불보듯 뻔했습니다. 속도는 둘째치고 서비스를 안정적으로 운영하는데 치명적일 수 밖에 없겠죠. 타겟 애플리케이션에 장애가 생길경우 얼마나 영향이 크게 있을지도 알수가 없고요. 따라서 이를 해결하기 위해 지금의 카프카가 된 다음과 같은 설계가 탄생합니다.

카프카 도입 후 아키텍쳐

그림만 봐도 얼마나 정리가 됐는지 바로 보이시죠?! 이처럼 카프카는 가각 애플리케이션끼리 연결하여 데이터를 처리하는 것이 아니라 한 곳에 모아 처리할 수 있도록 중앙 집중화를 하였습니다. 이로 인해 모든 곳에서 발생한 데이터 스트림을 한곳에서 실시간으로 관리할 수 있게 된 것이죠!

 

이게 어떻게 가능하냐고요? 지금 바로 카프카의 구조에 대해 알아봅시다!


Publish-Subscribe (Pub-Sub) 시스템

카프카는 Publish-Subscribe 방식으로 데이터를 전송하는데요! 위에 "카프카 도입 후 아키텍쳐" 그림을 보면 모든 애플리케이션이 중앙에 한곳으로 데이터를 보내고, 중앙에서 다시 다른곳으로 퍼지는 것을 볼 수 있습니다. Pub/Sub 구조라고도 불리는 이 구조는 비동기식(Asynchronous) 메세징 패턴입니다.

 

비동기식 메세징이 뭐에요?

https://honglab.tistory.com/61

위 블로그에서 그림을 아주 잘 만들어주신 것 같습니다. 메세징은 말그대로 어떠한 정보를 전달하는 것이라고 보시면 됩니다. 메세지를 보내는 것이죠. 정리하면 다음과 같습니다

  • 동기식(Synchronous): 메세지를 보내고, 메세지를 받았다는 것을 확인해야 다음 메세지 보냄
  • 비동기식(Asynchrous): 메세지를 보내고 받았는지 안받았는지 신경안쓰고 다음 메세지 보냄 

Pub/Sub 구조

https://honglab.tistory.com/61

따라서 pub/sub 구조에서는 비동기식 메시징으로 Publisher(메시지를 보내는 쪽)는 중앙에 메세지를 보내기만 합니다. 이 메세지가 처리되었는지 여부는 Publisher가 신경쓰지 않습니다. Subscriber(메시지를 받는 쪽)는 중앙에 쌓여있는 메시지를 읽어오기만 합니다.

 

이처럼 메시지가 처리되는 하나의 파이프라인이 완성되지만, 낮은 결합도로 인해 확장성이 굉장히 좋고 메시지도 관리하기 편하게 됩니다.


카프카 구성 요소

https://ifuwanna.tistory.com/487

카프카는 이처럼 Pub/Sub 구조를 가지고 있지만 카프카만의 구성요소 및 용어가 따로 존재합니다.

  • 이벤트(Event): 
    • 카프카에서 전달되는 메시지 단위입니다. 이벤트 또는 메시지로 불립니다.
  • 브로커(Broker):
    • 카프카 애플리케이션이 설치된 서버 또는 노드를 지칭합니다. 카프카는 기존 메시징 시스템과 다르게 디스크에 메시지를 저장합니다. 따라서 브로커는 메시지가 저장되는 서버라고 보셔도 됩니다.
  • 카프카 클러스터(KafkaCluster):
    • 확장성과 고가용성을 위하여 여러대의 브로커들이 클러스터 형태로 관리됩니다. 이 클러스터를 카프카 클러스터라고 합니다.
  • 프로듀서(Producer):
    • 메시지를 브로커에 publish 하여 생산(write)하는 역할을 합니다. 메세지에 토픽정보를 포함합니다.
  • 컨슈머(Consumer):
    • 메시지를 브로커에서 subscribe 하여 소비(read)하는 역할을 합니다.
  • 주키퍼(Zookeeper):
    • 카프카 클러스터를 실질적으로 제어하고 관리해주는 역할을 합니다. 구성관리, 그룹 네이밍, 동기화 등의 서비스를 수행합니다.

카프카 데이터 모델

https://ifuwanna.tistory.com/487

너무 용어가 많아서 잠깐 끊고가겠습니다 ㅠㅠ 위의 용어는 카프카에서 Pub/Sub 구조가 어떻게 이루어져있는지 설명하기 위한 용어들이라면 아래는 실제로 메시지가 어떻게 저장되는지를 설명하기 위한 용어입니다.

  • 토픽(Topic):
    • 메시지를 논리적으로 묶은 개념입니다. RDB에서는 테이블이랑 비슷하고, 파일시스템에서는 폴더와 비슷한 개념이라고 보시면 됩니다. 컨슈머는 특정 Topic을 지정하여 읽어옵니다.
  • 파티션(Partition):
    • 토픽은 메시지를 논리적으로 묶은 개념이고, 파티션은 실제로 메시지가 저장되는 저장소입니다. 따라서 하나의 토픽은 여러개의 파티션으로 이루어질 수 있습니다.
  • 오프셋(Offset):
    • 컨슈머가 현재 어디까지 읽었는지 표시해주는 책갈피같은 개념입니다. 컨슈머는 오프셋을 기준으로 마지막 커밋시첨부터 메시지를 순서대로 읽어서 처리합니다. 위 그림처럼 파티션이 많을수록 메시지를 더 빠르게 처리할 수 있겠죠? (항상 그런것은 아닙니다)
  • 컨슈머 그룹(Consumer Group):
    • 컨슈머 그룹은 하나의 토픽을 구독하는 여러 컨슈머들의 모음입니다. 이는 가용성 때문에 존재하는데요, 하나의 토픽을 하나의 컨슈머가 아니라 여러 컨슈머가 동시에 처리하면 훨씬 빠를것입니다. 하지만 컨슈머 그룹의 각 컨슈머는 하나의 토픽내에서 각기 다른 파티션의 내용만을 처리할 수 있습니다. 하나의 컨슈머가 여러 파티션에서 읽어올 수는 있지만, 여러 컨슈머가 동일한 파티션을 읽을 수는 없습니다. 따라서 모든 컨슈머가 서로 안겹치도록 파티션을 담당하게 되는 것이죠!
  • 리밸런스(Rebalance):
    • 컨슈머 그룹이 토픽을 구독하면, 하나의 컨슈머별로 독립적인 파티션을 담당한다고 했었죠. 혹시 그 파티션을 담당하던 컨슈머가 처리불가 상태가되면 어떡하죠? 이때는 컨슈머 그룹에서 남은 컨슈머들이 연결이 끊긴 파티션에 알아서 적절하게 재배치되어 마지막 오프셋부터 이어서 처리가 됩니다. 이 재배치되는 과정을 리밸런싱이 일어난다고 합니다.

카프카의 특징 및 컨셉

카프카는 다음과 같은 특징을 가지고 있습니다.

  • 높은 처리량:
    • 카프카는 프로듀서가 브로커로 데이터를 보낼때, 그리고 컨슈머가 브로커에서 메시지를 읽어올때 모두 묶어서 전송합니다. 따라서 네트워크 통신 횟수를 최소한으로 줄이고, 묶음 단위로 처리하기 때문에 대용량의 실시간 처리가 가능합니다
  • 확장성:
    • 카프카는 각각의 역할이 낮은 결합도로 묶여있어서 쉽게 확장이 가능합니다. 데이터가 많아지면 처리량이 더 높아질 수 있도록 브로커의 갯수를 늘릴 수 있고, 파티션 갯수에 따라 컨슈머를 더 늘리는 것도 쉽게 가능합니다.
  • 영속성:
    • 카프카는 메모리에 저장되는 기존의 메시징 시스템과 다르게 파일시스템에 파일로 저장이되기때문에, 데이터를 생성한 프로그램이 종료되더라도 데이터가 남아있습니다! 따라서 애플리케이션이 종료되더라도 이어서 메시지처리가 가능합니다.
  • 고가용성:
    • 카프카는 장애에 대한 대비가 상당히 잘 돼있습니다. 브로커가 클러스터로 이루어져있고 복제(replication)을 통해 같은 메시지를 다른 브로커에서도 가지고있습니다. 따라서 하나의 브로커에 장애가 발생해도 계속해서 데이터 처리가 가능합니다.

또한 메시징 시스템이기 때문에 메시지를 보장하는 여러가지 방법이 있습니다

  • At most once(최대 한번): 메시지가 유실될수도 있지만, 재전달은 하지 않습니다
  • At least once(최소 한번): 메시지 유실되지 않지만, 재전달이 일어날 수 있습니다
  • Exactly once(한번): 정확히 메시지가 한번만 전달되도록 합니다.

오늘은 카프카에 대해서 알아봤습니다. 실무에서 자주 사용하고 있지만, 카프카의 역사와 정확한 특징은 모르고 있던 부분이 많았던것같습니다.

 

오늘도 읽어주셔서 감사합니다!

 

출처:
- Apache Kafka란 무엇일까요?
- [Kafka] #1 - 아파치 카프카(Apache Kafka)란 무엇인가?
- Kafka - kafka란? (Kafka의 구조와, 주요개념)
- [Pub/Sub] Publish/Subscribe 구조(모델)
- 아파치 카프카 애플리케이션 프로그래밍/최원영 - 도서
- [Kafka] 카프카란? 주요개념 및 용어 소개
728x90

'Programming' 카테고리의 다른 글

[MQ] RabbitMQ 란?  (0) 2023.04.11
[보안] SHA 암호화 알고리즘  (0) 2022.11.01
[k8s] 쿠버네티스(kubernates, k8s)란?  (0) 2022.10.31
[기술] 가상화(Virtualization)란?  (0) 2022.10.30
[Docker] 도커(Docker)란? 도커의 역사  (0) 2022.10.30