아파치 카프카(Apache Kafka)란? 구조와 특징
- 서론
- 아파치 카프카(Apache Kafka)란?
Apache Kafka is an open-source distributed event streaming platform used by thousands of companies for high-performance data pipelines, streaming analytics, data integration, and mission-critical applications.1
카프카는 공식 사이트에 따르면 카프카는 수천 개의 회사에서
고성능
데이터 파이프라인, 스트리밍 분석, 데이터 통합 및 미션 크리티컬 애플리케이션을 위해 사용하는오픈 소스
분산
이벤트스트리밍
플랫폼입니다. 카프카는 내고장성(Fault Tolerance), 확장성(Scalability), 유지 보수성(Durability), 그리고 순서 보장(Ordering Guarantee)과 같은 메시지 큐의 특징을 갖추고 있어 분산 메시지 큐(Distributed Message Queue)로 분류되며, 또한, 대용량의 데이터를 실시간으로 처리하는 스트리밍 플랫폼(Streaming Platform)으로도 분류됩니다. - 카프카의 역사 및 중요성 카프카는 LinkedIn에서 개발되었고, 2011년에 아파치 소프트웨어 재단에 기부되었습니다. 현재는 아파치 소프트웨어 재단의 하위 프로젝트로 오픈소스로 관리되고 있습니다. 카프카는 기존의 로그 수집 도구와는 다르게, 대용량의 실시간 스트리밍 데이터를 고가용성과 내구성을 가지면서도 원활하게 처리할 수 있는 능력으로 주목받았습니다. 또한, 확장성을 중시하는 아키텍처로 설계되어 빠르게 변화하는 기술 환경에 유연하게 대응할 수 있습니다. 카프카는 처음 개발된 이후, 빠르게 성장하여 글로벌 기업들의 데이터 파이프라인, 스트리밍 분석, 데이터 통합 등의 용도의 중요한 데이터 인프라스트럭처로 광범위하게 사용되고 있습니다. 또한, 카프카는 오픈소스로 관리되고 있어, 양한 커뮤니티의 기여를 받으며 빠르게 발전하고 있으며, 기업들은 카프카를 사용함으로써 비용을 절감할 수 있습니다.
- 아파치 카프카(Apache Kafka)란?
- 카프카의 기본 아키텍처 및 구성요소
- 카프카의 기본 아키텍처
- 카프카의 구성요소
- 프로듀서 (Producer)
- 기능: 메시지(stream data)를 카프카 시스템에 전달합니다.
- 작동 원리
- 프로듀서는 특정 카프카 토픽(topic)으로 메시지를 보내며, 브로커 리스트와 토픽에 대한 메타데이터를 유지합니다.
- 특징
- 프로듀서는 메시지를 토픽에 직접 쓰지 않고, 브로커에게 전달합니다.
- 프로듀서는 메시지를 보내기 전에 브로커 리스트와 토픽에 대한 메타데이터를 유지합니다.
- 프로듀서는 메시지를 보낼 때, 메시지 키를 지정할 수 있습니다. 이는 메시지를 특정 파티션에 저장하기 위해 사용됩니다.
- 프로듀서는 기본적으로 데이터를 비동기로 전송하며, 이는 높은 처리량을 가능하게 합니다.
- 필요한 경우 데이터 전송을 보장하기 위한 다양한 옵션(예: acks)을 설정할 수 있습니다. 이 경우, 데이터 전송은 동기적으로 처리됩니다.
- 브로커 (Broker)
- 기능: 브로커는 프로듀서로부터 데이터를 받아, 해당 토픽의 파티션에 저장하며, 컨슈머로부터의 데이터 요청을 처리하여 데이터를 전달합니다.
- 작동 원리
- 브로커는 메시지를 토픽 별로 구분하여 저장하며, 클러스터 내의 여러 브로커들은 함께 동작하여 메시지의 안정적인 저장 및 전달을 담당합니다.
- 특징
- 브로커는 데이터의 안정성을 위해 리더-팔로워(Leader-Follower) 구조를 갖습니다.
- 브로커는 데이터의 안정성을 위해 ISR(In-Sync Replicas)를 사용합니다.
- 브로커는 데이터의 안정성을 위해 오프셋(Offset)을 사용합니다.
- 브로커는 데이터의 안정성을 위해 메시지의 복제(replication) 를 사용합니다.
- 브로커는 카프카 클러스터를 구성하는 일부로, 여러 개의 브로커가 클러스터를 구성합니다.
- 시스템 처리량을 증가시키기 위해 브로커를 추가하는 것이 가능합니다.
- 컨슈머 (Consumer)
- 기능: 카프카 시스템에서 메시지를 추출하여 처리 또는 다른 시스템으로 전달합니다.
- 작동 원리
- 컨슈머는 하나 이상의 토픽에서 메시지를 읽으며, 하나의 컨슈머 그룹 내의 여러 컨슈머 인스턴스는 메시지를 병렬로 처리합니다.
- 특징
- 컨슈머는 토픽의 파티션에 저장된 메시지를 읽습니다.
- 컨슈머는 컨슈머 그룹을 구성할 수 있습니다.
- 컨슈머 그룹 내의 컨슈머 인스턴스는 메시지를 병렬로 처리합니다.
- 컨슈머는 메시지를 읽을 때, 오프셋(Offset)을 사용합니다.
- 컨슈머는 자신이 읽은 마지막 메시지의 오프셋을 추적하여, 다음 읽을 메시지를 알 고 있습니다.
- 컨슈머가 시작되면, 그룹의 이젠 오프셋 정보는 카프카의
__consumer_offsets
토픽에에서 읽어옵니다. - 만약, 이전에 저장된 오프셋이 없다면,
auto.offset.reset
설정에 따라서 가장 최근의 오프셋 또는 가장 오래된 오프셋을 사용합니다. - 컨슈머가 메시지를 성공적으로 처리한 후, 컨슈머는 오프셋 정보를
__consumer_offsets
토픽에 커밋(Commit)합니다.
- 컨슈머가 시작되면, 그룹의 이젠 오프셋 정보는 카프카의
- 컨슈머 그룹 내의 컨슈머 인스턴스가 증가하거나 감소하면 클러스터가 자동으로 리밸런싱을 수행합니다.
- 토픽 (Topic)
- 기능: 카프카에서 메시지를 분류하는 기본 단위입니다.
- 작동 원리
- 프로듀서는 토픽에 메시지를 발행(publish)하며, 컨슈머는 토픽을 구독(subscribe)하여 메시지를 소비합니다.
- 컨슈머는 특정 토픽의 파티션에서 메시지를 읽게 되며, 이 때 메시지는 파티션 내의 순서를 유지하면서 처리됩니다.
- 특징
- 각 토픽은 고유의 이름을 가지며, 데이터를 프로듀서(생산자)에서 컨슈머(소비자)로 전달하는 메시지의 카테고리 또는 피드로 생각할 수 있습니다.
- 메시지는 키/값 쌍으로 구성되고, 선택적으로 타임스탬프와 헤더를 포함할 수 있습니다.로, 해당 메시지가 속하는 카테고리입니다.
- 하나의 토픽은 하나 이상의 파티션으로 구성됩니다.
- 파티션 (Partition)
- 기능: 토픽을 하나 이상의 독립적인 단위로 분할한 세분화된 구조로, 메시지의 병렬 처리와 스케일링을 가능하게 합니다.
- 작동 원리
- 메시지가 파티션에 쓰이면, 파티션 내에서는 메시지가 순처적으로 오프셋을 얻어 순서가 유지됩니다.
- 컨슈머는 각 파티션에서 메시지를 순차적으로 읽습니다. 만약 컨슈머 그룹을 구선한다면, 각 컨슈머는 그룹 내에서 유일한 파티션을 할당받아 메시지를 병렬로 처리합니다.
- 특징
- 파티션은 토픽의 스케일링 단위로, 메시지를 병렬 처리하는 데 사용됩니다.
- 토픽의 각 메시지는 특정 파티션에 쓰여집니다.
- 파티션 내의 메시지는 순서를 가지며, 각 메시지는 고유한 오프셋을 갖습니다.
- 프로듀서가 메시지를 보낼 때, 어떤 파티션에 메시지를 저장할 것인지 결정합니다. 이는 라운드로빈 방식이거나, 메시지 키를 기반으로 한 방법 등 다양한 방식으로 설정할 수 있습니다.
- 파티션은 브로커에 저장되며, 브로커는 파티션의 리더(Leader)와 팔로워(Follower)로 구성됩니다.
- 리더는 해당 파티션의 모든 읽기와 쓰기를 담당합니다.
- 팔로워는 리더의 데이터를 복제하여 데이터의 안정성을 보장합니다.
- 만약 리더가 실패하면, 팔로워 중 하나가 리더로 승격되어 파티션의 읽기/쓰기를 담당하게 됩니다. 이를 통해 카프카는 고가용성을 제공합니다.
- 주키퍼 (Zookeeper)
- 기능: 카프카 브로커의 메타데이터를 관리하고, 브로커의 존재 및 상태를 모니터링하여 클러스터의 정상 동작을 지원합니다. 브로커의 등록 및 상태 변화 등의 이벤트를 감지하여 카프카 클러스터의 동기화와 조정을 담당합니다.
- 작동 원리
- 주키퍼는 분산 시스템에서의
코디네이션
을 위해 설계되었습니다. 카프카 클러스터의 브로커들은 주키퍼를 통해 노드 단의 동기화, 상태 관리, 그룹 관리 등의 작업을 수행합니다. - 주키퍼는 트리 형태의 데이터 구조(
znode
)를 가지며, 각 ‘znode`는 데이터를 저장하고, 자식 노드를 가집니다. 이 구조를 이용해 시스템의 메타데이터와 상태 정보를 저장합니다. - 클라이언트는 특정
znode
에 대한 변경을 주시(watch
)하며, 해당 znode의 데이터에 변화가 생기면 알림을 받으십니다. - 주키퍼는 분산 노드간의 동기화를 제공하여, 모든 노드가 일관된 데이터 뷰를 유지할 수 있도록 합니다.
- 주키퍼는 분산 환경에서 리더 선출을 돕습니다. 노드가 다운되면 새로운 리더를 자동으로 선출하여 시스템의 가용성을 유지합니다.
- 주키퍼는 분산 시스템에서의
- 특징
- 주키퍼는 리더 선출, 분산 락, 동기화 등의 기능을 게공하여, 분산 애플리케이션과 시스템을 코디네이션하는 데 사용됩니다.
- 주키퍼는 모든 업데이트를 순처적으로 처리하며, 각 업데이트는 전역에 순서를 가지는데, 이를 통해 여러 클라이언트 간에 순서가 유지되도록 합니다.
- 주키퍼는 복제를 통해 고가용성을 제공합니다. 모든 요청은 리더에서 처리되며, 팔로워는 리더의 데이터를 동기화하여 데이터의 일관성을 유지합니다.
- 업데이트가 완료되면 주키퍼는 그 결과를 디스트에 영구적으로 자장하여 내구성을 보장합니다. 따라서, 노드 장애가 발생하더라도 데이터의 보존됩니다.
- 모든 트랜젝션은 원자적으로 처리됩니다. 즉, 트랜젝션은 전체가 성공하거나 실패합니다.
- 주키퍼는 시스템의 상태를 실시간으로 반영하여, 클라이언트는 주키퍼의 데이터를 기반으로 현재의 시스템 상태를 파악할 수 있습니다.
- KRaft
- 기능: KRaft는 아파치 카프카의 메타데이터 관리를 직접 처리할 수 있도록 설계된 합의 프로토콜입니다.
- 작동 원리
- KRaft는 Raft 합의 알고리즘의 이벤트 기반 변형을 사용하며, 새로운 quorum controller를 도입하여 메타데이터가 정확하게 복제되도록 합니다.
- 특징
- KRaft는 Kafka Improvement Proposal (KIP) 500에서 처음 제안되었으며, 주키퍼를 대체하기 위해 개발되었습니다.
- KRaft 모드는 Kafka 2.8 버전에서 부터 early access로 도입이 되었으며, 3.0 버전에서는 preview로 제공이 되었습니다. 3.3.1에서는 production ready로 표시되었습니다. 3.4에서는 주키퍼를 더 이상 사용하지 않도록 할 예정이고, 4.0에서는 주키퍼를 완전히 제거할 예정입니다.2
- KRaft 모드는 Kafka의 브로커 중 몇 개를 컨트롤러로 선출하여 메타 데이터를 관리합니다. 컨트롤러 들은 Raft 합의 알고리즘을 사용하여 메타 데이터를 동기화하고, 클러스터의 상태를 일관되게 유지합니다.
- KRaft는 확장성과 내구성을 개선하며, 컨트롤러 노드의 장애나 네트워크 분할 상황에서 클러스터카 정상적으로 동작할 수 있도록 지원합니다.
- 클러스터를 설정하고 운영하는 과정이 단순화되며, 주키퍼를 사용하지 않아도 되므로, 관리 비용이 절감됩니다.
- 프로듀서 (Producer)
- 카프카의 핵심 특징
- 고성능(High Performance)
고성능(High Performance)은 컴퓨팅 시스템, 네트워크, 애플리케이션, 또는 서비스가 높은 수준의 작업 처리 능력과 효율성을 보여주는 것을 의미합니다. 고성능은 일반적으로 높은 처리 속도(High Processing Speed), 저지연(Low Latency), 높은 처리량(High Throughput) 등의 특징을 가집니다.
- 카프카는 분산 처리(Distributed Processing), 배치 처리(Batch Processing), 로그 기반 아키텍처(log-based architecture), 파티셔닝(Partitioning) 등을 통해 고성능을 제공합니다.
- 오픈소스(Open Source)
오픈소스(Open Source)는 소프트웨어의 소스 코드가 공개되어 있어 누구나 접근하고 수정하고 배포할 수 있는 모델을 의미합니다. 오픈소스 소프트웨어는 일반적으로 무료로 제공되며, 커뮤니티의 기여를 통해 지속적으로 개선되고 확장됩니다. 오픈소스는 접근성(Accessibility), 자유로운 수정 및 배포(Freedom to Modify and Distribute), 커뮤니티 기반 개발(Community-based Development), 비용 절감(Cost Savings), 투명성(Transparency), 학습 자원(Learning Resources) 등의 특징을 가집니다.
- 카프카는 오픈소스로 관리되고 있습니다. 이는 양한 커뮤니티의 기여를 받으며 빠르게 발전하고 있으며, 기업들은 카프카를 사용함으로써 비용을 절감할 수 있습니다.
- 분산 시스템(Distributed System)
분산 시스템(Distributed System)은 여러 독립적인 컴퓨터 시스템(혹은 노드)을 연결하여 하나의 시스템처럼 동작하게 하고, 데이터와 작업을 여러 노드에 분산시켜 동시에 처리하는 컴퓨팅 모델입니다. 분산 시스템은 확장성(Scalaibility)과 내고장성(Fault Tolerance), 성능(Performance) 등의 특징을 가집니다.
- 카프카는 분산 시스템으로 설계되어 있습니다. 여러 브로커들이 클러스터를 형성하며, 각 브로커는 독립적으로 동작합니다. 이러한 구조는 확장성을 향상 시키고, 높은 처리량(High Throughput)과 높은 신뢰성(High Reliability)을 제공합니다.
- 스트리밍(Streaming)
스트리밍(Streaming)은 데이터를 연속적으로 실시간으로 처리하고 전송하는 프로세스를 의미합니다. 스트리밍은 주로 오디오, 비디오, 또는 실시간 데이터 분석과 같은 응용 분야에서 사용됩니다. 스트리밍은 연속성(Continuity), 실시간 처리(Real-time Processing), 저지연(Low Latency), 효율성 (Efficiency), 확장성(Scaleability) 등의 특징을 가집니다.
- 카프카는 실시간 데이터 파이프라인 및 스트리밍 애플리케이션을 구축하기 위해 설계되었습니다. 카프카는 실시간 스트리밍 데이터를 고가용성과 내구성을 가지면서도 원활하게 처리할 수 있습니다.
- 카프카는 스트리밍 애플리케이션을 구축하기 위한 카프카 스트림즈(Kafka Streams) 라이브러리를 제공합니다.
- 고성능(High Performance)
- 참고 자료