[Kafka] 대용량, 실시간 데이터 처리에 적합한 카프카

solved_err.log·2022년 12월 4일
0
post-thumbnail

배경

이번에 대용량 데이터를 실시간으로 처리하는 업무를 맡았다.
개발 과정에서는 특별한 무리는 없었지만, 실제 서비스가 될 경우 유저가 많아질수록 트래픽이 많이 발생하는 현상이 우려되었다.
이를 효과적으로 처리하기 위해 도입한 것이 바로 카프카(Kafka)이다.

"Kafka"란 무엇일까?

2011년 미국 링크드인(Linkedin)에서 개발한 것이다.
데이터 파이프라인, 분산 스트리밍, 실시간 스트리밍 데이터를 효과적으로 처리하기 위한 고성능 분산형 게시-구독 메시지 플랫폼이다.

카프카(Kafka)는 Pub-Sub 모델의 메시지 큐 형태로 동작하며 분산 환경에 특화되어 있다.

Pub-Sub 모델이란?
일반적으로 메시징 서비스 모델은 Queue 방식과 Pub-Sub 구조로 구분되는데, 카프카는 후자에 해당한다.
Queue는 송신자와 수신자가 1:1 관계이다. 단일 송신자가 단일 수신자에게 데이터를 전송한다.
Pub-Sub 구조는 송신자와 수신자가 m:n 관계이다. 즉, 여러 송신자가 메시지를 발행하고, 여러 수신자가 메시지를 구독한다.

한 마디로, 실시간으로 많은 데이터를 처리해야 할 때 빠르고 효과적인 분산 시스템이라고 할 수 있다.

현재 LINE, 링크드인에서 카프카를 도입해 사용하고 있으며, 국내에서도 사용량이 증가하는 추세이다.

kafka의 구성 요소

대략 어떤 시스템인지는 이해가 되었으니, 구성 요소를 먼저 알아보자.
이미지 출처: 원본 링크
이해하기 쉽게 표현된 이미지가 있어 해당 링크에서 가져왔다.

  • Producer (프로듀서)

    • 메시지(이벤트)를 생성해 카프카 클러스터에 전송한다.
  • Topic (토픽)

    • 메시지를 논리적으로 묶은 단위이다. (예를 들어 데이터베이스의 테이블, 파일에서 폴더에 해당)
    • 프로듀서가 메시지를 보낼 경우 저장되는 장소이다.
    • 하나의 토픽은 여러 개의 파티션으로 이루어져 있다.
  • Partition (파티션)

    • 토픽 내에 분리된 공간이며, 각 토픽 당 데이터를 분산 처리하는 가장 작은 단위이다.
    • 조금 더 쉬운 이해를 위해 예를 들자면 토픽을 톨게이트, 파티션을 n차선이라고 비유한다.
  • Broker (브로커)

    • 각각의 카프카 서버, 여러 개의 브로커 생성이 가능하다.
    • 메시지를 저장하고 관리한다.
  • Consumer (컨슈머)

    • 메시지를 구독해 데이터를 받아온다.
    • 하나의 컨슈머에서 여러 개의 토픽 데이터를 받아올 경우, 처리하는 데 버거울 수 있다. 이럴 경우 같은 컨슈머 그룹 내에 또 다른 컨슈머를 추가해 작업을 각각 수행하면 더욱 효율적인 결과를 낼 수 있다.
  • Zookeeper (주키퍼)

    • 분산 메세지 큐의 메타 데이터 정보를 관리한다. (브로커id, 컨트롤러id 등)
    • kafka를 띄우기 위해서는 반드시 실행되어야 한다.
    • Zookeeper는 홀수의 서버로 작동하도록 설계되어 있다. (최소 3, 권장 5)

kafka의 특징

  • 고성능 : 프로듀서와 컨슈머가 브로커를 통해 데이터를 주고 받을 때, 한 번에 대용량의 데이터를 전송 가능하다. 또한, 컨슈머의 개수를 늘리면서 병렬 처리까지 가능하니 효율성이 높아진다고 볼 수 있다.

  • 고가용성 및 확장성 : 카프카는 클러스터(*각기 다른 서버들을 하나로 묶어서 하나의 시스템같이 동작하게 함)로 동작 함으로로써 클라이언트들에게 고가용성의 서비스를 제공한다. 또한, 서버를 수평적으로 늘려 안정성과 성능을 향상시키는 스케일 아웃(Scale-out)이 가능하다.
    브로커 서버를 여러 개로 운영하기 때문에, 일부 서버에 문제가 발생해도 나머지 서버에 영향 없어 중단되지 않고 동작 가능하다.

  • 디스크에 저장 : 카프카는 메시지를 순차적으로 디스크에 저장한다. 그렇기 때문에, 서버에서 장애가 나더라도 실제 메시지는 디스크에 존재하기 때문에 데이터 유실 걱정이 없다.

  • 분산 처리에 특화 : 여러 개의 파티션을 서버에 분산시켜 나누어 처리하기 때문에 속도가 향상된다.


📌 알아 둘 사항

  • 한 토픽의 파티션 개수보다 더 많은 수의 컨슈머를 추가하는 건 의미가 없다.
  • 파티션이 많다고 무조건 좋은 것은 아니다.
  • 하나의 파티션을 두개 이상의 컨슈머가 소비할 수 없다.

이렇게 정리하고 보니, 대용량 및 실시간 처리에 적합한 카프카가 사용될 수 있는 곳이 많을 것 같다. 이런 훌륭한 기능을 가진 시스템을 사용하지 않을 이유가 없다.
실시간으로 전송되는 알림, 접속 로그, 실시간 집계 등의 처리에서 아주 빠르고 효과적으로 개선될 수 있을 것 같다.
카프카의 오프셋, 리밸런싱, 다중 컨슈머 그룹 등에 대한 내용은 추가적으로 다루도록 한다.😄


추가적으로...

카프카의 메타데이터 관리 도구인 주키퍼(Zookeeper)가 점차 제거된다고 한다.
관련 링크

profile
배우고 기록하는 개발 일기장✍

0개의 댓글