Apache Kafka(아파치 카프카)로 구축하는 데이터 파이프라인과 대용량 데이터 처리까지

#Kafka #백엔드 #대용량 데이터 #실시간 데이터


Apache Kafka란 무엇이고, 언제 어떻게 사용해야 할까요?
이 글을 통해 Kafka의 정의, 기능, 동작 원리 등에 대해 살펴보세요.


📌 | Apache Kafka

카프카

Apache Kafka는 분산 메시지 스트리밍 플랫폼으로, 대용량 데이터 스트림을 안정적으로 수집, 저장, 전송 및 처리하는데 사용되는 소프트웨어입니다. 높은 확장성, 내구성, 신속성을 제공하기 때문에 단순히 데이터 스트리밍의 전송 뿐만 아니라 대용량 데이터 처리 및 실시간 데이터 스트리밍에 적합하다고 할 수 있습니다.

Apache Kafka의 주요 기능은 다음과 같습니다.
- 분산 아키텍처 : Kafka는 여러 브로커로 구성된 클러스터를 형성하며, 데이터 및 처리 부하를 분산하여 확장성을 제공합니다.
- 내구성 : 메시지는 디스크에 저장되어 장애 시에도 유실되지 않습니다.
- 고신뢰도 메시징 : 메시지 전달은 ‘적어도 한 번’, ‘많아도 한 번’, ‘정확히 한 번’과 같은 시멘틱을 통해 조절이 가능합니다.
- 실시간 데이터 처리 : Kafka 스트림 처리 API를 사용하여 데이터 스트림을 실시간으로 처리할 수 있으며, 데이터 처리 엔진을 연결하는데 이상적입니다.


📌 | Apache Kafka의 도입

카프카

Kafka가 도입되기 전에는 각각의 서비스들이 높은 결합도를 가지며 내부적으로 통신하는 end-to-end 연결 방식으로 데이터를 주고 받았습니다. 하지만 서비스가 계속해서 커지며 이러한 연결 방식으로 인한 복잡도가 증가하게 되면서 서비스의 통신을 관리하는 것에 많은 문제가 생기고, 이 모든 통신 방법들을 유지보수하기에도 어려워졌습니다. 또한 여러 개의 데이터 파이프라인은 각각의 데이터 포맷과 처리하는 방법들이 모두 다르기 때문에, 데이터 파이프라인을 확장하는 것에도 어려움이 있었습니다.

카프카

이 문제들을 해결하기 위해 도입된 것이 바로 Kafka입니다. 한 눈에 보기에도 깔끔해졌죠?
Kafka를 도입함으로써 발생하는 모든 데이터와 데이터의 흐름을 중앙에서 관리할 수 있게 되었고, 또한 서비스의 어느 특정 한 부분에서 장애가 생기더라도 전체로 번지지 않아 유연하게 대처할 수 있게 되었습니다.


📌 | Apache Kafka의 동작원리

그렇다면 Kafka는 어떻게 데이터 관리를 중앙 집중화할 수 있었을까요?
바로 Pub/Sub 모델을 기반으로 만들어졌기 때문입니다. Pub/Sub 모델은 메시지(이벤트)를 보내는 Publisher(=Producer)와 메시지(이벤트)를 가져가는 Subscriber(=Consumer)의 줄임말로, 메시지 기반 미들웨어 시스템을 의미합니다.

카프카

일반적인 end-to-end 연결 방식은 통신에 참여하는 개체가 많아질수록 다 일일이 연결하여 데이터를 전송하기 때문에 확장성이 좋지 않은데요. 이 Pub/Sub 모델을 통해 프로듀서가 메시지(이벤트)를 중간 메시징 시스템에 전달함으로써 확장성이 용이해지고, 또 각 애플리케이션은 메시지(이벤트)를 전달한 후 처리에 대해 생각할 필요가 없어 복잡도 또한 감소하게 됩니다.


📌 | Apache Kafka의 실전 사용

Apache Kafka는 실전에서 주로 어떤 목적으로 사용될까요?
먼저, 로그 및 이벤트 데이터 수집을 위해 사용됩니다. Apache Kafka는 웹 서버 로그, 애플리케이션 로그, 센서 데이터 등 다양한 종류의 데이터를 수집하고 저장합니다.
그리고 분산 시스템 간 데이터 이동을 위해 사용됩니다. Kafka는 시스템 및 마이크로서비스 간 데이터 통합을 위해 데이터를 안정적으로 이동시키며, 시스템 간 통신에 대한 표준 버스의 역할을 합니다.
또한 실시간 데이터 스트리밍을 위해 사용됩니다. Kafka는 스트림 처리 및 분석을 위해 실시간 데이터 스트림을 제공하며, 이를 활용하여 실시간 대시보드 및 알림 시스템을 구축합니다.

