
개요
도대체 카프카가 무엇이고 이걸 왜 쓰는걸까요..? 여기서도 카프카 저기서도 카프카.. 그래서 카프카카 뭔데??
대규모 실시간 데이터 스트리밍을 하기위한 분산 메시징 시스템 이라고 하는데..
오늘 같이 공부하며 카프카를 왜 사용해야 하는지에 대한 이해 및 간단하게 적용을 한번 해보고자 합니다...

1. 카프카의 탄생배경
카프카는 비즈니스 소셜 네트워크 서비스인 링크드인 (linked-in) 에서 개발했다고 합니다..
(그런의미에서 제 링크드인 http://www.linkedin.com/in/dongmin-cheon-9967352a2)
링크드인 초기에는 파편화 된 데이터 수집 및 분배를 처리하기 위해 데이터를 생성하는 source Application과
데이터가 최종 적재되는 target Application을 단방향으로 연결을 했었습니다.
근데 이게 시간이 지날수록 애플리케이션이 점점 뚱뚱해지고 데이터 전송 파이프라인이 우후죽순
늘어나기 시작하니깐 아키텍쳐가 많이 복잡해졌다고 합니다.

이는 서비스를 운영하는데 굉장히 치명적이기 때문에 링크드인 데이터팀에서 다양한 시도를 통해서
개선하기 시작했지만 데이터 파이프라인의 복잡성을 개선하기엔 역부족 이였던 것이죠...
이러한 문제점을 타파하기 위해 링크드인 개발자들은 아래와 같은 목표를 가지고 새로운 시스템을 직접 만들기 시작합니다.
- 프로듀서와 컨슈머의 분리
- 메시징 시스템과 같이 영구 메시지 데이터를 여러 컨슈머에게 허용
- 높은 처리량을 위한 메시지 최적화
- 데이터가 증가함에 따라 스케일아웃이 가능한 시스템
이러한 노력끝에 중앙집중화 시스템인 카프카 라는 신규 시스템을 만들어내고 이는 사내에서 발생하는
모든 이벤트/데이터의 흐름을 중앙에서 관리할 수 있게 되었습니다.

보시면 아시겠지만 서비스 아키텍처가 이전과는 비교도 할 수 없을 정도로 매우 깔끔해진것을 볼 수 있는데요
개발자 입장에서도 이제는 카프카에만 데이터를 전달하면 되니, 자신들 본연에 업무에만 집중할 수 있게 된 것이죠.
그렇게 2010년 카프카의 도입과 함께 링크드인은 놀랄만한 규모로 성장하였고, 오늘날 약 1조개 이상의 메시지를
하루에 처리하고 있다고 합니다.
카프카는 오픈소스로 세상에 공개되어 2012년 10월 23일 Apach 인큐베이터에서 나와 정식 Apach 오픈소스로
등록되었고, 2014년 11월에는 링크드인에서 개선 프로젝트를 진행한 몇몇 엔지니어들이 "컨플루언트" 라는 회사를
창립해 지금까지 계속 카프카를 발전 시키고 있다고 합니다....
2.카프카의 주요 구성 요소
카프카 아키텍처는 크게 세 가지 핵심 구성 요소로 이루어져 있습니다:
프로듀서(Producer), 컨슈머(Consumer), 그리고 브로커(Broker). 각 구성 요소가 어떤 역할을 하는지 자세히 알아보겠습니다.

- 프로듀서(Producer)
데이터를 생성하고 카프카에 전송하는 역할을 합니다. 각종 로그, 이벤트, 사용자 활동 데이터를 프로듀서가 카프카 토픽에 보냅니다. 이때 프로듀서는 데이터를 특정 토픽에 전송하며, 해당 토픽은 브로커에 의해 관리됩니다. - 컨슈머(Consumer)
프로듀서가 보낸 데이터를 소비하는 애플리케이션입니다. 데이터를 필요한 곳에서 사용하도록 처리하는 역할을 합니다. 예를 들어, 실시간 분석 시스템이나 데이터 저장소에 데이터를 적재하는 일이 있습니다. 카프카의 컨슈머는 데이터 손실 없이 여러 컨슈머 그룹이 같은 데이터를 동시에 소비할 수 있습니다. - 브로커(Broker)
데이터를 저장하고 관리하는 역할을 합니다. 카프카 클러스터 내에서 브로커는 데이터를 분산 저장하며, 컨슈머가 데이터를 가져갈 수 있도록 지원합니다. 브로커는 데이터를 파티션으로 나누어 저장하고, 파티션 단위로 분산하여 높은 가용성과 내결함성을 보장합니다. - 주키퍼(ZooKeeper)
초기에는 카프카가 주키퍼를 이용하여 브로커의 상태를 관리하고, 파티션 리더 선출 등의 메타데이터를 관리했습니다.
하지만 주키퍼의 복잡성과 운영상의 어려움 때문에 최근에는 주키퍼 의존성을 줄이기 위한 카프카 자체적인 메타데이터 관리
기능이 도입되었습니다.
3. 카프카의 내부 동작 방식
카프카는 분산 시스템으로, 여러 대의 브로커가 클러스터를 이루어 데이터를 저장하고 관리합니다. 카프카의 내부 동작 방식을 이해하기
위해 각 요소의 역할과 데이터 흐름을 조금 더 깊이 알아보겠습니다.

3-1. 데이터의 흐름: 프로듀서에서 컨슈머까지
- 프로듀서가 토픽에 데이터 전송
- 프로듀서는 데이터를 특정 토픽(topic)에 전송합니다. 이때 토픽은 여러 개의 파티션(partition)으로 나뉘어 있으며, 각 파티션은 데이터를 물리적으로 저장하는 단위입니다.
- 프로듀서는 라운드 로빈 방식 또는 특정 키를 기반으로 데이터를 파티션에 전송합니다. 이를 통해 데이터는 여러 파티션에 분산 저장되어 병렬 처리가 가능합니다.
- 브로커에서 데이터 저장
- 브로커는 데이터를 파티션 단위로 저장하고, 각 파티션은 여러 개의 복제본(replica)을 가집니다. 하나의 파티션에는 리더(leader)와 팔로워(follower)가 존재하며, 리더가 데이터를 처리하고 팔로워가 이를 복제합니다.
- 브로커는 데이터를 로그 세그먼트(log segment) 파일에 저장하며, 각 파일은 특정 크기에 도달하면 새로운 파일로 분할됩니다. 이러한 구조는 데이터를 빠르게 쓰고 읽을 수 있도록 최적화되어 있습니다.
- 컨슈머가 데이터 소비
- 컨슈머는 브로커에 있는 데이터를 읽어들입니다. 컨슈머는 오프셋(offset)을 사용하여 자신이 어느 위치까지 데이터를 읽었는지 기억합니다. 이 오프셋은 주키퍼 또는 카프카 내부에 저장되어 컨슈머가 중단되었다가 다시 시작해도 이어서 데이터를 처리할 수 있도록 합니다.
- 데이터 복제와 장애 대응
- 각 파티션의 리더가 장애가 발생하면, 팔로워 중 하나가 새로운 리더로 선출됩니다. 이를 통해 카프카는 높은 가용성과 내결함성을 보장합니다.
- 각 파티션의 리더가 장애가 발생하면, 팔로워 중 하나가 새로운 리더로 선출됩니다. 이를 통해 카프카는 높은 가용성과 내결함성을 보장합니다.
3-2. 카프카의 로그 구조와 데이터 저장
카프카는 데이터를 로그(log) 구조로 저장합니다. 각 파티션은 append-only 로그로, 프로듀서가 전송하는 메시지를 순차적으로
저장합니다. 이러한 로그 구조는 다음과 같은 장점을 제공합니다:
- 빠른 쓰기 성능: 데이터를 순차적으로 기록하므로 디스크 쓰기 성능이 매우 우수합니다.
- 데이터 보존 정책: 로그는 설정된 보존 기간 동안 유지되며, 보존 기간이 지난 데이터는 삭제됩니다.
이를 통해 오래된 데이터를 자동으로 관리할 수 있습니다. - 오프셋을 통한 데이터 접근: 컨슈머는 파티션의 오프셋을 통해 원하는 위치의 데이터를 빠르게 접근할 수 있습니다.
카프카는 또한 데이터의 내구성을 보장하기 위해 데이터를 디스크에 저장하기 전에 여러 브로커에 복제합니다. 이 복제본은 브로커 장애 시 데이터 유실을 방지합니다.
3-3. 파티션과 병렬 처리
카프카의 파티션 구조는 병렬 처리를 가능하게 합니다. 하나의 토픽이 여러 파티션으로 나뉘어 저장되므로, 각 파티션은 서로 다른 브로커에 분산될 수 있습니다. 이를 통해 여러 컨슈머가 병렬로 데이터를 처리할 수 있어 처리량이 크게 증가합니다.
- 파티션 리밸런싱(Rebalancing): 컨슈머 그룹 내의 컨슈머 수나 파티션 수가 변경되면, 카프카는 자동으로 파티션을 재분배하여 컨슈머 간의 부하를 균등하게 맞춥니다.
- 컨슈머 그룹(Consumer Group): 하나의 컨슈머 그룹 내에서 각 컨슈머는 서로 다른 파티션을 소비합니다. 이를 통해 동일한 데이터를 여러 컨슈머가 중복 처리하지 않도록 보장합니다.
4. 카프카의 장점
카프카는 다음과 같은 장점 덕분에 많은 기업에서 선택하는 데이터 스트리밍 솔루션입니다:
- 고성능 처리: 수백만 개의 메시지를 매우 빠르게 처리할 수 있습니다. 카프카는 분산형 구조와 로그 기반의 저장 방식을 사용하여 높은 처리량을 자랑합니다.
- 확장성: 노드를 추가하여 손쉽게 시스템을 확장할 수 있습니다. 데이터의 증가나 트래픽의 증가에 대응하기 위해 브로커 노드를 쉽게 추가하고, 파티션을 나누어 저장할 수 있어 수평 확장이 용이합니다.
- 내결함성: 데이터를 복제하여 브로커 장애에도 안전하게 데이터를 보존합니다. 각 파티션은 복제본을 유지하므로 하나의 브로커에 장애가 발생하더라도 다른 브로커에서 데이터를 안전하게 가져올 수 있습니다.
- 실시간 데이터 처리: 카프카는 실시간 데이터 스트리밍 처리를 위한 강력한 도구로, 로그 수집, 트랜잭션 로그 분석, 실시간 이벤트 처리 등에 널리 사용됩니다.
5. 카프카 간단 예제 적용해보기
카프카를 직접 경험해보고 싶다면, 로컬에서 간단하게 카프카를 설치하고 실행해 볼 수 있습니다.
다음은 카프카 설치 및 간단한 사용 방법입니다.
1. 카프카 설치: Apache Kafka 공식 홈페이지에서 카프카를 다운로드합니다. 카프카는 자바 기반 애플리케이션이므로 자바 런타임 환경(JRE)이 필요합니다.
2. 카프카 실행: 카프카는 주키퍼(ZooKeeper)를 필요로 하므로, 주키퍼와 브로커를 각각 실행해야 합니다.
먼저 주키퍼를 실행한 뒤, 카프카 브로커를 실행합니다.
# 주키퍼 실행
bin/zookeeper-server-start.sh config/zookeeper.properties
# 카프카 브로커 실행
bin/kafka-server-start.sh config/server.properties
3. 프로듀서와 컨슈머 테스트: 카프카의 기본 동작을 확인하기 위해 간단한 토픽을 생성하고, 프로듀서와 컨슈머를 실행해 봅니다.
# 토픽 생성
bin/kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
# 프로듀서 실행 (메시지 전송)
bin/kafka-console-producer.sh --topic test-topic --bootstrap-server localhost:9092
# 컨슈머 실행 (메시지 수신)
bin/kafka-console-consumer.sh --topic test-topic --from-beginning --bootstrap-server localhost:9092
4. 데이터 전송 및 수신: 프로듀서 콘솔에서 메시지를 입력하면, 컨슈머 콘솔에서 해당 메시지를 실시간으로 확인할 수 있습니다. 이를 통해 카프카의 데이터 스트리밍 개념을 쉽게 체험할 수 있습니다.
6. 카프카의 활용 사례
카프카는 현재 많은 기업에서 데이터 스트리밍과 실시간 처리를 위해 사용되고 있습니다. 그 중 일부 사례를 살펴보겠습니다:
- 링크드인: 카프카의 원조인 링크드인은 사용자 활동 로그 수집, 실시간 이벤트 스트리밍, 맞춤형 추천 시스템 구축에
카프카를 사용합니다. - 넷플릭스: 넷플릭스는 사용자 시청 활동 데이터를 실시간으로 수집하여 개인화된 콘텐츠 추천을 제공하기 위해 카프카를 사용합니다.
- 우버: 우버는 차량 위치 데이터와 사용자 요청을 실시간으로 수집하고 처리하여 효율적인 매칭 시스템을 운영합니다.
- 페이팔: 페이팔은 결제 트랜잭션 데이터를 실시간으로 처리하여 사기 탐지 및 모니터링 시스템을 구축합니다.
7. 결론
카프카는 대규모 데이터를 실시간으로 안정적이고 빠르게 처리하기 위한 솔루션입니다. 링크드인의 복잡한 데이터 파이프라인 문제를 해결하기 위해 탄생한 카프카는 오늘날 수많은 기업들이 사용하는 핵심 기술로 자리 잡았습니다.
그렇다면 왜 카프카를 사용해야 할까요? 카프카는 대규모 데이터를 효율적으로 처리하고 실시간으로 분석해야 하는 현대 기업의 요구를
충족시키는 최적의 도구입니다. 카프카의 확장성 덕분에 서비스가 성장함에 따라 시스템을 유연하게 확장할 수 있고, 내결함성과 높은
처리량 덕분에 안정적이고 신뢰할 수 있는 데이터 처리가 가능합니다. 특히, 복잡한 데이터 파이프라인을 중앙에서 관리하여 아키텍처를
단순화하고, 다양한 시스템 간의 데이터 흐름을 통합적으로 관리할 수 있습니다.
앞으로 카프카를 사용하여 대규모 실시간 데이터 파이프라인을 설계하고 관리하는 능력을 키우는 것은, 데이터 중심의 비즈니스를
운영하는 데 중요한 경쟁력이 될 것입니다....
깨굴딱지의 코드연못입니다
올챙이가 개구리로 거듭나듯, 끊임없는 노력으로 진화하는 개발자의 길을 걷습니다. 🐸