Basic
1. Topic, Partition, Offset
1-1. Topic
- 특정한 데이터 스트림을 의미
- 기존 데이터베이스의 테이블과 유사
- 원하는 개수만큼 생성할 수 있고 각각의 이름으로 구분
- 1개 이상의 Partition으로 구성
1-2. Partition
- 서로 독립적으로 하나의 Topic을 구성
- 파티션들은 정렬되어 있음
- 데이터를 유한한 시간동안 저장(default 1주일)
- 데이터는 키 값이 제공되지 않으면 파티션에 랜덤하게 할당
- 각 파티션 속 메시지는 오름차순의 id값인 Offset을 가지고 있음
1-3. Offset
- 각 Offset은 속해있는 partition에서만 유효(=다른 파티션에서 동일한 Offset이 가리키는 데이터는 같지 않음)
- Offset값이 파티션마다 다를 수 있음
2. Brokers
- Kafka는 1개 이상의 브로커(서버)로 구성(=즉, 브로커는 카프카가 설치된 서)
- 각 브로커는 정수형 ID값으로 구분
- 각 브로커는 특정한 토픽의 파티션을 보유
- 브로커끼리 연결하면 클러스터
- 브로커는 3개 이상을 가지는 것이 좋음
- 토픽을 생성하면 카프카가 자동으로 파티션들을 브로커에 분배
3. Topic Replication
토픽의 정보를 브로커에 분산처리할 때 하나의 브로커에 장애가 발생해도 시스템이 정상적으로 돌아갈 수 있도록 다른 브로커에 복사본을 만들어두는 것이 안정적이다.
토픽은 replication의 개수가 1개보다 커야 좋으며, 브로커가 다운되면 다른 브로커가 데이터를 처리해준다.
하나의 브로커만이 주어진 파티션 복사본들의 리더가 될 수 있으며 이 리더 하나만 데이터를 받고 처리하는 파티션이 된다.
4. Producers & Consumerts
4-1. Producer
Producer은 토픽에 데이터를 쓰는 객체로, 어떤 브로커의 파티션에 데이터를 저장하는지 자동으로 알고있으며,
브로커에 장애가 발생시 프로듀서는 자동적으로 회복이된다. 데이터 저장 여부를 acks를 통해 확인 가능하다.
- acks=0: 저장 확인 여부 기다리지 않음(데이터 손실 가능)
- acks=1: 리더의 저장 확인 여부만 기다림(제한된 데이터 손실)
- acks=all: 리더와 레플리카들의 확인 여부 기다림(데이터 손실 없음)
프로듀서는 메세지에 문자열이나 숫자 등의 키 값을 포함해서 문자를 보낼 수 있다.
키값이 없으면 데이터는 라운드 로빈 방식으로 브로커에 전송되고, 키 값이 있으면 하나의 파티션에만 전달한다.
4-2. Consumer
컨슈머는 토픽으로부터 데이터를 읽어드리는 역할을 한다.
컨슈머는 어떤 브로커로부터 데이터를 읽을지 알고있으며, 브로커에 장애가 발생하면 회복하는 방법을 알고있다.
데이터는 각 파티션에 들어온 순서대로 읽으며, 읽어드리는 파티션의 순서는 정해져있지 않고 돌아가면서 병렬처리된다.
5. Zookeeper
카프카 클러스터 내부의 브로커들의 리스트를 가지고 있으며, 브로커들을 관리한다.
따라서 카프카는 주키퍼없이 실행할 수 없다.
리더 파티션에 장애가 발생하면 주키퍼가 새로운 리더 파티션을 선발하고, 새로운 토픽 추가나 브로커 장애, 토픽 삭제등의 변경정보를 카프카에 전달한다. 주키퍼는 홀수 개의 서버를 가지고 있어야하며 쓰기를 관장하는 1개의 리 서버와 읽기를 관장하는 팔로워 서버로 구성된다.
Reference
카프카 기초 다지기
(adsbygoogle = window.adsbygoogle || []).push({}); 카프카를 구성하는 주요 요소 주키퍼(Zookeeper) : 아파치 프로젝트 애플리케이션 이름으로 카프카의 메타데이터(metadata) 관리 및 브로커의 정상 상태 점검(hea
www.devtokki.com
[Kafka] 1. 카프카 기초 개념
카프카를 다루는 포스팅을 이어나가기 전에 카프카 관련 기초 개념을 숙지한 상태에서 진행할 필요가 있기에 카프카를 이루는 구성 요소 및 운영 환경에 대한 개념들을 정리하였다.
velog.io
[Kafka] 아주 기초적인 Kafka 톺아보기
event? event streaming? 이벤트(event)? 프로그램에 의해 감지되고 처리될 수 있는 동작이나 사건을 말한다. 브라우저에서의 사용자가 클릭을 했을 때, 스크롤을 했을 '때', 필드의 내용을 바꾸었을 때
steady-hello.tistory.com