Apache Kafka는 Fortune 100대 기업 중 80% 이상의 기업들이 비즈니스에 활용하고 있을 정도로 널리 사용되고 있는 소프트웨어입니다. 국내에서도 이미 많은 기업에서 Apache Kafka를 활용하여 서비스를 제공하고 있으며, 이에 따라 많은 기업들이 Kafka를 잘 활용할 수 있는 인력을 찾고 있습니다. 때문에 대용량의 실시간 이벤트 스트림을 전송하거나 분석하기를 원하는 개발자, 또 이를 운영해야 하는 운영자는 Kafka의 기능, 특징 및 동작 원리를 잘 알고 있어야 대용량 트래픽 서비스를 안정적이고 유연하게 운영할 수 있습니다.

카프카

📌 | Kafka와 함께 활용되는 연계 스택

Kafka는 프로젝트에서 단독으로 사용되기보다는 인프라 & 백엔드 관련 기술 스택들과 함께 연계하며 사용합니다. 때문에 어떠한 상황에서 어떤 기술 스택과 어떻게 활용되는지 아는 것이 중요합니다.

1. 기본 메시징 큐 활용 : Spring 환경을 기본으로 실무 환경에서의 Kafka 활용 방법
- Docker / Docker compose / Spring Data JPA / Spring / Spring Cloud Streams
- ChatGPT / MySQL / IntelliJ idea / MongoDB / Gradle / Swagger
2. Kafka Ecosystem : Kafka 생태계를 구성하고 있는 다양한 솔루션들을 멀티 클러스터 구축에 사용
- Kafka Streams / Kafka Connect / Kafka sink / MirrorMaker2 / KSQL
3. Event-Driven 실습 : 백엔드 영역에서 Kafka와 함께 다룰 만한 여러 DB, 서비스와의 조합 활용 방법
- ElasticSearch / Logstash / Kibana / Redis / Debezium
4. 데이터 수집 및 분석 : 실시간 대용량 데이터 처리를 위한 기술 스택들 활용 방법
- Hadoop / Hive / Flink / Hadoop HDFS / Grafana
5. Kafka on K8S : 컨테이너 환경 위에 비동기 메시징큐 Kafka 구축 및 운영 방법
- Kubernetes / Prometheus / AWS / EKS

5가지 상황을 예로 들어 Kafka와 활용되는 기술 스택들을 보여드렸는데요.
이와 같이, 기본적인 Kafka 사용 방법을 넘어 다양한 상황 속에서 함께 연계되는 기술 스택 조합으로 실제 업무에서 Kafka를 응용하는 방법을 아셔야 합니다.


📌 | 클라우드 환경에서의 Kafka 활용

이제 조금 더 심화적인 내용으로 들어가 보겠습니다. 대부분의 애플리케이션의 구동 환경이 클라우드, 그중에서도 Kubernetes로 많이 옮겨가고 있는데요. 그에 따라 ‘Kafka 또한 Kubernetes 위에 올리는 것이 좋을지’ 대한 고민이 깊어지실 겁니다.

카프카

Kafka를 Kubernetes 위에 올리게 되면 많은 승인 과정을 단순화 시킬 수 있습니다. 또한 Kubernetes를 이용하여 스케일링 아웃, 모니터링 등의 기능을 훨씬 간편하게 사용할 수 있다는 장점이 있습니다.

- Kafka에 신규 broker를 추가하기에 용이
- 신규 Kafka Cluster 추가하기에 용이
- 여러 개의 Kafka Cluster를 관리하기에 용이

이러한 장점들이 많지만, Kafka를 Kubernetes 위에 올리는 것은 생각보다 어렵습니다. 구축을 위한 초기 세팅값 설정이나 운영 시 맞닥뜨리는 문제를 해결하기 위한 모니터링 및 장애 대응 방법까지, 실무에서 일어날 수 있는 다양한 상황에 대한 철저한 대비가 필요합니다.


📌 | Zookeeper의 한계와 KRaft의 등장

