Apache Kafka에 대해 정리 글을 써보려 합니다.
Kafka 란?
카프카란 분산형 이벤트 스트리밍 플랫폼 입니다.
카프카는 여러 서버나 노드에 데이터와 처리를 분산시켜 가용성과 확장성이 높은 특징이 있습니다. 이러한 특성으로 카프카는 서버 간의 비동기 데이터 교환을 용이하게 해주는 메시징 시스템으로 활용될 수 있으며 하루에 수 조개의 이벤트 처리를 가능하게 합니다.
즉, 카프카는 플랫폼 내에 다양한 서비스 간의 데이터 흐름을 실시간으로 제어해 서비스들을 연계하는 중추 역할을 수행합니다.
이러한 카프카는 초기에는 대용량 로그 데이터 처리를 위해 개발되었으며 현재는 다양한 분야에서 실시간 데이터 파이프라인 구축에 널리 사용되고 있습니다.
분산형 이벤트 스트리밍 플랫폼
분산형 : 여러 서버나 노드에 데이터와 처리를 분산시켜 가용성과 확장성을 제공
이벤트 스트리밍 플랫폼 : 이벤트가 발생할 때 마다, 그 정보를 지속적으로 수집하고 전송하여 처리하는 시스템을 뜻 합니다. (다양한 연산 진행 : 집계 변환 등)
간단한 예시로 온라인 쇼핑몰에서 물건을 구매하는 이벤트가 발생하면 이 정보를 실시간으로 다른 시스템에 전송하거나 분석해야 하는 상황에서 이벤트 스트리밍 플랫폼을 사용하여 구현할 수 있습니다.
Kafka 배경
세계 최대 비즈니스 네트워크 사이트인 LinkedIn은 하나의 서비스에 과도하게 많은 시스템이 연결되어 있어 서비스를 유지하고 관리하는데 어려움을 겪었습니다. 또한 시스템 유지 보수 및 서비스 관리에도 많은 부담이 있었습니다.
이를 극복하기 위해 컨플루언트 공동 창업자인 ‘제이 크랩스(Jay Kreps)’는 Kafka 라는 메시징 분산 스트리밍 플랫폼을 만들었습니다.
Kafka 구성 요소
카프카는 다음과 같은 구성 요소들이 있습니다. 하나씩 알아보도록 하겠습니다.
- Topic, Partition, Offset
- Producer, Consumer, Consumer Group
- Broker, Zookeeper
- Replication
- KafkaCluster
Topic, Partition, Offset
카프카에 저장되는 메시지는 topic으로 분류되고 topic은 여러 개의 partition으로 나눠질 수 있습니다. partition 안에는 message의 상대적 위치를 나타내는 offset이 있습니다. 이 offset 정보를 이용해 이전에 가져간 메시지의 위치 정보를 알 수 있고 동시에 들어오는 많은 데이터를 여러 개의 파티션에 나누어 저장하기 때문에 병렬로 빠르게 처리할 수 있습니다.
topic : 메시지를 구분하는 단위
- 파일 시스템의 폴더, 메일함과 유사합니다. 예시) 주문용 토픽, 결재용 토픽 등
partition : 메시지를 저장하는 물리적인 파일
- 한 개의 토픽은 한 개 이상의 파티션으로 구성됩니다.
- 파티션은 메시지 추가만 가능한 파일입니다.(append-only)
offset : 파티션 내에 각 메시지가 저장된 상대적 위치
- 프로듀서가 넣은 메시지는 파티션의 맨 뒤에 추가
- 컨슈머는 오프셋을 기준으로 마지막 커밋 시점부터 메시지를 순서대로 읽어서 처리
- 파티션의 메시지는 처리 후에도 계속 저장되어 있어 설정에 따라 일정시간 뒤에 삭제됨
Producer, Consumer, Consumer Group
producer는 메시지를 발행하여 메시지를 생산하는 주체 입니다.producer는 메시지를 전송할 때 topic을 지정합니다.
consumer는 발행된 메시지를 받는 추체입니다. consumer는 토픽을 구독해 받을 메시지를 정합니다.
producer와 consumer는 카프카의 토픽을 통해 메시지를 주고 받습니다. 즉, producer와 consumer가 상호 존재 여부를 알치 못한 채 자신에게 주어진 역할만을 처리합니다. 이는 서비스 간 결합이 느슨해지게 합니다.
producer에서 생산한 메시지는 여러 개의 파티션에 저장하게 됩니다. consumer도 이에 맞게 메시지를 읽는 것이 효율적입니다. 하나의 topic을 읽기 위한 consumer들의 모임을 consumer group이라고 합니다.
이 consumer group 에는 한 가지 규칙이 있습니다. topic의 파티션은 consumer group과 1:n 매칭이 되어야 합니다. 즉 자신이 읽고 있는 파티션에는 같은 그룹 내에 다른 consumer가 읽을 수 없습니다. 일반적으로 파티션 갯수와 컨슈머 갯수가 동일한 것을 이상적 입니다.
consumer가 그룹으로 존재함으로 여러 개의 파티션을 병렬로 읽게 되어 빠른 처리가 가능해 집니다. 또한 특정 컨슈머에 문제가 생겼을 경우 다른 그룹 내 컨슈머가 대신 읽을 수 있게 리밸런싱되어 장애 상황에 대처할 수 있습니다.
producer : 메시지를 발행하여 생산하는 주체 (writer)
- 프로듀서는 메시지 전송시 토픽을 지정합니다.
- 파티션은 라운드 로빈 방식 혹은 파티션 번호를 지정하여 메시지를 넣습니다.
- 같은 키를 갖는 메시지는 같은 파티션에 저장되며 순서가 유지됩니다.
consumer : 메시지를 구독하여 소비하는 주체 (reader)
consumer Group : 메시지를 소비하는 consumer 들의 모임
- topic의 파티션은 컨슈머 그룹과 1:N 매칭 관계로 동일 그룹내에 한 개의 컨슈머만 연결 가능합니다.
- 파티션 메시지는 순서대로 처라하도록 보장받습니다.
- 특정 컨슈머에 문제가 생겼을 때 Fail over를 통해 리밸런싱이 가능합니다.
- 보통 파티션과 컨슈머는 1:1로 두는게 이상적 입니다.
Broker, Zookeeper
broker는 kafka 시스템 내의 개별 서버 혹은 노드를 뜻하며 프로듀서와 컨슈머를 연결하는 중재자 역할을 합니다.
파티션들은 브로커에 저장이 됩니다. 프로듀서가 데이터(메시지)를 생성하여 Kafka의 특정 토픽에 전송하며 브로커는 메시지를 받아 해당 토픽의 적절한 파티션에 저장합니다.
컨슈머는 Kafka 토픽의 데이터를 읽기 위해 브로커에 접속합니다. 브로커는 컨슈머의 요청에 따라 메시지를 전송하며 컨슈머가 어디까지 데이터를 읽었는지 위치(offset)를 관리합니다.
Kafka의 broker는 다른 메시지큐(RabbitMQ, ActiveMQ)와는 다른 차이점이 있습니다.
일반적인 메시지큐들은 메시지를 메모리에 저장하는데 비해 broker는 메시지(데이터)를 로컬 스토리지에 파일로 저장합니다. 이로 인해 카프카를 재시작해도 메시지 유실 우려가 적습니다.
또한 일반적인 메시지큐들은 중재자가 소비자에게 메시지를 직접 Push 하는데 카프카의 Broker는 컨슈머가 컨슈머가 처리할 수 있는 만큼 Pull 하는 구조입니다. 컨슈머가 자신의 능력만큼 데이터를 가져오므로 최적의 성능을 낼 수 있습니다.
즉, broker는 데이터를 저장하고 클라이언트의 요청을 처리하는 역할을 수행합니다.
파일보다 메모리가 성능이 우수한데 카프카가 성능이 좋은 이유
일반적으로 하드디스크가 메모리보다 느리지만 하드디스크의 순차적 읽기에 대한 성능은 크게 떨어지지 않습니다.
또한 카프카는 파일 시스템을 활용한 고성능 디자인을 구현했습니다.
Zookeper는 이러한 분산 메시지큐의 정보를 관리하는 역할을 합니다.
카프카를 실행시키기 위해 반드시 주키퍼를 먼저 실행시켜주어야 합니다.
Broker : 프로듀서와 컨슈머를 연결하는 중재자
- 프로듀서는 데이터를 브로커에 기록하며 컨슈머는 브로커를 통해 데이터를 읽습니다. 이 때 컨슈머는 pull 방식으로 컨슈머가 처리할 양만큼 데이터를 가져옵니다.
- 브로커는 토픽의 파티션 데이터를 디스크에 저장합니다. 카프카가 재시작해도 데이터의 손실을 줄일 수 있습니다.
Zookeeper : 분산 코디네이션 서비스
- Kafka의 브로커 정보, 토픽 및 파티션 정보 등의 메타데이터를 저장하고 브로커들을 관리합니다.
- Kafka가 실행하기 위해 선행 실행되어야 합니다.
- 최근 버전 Kafka는 Zookeeper의 의존성을 줄이는 방향으로 발전하고 있습니다.
Replication
replication은 토픽의 복제를 의미합니다.
토픽을 복제해 브로커들에게 배치함으로써 특정 브로커에 문제가 생겼을 경우 다른 브로커에서 이어서 수행해 안정성이 올라갑니다. 카프카에서는 replication 수를 임의로 지정하여 토픽을 복제할 수 있습니다.
replication을 통해 복제된 토픽은 leader와 follower로 나누어 집니다. 토픽으로 통하는 모든 데이터의 read/write는 오직 leader에서만 이루어 집니다. follower는 leader와 sync를 유지해 leader에 문제가 생겼을 경우 follower들 중 하나가 leader역할을 수행합니다.
follower들도 데이터들을 복제해서 가지고 있어서 메시지의 유실이 없다는 장점이 있습니다. 하지만 복제를 위해 시간과 네티워크 등 각종 비용이 든다는 단점이 있습니다.
Kafka Cluster
kafka cluster란 모든 요소들을 포함하는 전체 시스템을 의미합니다.
kafka의 전체 구성도는 아래 그림과 같습니다.
Kafka 장점
고성능
- 다중 프로듀서, 다중 컨슈머가 상호 간섭없이 메시지 쓰기, 읽기를 처리합니다.
- 디스크 기반으로 이벤트(메시지, 데이터)를 보존합니다.
- 지속해서 보존이 가능하고 데이터 유실이 적습니다.
- 장애 발생 시 유실 복구가 가능합니다.
- 브로커가 하는 일이 비교적 단순합니다.
- 브로커는 컨슈머와 파티션 간 매핑 관리만 하여 성능에 집중합니다.
- 메시지 필터, 메시지 재전송과 같은 일은 프로듀서 컨슈머에 위임합니다.
- Batch 기능을 제공하여 동시 처리량이 높습니다.
- 프로듀서 : 일정 크기만큼 메시지를 모아서 전송
- 컨슈머 : 최소 크기만큼 메시지를 모아서 읽음
- 확장성
- 브로커, 파티션, 컨슈머 추가가 쉬워 수평 확장이 쉽게 가능합니다.
고가용성
Kafka의 topic은 partition이라는 단위로 쪼개어져 클러스터의 각 서버들에 분산되어 저장되고, 고가용성을 위하여 복제(replication) 설정을 할 경우 이 또한 partition 단위로 각 서버들에 분산되어 복제되고 장애가 발생하면 partition 단위로 fail over가 수행됩니다.