Apache Kafka에서 정의하는 카프라란?
카프카는 고성능 TCP 네트워크 프로토콜을 통해 통신하는 서버 와 클라이언트 로 구성된 분산 시스템입니다 . 온프레미스와 클라우드 환경의 베어 메탈 하드웨어, 가상 머신 및 컨테이너에 배포할 수 있습니다.
서버 : Kafka는 여러 데이터 센터 또는 클라우드 지역에 걸쳐 있는 하나 이상의 서버 클러스터로 실행됩니다. 이러한 서버 중 일부는 브로커라고 하는 스토리지 계층을 형성합니다. 다른 서버는 Kafka Connect를 실행하여 데이터를 이벤트 스트림으로 지속적으로 가져오고 내보내 Kafka를 관계형 데이터베이스 및 다른 Kafka 클러스터와 같은 기존 시스템과 통합합니다. 미션 크리티컬 사용 사례를 구현할 수 있도록 Kafka 클러스터는 확장성이 뛰어나고 내결함성이 있습니다. 서버 중 하나가 실패하면 다른 서버가 작업을 인계하여 데이터 손실 없이 지속적인 운영을 보장합니다.
클라이언트 : 네트워크 문제나 머신 장애가 발생하더라도 병렬로, 대규모로, 내결함성 방식으로 이벤트 스트림을 읽고, 쓰고, 처리하는 분산 애플리케이션과 마이크로서비스를 작성할 수 있습니다. Kafka에는 이러한 클라이언트가 일부 포함되어 있으며, Kafka 커뮤니티에서 제공하는 수십 개의 클라이언트 로 보강됩니다 . 클라이언트는 Java 및 Scala, 상위 수준 Kafka Streams 라이브러리, Go, Python, C/C++ 및 기타 여러 프로그래밍 언어와 REST API를 위해 제공됩니다.
https://kafka.apache.org/documentation/#introduction
Apache Kafka
Apache Kafka: A Distributed Streaming Platform.
kafka.apache.org
즉, 카프카는 이벤트 스트리밍 플랫폼입니다.
그러면 이벤트 스트리밍은 무엇인가요?
이벤트 스트링밍은 중추 신경계의 디지털 버전이라고 볼 수 있습니다. 기업에서 사용하는 기술들이 소프트웨어로 정의되고, 자동화가 되고 이들이 항상 켜져있는 기술입니다.
기술적으로 보면 이벤트 스트리밍은 데이터베이스, 센서, 모바일 기기, 클라우드 서비스, 소프트 웨어 애플리케이션과 같은 이벤트 소스에서 이벤트 스트림 형태로 실시간으로 데이터를 캡쳐하는 관행입니다. 이러한 이벤트 스트림을 나중에도 검색이 가능해 내구성 있게 저장이 가능하고, 이벤트 스트림을 실시간으로 그리고 회고적으로 조작, 처리 및 반응합니다. 그리고 필요에 따라 이벤트 스트림을 다른 대상 기술로 라우팅합니다. 즉 이벤트 스트리밍은 적절한 정복 적절한 시간에 적절한 장소에 있도록 데이터의 지속적인 흐름과 해석을 보장합니다.
이벤트 스트리밍은 어디에서 활용하나요?
- 증권 거래소, 은행, 보험 등에서 결제 및 금융 거래를 실시간으로 처리합니다.
- 물류 및 자동차 산업 등에서 자동차, 트럭, 차량대, 배송물을 실시간으로 추적하고 모니터링합니다.
- 공장이나 풍력 발전소 등 IoT 장치나 기타 장비에서 센서 데이터를 지속적으로 수집하고 분석합니다.
- 소매, 호텔 및 여행 업계, 모바일 애플리케이션 등에서 고객 상호작용 및 주문을 수집하고 즉시 대응합니다.
- 병원 치료 중인 환자를 모니터링하고 상태 변화를 예측하여 응급 상황에서 적절한 치료를 보장합니다.
- 회사의 다양한 부서에서 생산되는 데이터를 연결, 저장하고, 이용 가능하게 만듭니다.
- 데이터 플랫폼, 이벤트 기반 아키텍처, 마이크로서비스의 기반 역할을 합니다.
Karka의 주요 구성 요소는?
- Producer: 데이터를 생성하고 Kafka에 전송하는 역할을 하는 클라이언트. -> ex) 애플리케이션이 생성하는 이벤트나 로그 데이터를 Kafka로 전송할 때 producer를 사용함.
- Consumer: Karka로부터 데이터를 가져와서 처리하는 클라이언트. -> Cousumer는 특정 토픽에 저장된 메세지를 지속적으로 읽어와, 필요한 처리를 수행함.
- Topic: 메세지가 저장되는 논리적인 카테고리 또는 채널. -> Kafka에서 데이터는 토픽 단위로 관리되며, 각각의 토픽은 파티션(parition)으로 나뉘어 데이터가 분산 저장됨.
- Broker: Kafka 서버 인스턴스이며, 토픽의 데이터를 저장하고 관리하는 역할. -> 여러 브로커가 클러스터를 이루어 분산 환경에서 동작.
- Zookeeper: Kafka 클러스터의 상태를 관리하고, 브로커 간의 조율을 담당하는 별도의 서비스. -> Zookeeper는 클러스터의 메타데이터, 브로커 추가/제거 등의 작업을 관리하는 데 필수적(최근에는 Zookeeper 없이도 Kafka를 운영할 수 있는 KRaft(Kafka Raft)모드가 등장함)
- Partition: 토픽 내 데이터를 분산하고 저장하는 논리적 단위. 파티션을 사용하면 Kafka는 대량의 데이터를 병렬로 처리 -> 높은 처리량을 유지
- Segment: 토픽의 파티션 내에서 저장되는 물리적 파일 단위를 의미. Kafka는 파티션을 여러 개의 세그먼트 파일로 나뉘어 저장 -> 데이터를 관리하고 유지보수하기 쉽게 만들기 위한 구조
Kafka 흐름
- Producer가 데이터 전송
- Broker에서 Producer가 보낸 데이터를 토픽의 파티션 단위로 저장
- Zookeeper에서 클러스터 내 Broker의 상태를 감시, 리더 프로커를 선출하여 장애 발생 시 자동으로 리더를 교체
- Consumer는 Kafka의 토픽에서 데이터를 읽어 애플리케이션에 전달
각각 구성요소에 대한 역할을 간단히 보면?
Producer
- 데이터 생성 및 전송: Producer는 애플리케이션에서 발생한 다양한 데이터를 수집하고 이를 Kafka로 전송.
Ex) 사용자의 활동 로그, 주문 정보, 센서 데이터 등이 Producer에 의해 Kafka로 전송될 수 있다. Producer는 데이터를 Kafka 클러스터의 특정 토픽과 파티션으로 보낸다.
- 데이터 분배:Producer는 Kafka에 데이터를 전송할 때 파티션 키(partition key)를 설정하여 특정 파티션으로 데이터를 분배할 수 있다.키가 지정된 경우, 해당 키를 기준으로 특정 파티션에 데이터를 저장하며, 키가 없는 경우에는 Kafka가 데이터를 자동으로 여러 파티션에 분배.
- 데이터 전송 방식:
- 동기 전송: Producer가 Kafka에 데이터를 전송하고 그 전송이 성공했는지 확인하는 방식. 안전성이 높지만 속도가 느릴 수 있다.
- 비동기 전송: Producer가 데이터를 빠르게 전송하고, 성공 여부를 바로 기다리지 않는 방식으로, 처리 속도가 빠르지만 실패 시 재시도와 같은 추가 설정이 필요할 수 있다.
- 전송 설정과 최적화:Producer는 데이터 전송 시 여러 설정을 통해 최적화할 수 있다.
Ex) 압축을 통해 전송 속도를 높이거나 배치(batch)로 데이터를 모아서 전송하여 네트워크 부하를 줄일 수 있다. Kafka는 at least once 또는 exactly once 전송 보장을 제공하여 데이터 유실 없이 안전하게 전달할 수 있도록 지원한다.
- 에러 처리 및 재시도: Producer는 데이터 전송 중 오류가 발생하면 재시도하도록 설정할 수 있다. 이때 네트워크 오류나 브로커 장애가 발생해도 설정된 횟수만큼 재시도를 수행한다.
Consumer
- 데이터 소비: Kafka의 특정 토픽에서 데이터를 읽어오며, 이 데이터를 애플리케이션으로 전달해 사용할 수 있도록 함.
- Consumer Group: Consumer Group 내의 각 Consumer는 토픽의 특정 파티션을 전담하여 처리하기 때문에, 동일한 Consumer Group에 속한 Consumer는 중복 없이 데이터를 처리합니다. -> 병렬 처리
- 파티션 할당:Consumer Group에 속한 Consumer는 Kafka의 파티션을 자동으로 할당받음. 예를 들어, 하나의 토픽에 4개의 파티션이 있고 2개의 Consumer가 있다면, 각각 2개의 파티션을 할당받아 데이터를 읽어옴.
- Offset 관리:Consumer는 오프셋(offset)을 통해 어느 위치까지 데이터를 읽었는지 기록합니다. 오프셋은 각 파티션 내의 데이터 위치를 가리키며, Consumer가 Kafka로부터 읽어온 가장 최신 메시지의 위치를 나타냅니다.
- 데이터 처리 방식:
- 실시간 처리: Consumer가 토픽의 데이터를 지속적으로 읽어와 실시간 분석이나 모니터링에 사용.
- 배치 처리: 특정 주기마다 데이터를 읽어와 한 번에 처리하는 방식으로, 대량의 데이터 분석이나 통계 생성에 유리함.
Broker
- 데이터 저장 및 관리: Broker는 Producer가 전송한 데이터를 토픽과 파티션 단위로 저장. 여러 Broker가 클러스터를 이루며 데이터를 분산 저장해 고가용성을 제공.
- 데이터 분배 및 복제: 각 Broker는 특정 토픽 파티션의 리더(Leader) 역할을 하거나 팔로워(Follower) 역할을 하여 데이터의 복제를 담당. -> 장애 발생 시 데이터 유실을 방지하고 신뢰성을 높임.
- Consumer 요청 처리: Broker는 Consumer가 요청할 때 데이터를 전달하여 실시간 데이터 처리가 가능하도록 지원함. Consumer는 각 Broker에 연결해 필요한 파티션에서 데이터를 읽어옴.
- 클러스터 조율 및 확장성 제공: 여러 Broker가 클러스터 형태로 동작하며, 새로운 Broker가 추가될 때 자동으로 데이터를 분산하여 확장성을 제공.
Zookeeper
- 브로커 상태 모니터링: ZooKeeper는 Kafka 브로커의 가동 여부를 모니터링하여, 장애 발생 시 클러스터가 적절하게 반응할 수 있도록 한다. 새로운 브로커가 추가되거나 브로커가 다운되면 이를 감지해 알림.
- 리더 선출: 파티션의 리더 브로커를 선출하고 관리함. 리더 브로커는 데이터를 읽고 쓰는 역할을 주도하며, 장애 발생 시 ZooKeeper가 새로운 리더를 선출해 클러스터의 안정성을 유지.
- 메타데이터 관리: ZooKeeper는 클러스터의 토픽, 파티션 정보 및 오프셋과 같은 메타데이터를 저장하고 관리. 이를 통해 브로커와 Consumer는 필요한 정보를 ZooKeeper에서 참조할 수 있다.
- 동기화 및 조율: 여러 브로커 간의 상태를 동기화하고 조율하여 데이터가 정확하게 처리되고 저장되도록 돕는다.
Partiton
- 데이터 분산 및 병렬 처리: Kafka의 각 토픽은 여러 파티션으로 나눌 수 있으며, 각 파티션은 클러스터의 서로 다른 브로커에 저장됩니다. ->데이터가 분산되어 저장되고 , 병렬로 처리할 수 있기 때문에 성능이 크게 향상됨.
Ex) “order-events”라는 토픽이 5개의 파티션으로 설정되어 있으면, 주문 이벤트는 5개의 파티션에 나눠서 기록된다.
- 파티션 내 메시지 순서:각 파티션 안에서는 데이터가 순서대로 저장. 즉, 파티션 내에서는 메시지의 순서를 보장하므로, 특정 파티션에서 데이터를 읽는 Consumer는 순서에 따라 메시지를 가져올 수 있다. 그러나, 토픽 전체에서는 순서를 보장하지 않으므로 특정 키나 조건을 기준으로 파티션을 나눌 때 순서가 중요하다면 같은 파티션으로 데이터가 저장되도록 해야 한다.
- 파티션 키와 데이터 분배:Kafka는 데이터를 파티션에 분배할 때 파티션 키를 사용. 동일한 키를 가진 데이터는 항상 같은 파티션에 저장됩니다.
Ex) user_id를 키로 설정하면 같은 user_id를 가진 데이터는 특정 파티션에만 저장됨. 이를 통해 같은 키의 데이터를 순서대로 저장하고 읽을 수 있습니다.키가 없는 경우에는 Kafka가 라운드 로빈 방식으로 데이터를 파티션에 분배한다.
- 파티션의 역할:파티션은 Kafka의 확장성과 장애 조치(fault tolerance)를 가능하게 하는 핵심 요소.새로운 파티션을 추가하면 Kafka 클러스터는 자동으로 데이터를 더 많은 브로커에 분산 저장하여, 더 많은 Consumer가 병렬로 데이터를 처리할 수 있도록 한다. 파티션 복제를 통해 특정 브로커가 다운되더라도 데이터를 안전하게 유지하고 복구할 수 있다.
- 리더와 팔로워: 각 파티션에는 리더와 팔로워라는 개념이 있다. 리더(Leader)는 데이터의 읽기와 쓰기 요청을 처리하며, 팔로워(Follower)는 리더의 데이터를 복제하여 장애가 발생했을 때 데이터 손실을 방지. 리더에 문제가 생기면 팔로워가 새로운 리더로 승격됨.