Kafka의 최신 기술 개념 KRaft에 대해 알려드리기에 앞서, Zookeeper의 얘기를 먼저 하겠습니다.
Zookeeper는 Kafka의 분산 처리를 위한 관리 도구입니다. Zookeeper의 지노드(Znode)를 이용하여 Kafka의 메타데이터, 브로커 상태, 토픽, 컨트롤러 등을 관리할 수 있습니다. 하지만 Zookeeper의 경우 카프카 자체가 아닌 외부에서 메타데이터 관리를 하다 보니 Kafka의 입장에서 제약 사항이나 한계성을 느끼게 되고, 결국 Kafka의 확장성에 제한이 되는데요. 때문에 데이터 중복, 브로커의 메타데이터와 Zookeeper의 메타데이터 불일치, 시스템 복잡성 증가, 서버/시스템 추가 필요 등 여러 가지 문제를 야기하게 됩니다.

그래서 2019년, 이런 문제들을 해결하기 위해 새로운 메타데이터 관리를 Kafka 자체에 도입할 계획을 세우게 되었는데, 이렇게 만들어진 것이 바로 KRaft입니다. KRaft는 Kafka 자체에 도입된 관리 시스템이기 때문에 훨씬 안정감 있고, 또한 메타데이터 복제를 통해 데이터의 일관성과 안정성을 보장합니다. 이를 통해 Kafka 클러스터는 향상된 컨트롤 플레인 성능으로 수백만 개의 파티션으로 확장할 수 있고, Kafka를 보다 더 쉽게 모니터링, 관리 및 지원할 수 있게 되었습니다. 안정성과 신뢰성을 요구하는 환경에서 이제 KRaft를 사용하는 것이 가장 최선의 선택이라고 볼 수 있습니다.

카프카

📌 | 이 모든 걸 아우르는 단 하나의 Kafka 강의

지금까지 Apache Kafka와 관련한 여러 개념들을 설명해 드렸는데요. 이 모든 내용을 통틀어 학습하실 수 있는 강의를 소개시켜 드리겠습니다.

총 42가지 실무 예제로 50시간 만에 👉 한 번에 끝내는 Kafka Ecosystem!
☑️ Kafka 필수 상황별 모든 활용법을 완벽 커버할 수 있는 42가지 실무 예제
☑️ Kafka와 함께 연계하여 사용하는 총 34가지 기술 스택과 활용 방법
☑️ Kafka를 활용한 이벤트 기반 대용량 처리 시스템 구축 프로젝트
☑️ 클라우드 환경 Kubernetes 위에서의 Kafka 구축 및 활용 방법
☑️ 빠르게 진화하는 KRaft mode에 대한 학습까지

Kafka의 모든 쓰임새를 다룬 것은 유일무이 이 강의 하나 뿐입니다.
Kafka Ecosystem 전체를 마스터하시고, 시스템 속에서 Kafka를 자유자재로 다뤄보세요!


📌 | 마치며

“다 경력직만 뽑으면 신입은 어디서 경력을 쌓나?”

Kafka와 굉장히 잘 어울리는 말입니다. Kafka는 대용량 데이터를 처리하는 기술 스택인 특성상, 이론 학습만으로는 커버되지 않는 영역이 많은데요. 하지만 모집 공고의 대부분이 ‘Kafka 실전 활용 경험’을 요구하고 있기 때문에 트래픽이 크지 않은 서비스를 다루는 환경에서 일하시거나, 혹은 취준생, 신입 개발자라면 Kafka 실전 경험의 기회조차 얻기 어려운 것이 현실입니다.

Kafka에 대한 이론 학습을 넘어 4가지 개별 어플리케이션 생성을 통한 대용량 처리 플랫폼 구축까지, 실전으로 체득시켜보는 과정을 거치게 된다면 시스템 자체를 보는 시야가 달라지게 됩니다. 실무에서 사용하는 여러 스택, 환경 설정, 이슈 대응 방법까지 실전에서 부딪히는 모든 상황을 이 강의를 통해 마주해 보시고, 시스템 전반을 설계할 수 있는 능력을 얻어가시길 바랍니다.

*일부 내용은 한현상 강사님과의 서면 인터뷰에서 발췌되었습니다.


💜 아래 링크를 클릭하여 더욱 자세한 내용을 확인해 보세요.

이 글과 연관된 주제의 추천 강의