개념
- Data Streaming Platform. 분산형 데이터 스트리밍 플랫폼
- 실시간 데이터 피드를 관리하기 위한 통일되고 높은 처리량, 낮은 latency를 제공하는 것이 목표
- Linkedin에서 개발하여 오픈 소스화되었다.
- 데이터를 생성하는 생성자(Publisher)와 데이터를 소비하는 소비자(Subscriber) 중재자 역할을 하며 데이터의 전송 제어, 관리, 처리 등을 한다.
주요 용어
Broker
- 가장 중요하게 여겨지는 개념
- 카프카 애플리케이션이 설치된 서버 혹은 노드
- 여기서 중재자 역할을 하여 데이터의 전송 제어, 처리 등을 한다.
- 각각의 broker는 ID로 식별한다.
- 각 브로커는 특정한 토픽 파티션을 가지고 있다. 이 말은 데이터가 분산될 수 있다는 것이다.
Producer
- 카프카로 메시지를 보내는 클라이언트
- 어떤 파티션에 어느 정보를 적고 있는지 알고 있다.
- 또한 어떤 브로커가 가지고 있는지 알고 있다. 이것은 미리 정하기 때문이다.
- 브로커가 고장난 경우, 프로듀서는 자동적으로 회복된다.
Consumer
- 메시지를 꺼내가는 역할을 클라이언트
- 토픽으로부터 데이터를 읽는다.
- 브로커에게 데이터를 요청하고 응답을 하는 형태로 pull model이다.
- 자동적으로 어떤 브로커에서 데이터를 읽어들여야 하는지를 판단한다.
- 브로커 고장 시 복구 방법을 알고 있다.
- 각각의 파티션에서 offset 순서대로 오름차순으로 데이터를 읽어들인다.
Topic
- 메시지 피드. 즉, 데이터 스트림이다.
- DB의 Table 같은 개념이다.
- 각 토픽의 고유한 이름이 존재한다.
- 어떠한 형태의 메시지 포맷이든 상관이 없다.
- 쿼리는 할 수 없다.
- 프로듀서가 전송하여 컨슈머가 읽게 한다.
Partition
- Topic을 여러 개 나눈 것.
- 병렬 처리 및 고성능을 얻기 위해 Partition으로 나눈다.
- 분산 처리가 가능하다.
- 데이터는 랜덤한 Partition에 쓰여진다.
- 각 Partition에 메시지들은 정렬되어 있다.
- Partition 안에 각 메시지는 증가하는 ID를 가지고 있다. (Offset)
- 파티션에 한 번 쓰여진 데이터는 수정 및 삭제가 불가능하다.
- 파티션의 숫자는 0부터 시작된다.
- 파티션은 생성 후 언제든지 늘릴 수 있다. 반대로 줄일 수는 없다.
Offset
- 파티션의 각 메시지에 부여하는 ID
- 증가하는 특성을 가지고 있다.
- 해당 파티션에서만 의미를 가진다. 즉, 다른 파티션에서의 같은 오프셋이더라 하더라도 데이터는 다르다.
- 이전에 삭제된 메시지여도 오프셋은 재사용을 하지 않는다.
Message
- 프로듀서가 브로커로 전송하거나 컨슈머가 읽어가는 데이터 조각
- 연속된 메시지를 data stream이라고 한다.
Segment
- 브로커로 전송된 메시지는 토픽의 파티션에 저장되며 해당 메시지는 브로커의 로컬 디스크에 로그 파일로 저장된다. 이 로그 파일을 세그먼트라 한다.
- kafka 폴더 중 server.properties 의 logs.dir 항목에서 확인이 가능하다.
Replication
- 각 메시지들을 여러 개로 복제해서 카프카 클러스터 내 브로커들에 분산시키는 동작을 의미
- 토픽 자체를 복제하는 것이 아닌 토픽의 파티션을 복제
- HA를 보장
Zookeeper
- 사실 적을까 말까 하다가 그래도 중요했던 녀석이기에 적는다.
- 카프카의 메타데이터 관리 및 브로커의 정상상태 점검을 담당.
- 카프카 2.8 버전부터 도입된 Kraft로 인해 더 이상 필수요소가 아니게 되었다.
- 4.0 버전부터는 Kraft모드로만 메타데이터를 관리하게 되고 Zookeeper는 삭제과 된다.