1 카프카 브로커
- 카프카 브로커는 카프카 클라이언트와 데이터를 주고 받기위해 사용되는 주체이자 데이터를 분산 저장하여 장애가 발생하더라도 안전하게 사용할 수 있도록 도와주는 애플리케이션이다.
- 하나의 서버에는 한 개의 카프카 브로커 프로세스가 실행된다.
- 카프카 브로커 서버 1대로도 기본 기능이 실행되지만 데이터를 안전하게 보관하기 위해 최소 3대 이상의 브로커를 1개의 클러스터로 묶어서 운영한다.
- 카프카 클러스터로 묶인 브로커들은 프로듀서가 보낸 데이터를 안전하게 분산 저장하고 복제하는 역할을 한다.
1.1 데이터 저장 전송
- 프로듀서로부터 데이터를 전달 받으면 카프카 브로커는 프로듀서가 요청한 토픽의 파티션에 데이터를 저장한다.
- 메모리가 아닌 파일 시스템에 데이터를 저장한다.
log.dir옵션에 지정한 디렉토리에 데이터를 저장한다.
- 컨슈머가 데이터를 요청하면 파티션에 저장된 데이터를 전달한다.
1.2 데이터 삭제
- 컨슈머가 데이터를 가져가더라도 토픽의 데이터는 삭제되지 않는다.
- 컨슈머나, 프로듀서가 데이터 삭제를 요청할 수 없다.
- 브로커만이 데이터를 삭제할 수 있다.
- 데이터 삭제는 로그 세그먼트라는 파일 단위로 이루어지며 이 세그먼트에는 다수의 데이터가 들어있어 특정 데이터를 선별해서 삭제할 수 없다.
- 세그먼트는 데이터가 쌓이는 동안 파일 시스템으로 열려있다.
log.segment.bytes또는log.segment.ms옵션 값에 따라 세그먼트 파일이 닫힌다.log.segment.bytes의 기본값은 1GB 해당 용량에 도달하면 세그먼트 파일이 닫힌다.- 닫힌 세그먼트 파일은
log.retention.bytes또는log.retention.ms옵션 설정값이 넘으면 삭제된다.
1.3 컨슈머 오프셋 저장
- 컨슈머 그룹은 토픽의 특정 파티션으로부터 데이터를 가져가서 처리하고 파티션의 어느 레코드까지 가져갔는지 확인을 위해 오프셋을 커밋한다.
- 커밋한 오프셋은
__consumser_offsets토픽에 저장된다. - 컨슈머 그룹은
__consumser_offsets토픽에 저장된 오프셋을 확인하고 다음 레코드를 가져가서 처리한다.
1.4 코디네이터
- 클러스터 중 한 대의 브로커가 코디네이터의 역할을 한다.
- 코디네이터는 컨슈머 그룹의 상태를 체크하고 파티션을 컨슈머와 매칭되도록 분배하는 역할을 한다.
- 컨슈머가 그룹에서 빠지면 매칭되지 않는 파티션을 정상 작동하는 컨슈머에게 할당한다.
- 이렇게 파티션을 컨슈머로 재할당하는 과정을 리밸런스(rebalance)라고 한다
1.4.1 Rebalancing
broker중하나가group coordinator역할을 한다.group coordinator는rebalancing을 발동시키는 역할을 한다.
컨슈머 그룹의 컨슈머에게 장애가 발생한다면
- 장애간 발생한
consumer에 할당된partition은 정상 작동하는consumer에 소유권이 넘어간다. - 이를
rebalancing이라 한다.
rebalancing은 두가지 상황에서 발생한다.
- 그룹에
consumer가 추가되는 상황 - 그룹에
consumer가 제외되는 상황
rebalancing 은 자주 일어나서는 안 된다.
rebalancing이 발생 할 때consumer그룹의consumer들이topic의 데이터를 읽을 수 없기 때문
그룹에 consumer가 추가되는 상황 예시
- Library-events 토픽에 3개의 파티션이 존재함
- 아래 그림과 같이 컨슈머 인스턴가 하나인 경우 3개 파티션 모두가 하나에 컨슈머에 할당됨

- 잠시후 같은 그룹인 컨슈머 인스턴스 하나가 추가됨
rebalancing이 발생하여group coordinator가 파티션1을 새로운 인스턴스에 할당함
1.5 브로커 설정
필수 옵션
broker.id
- 카프카 브로커의 ID를 설정한다.
- id는 유일해야한다.
- 다른 브로커와 동일한 id를 가지면 비정상적인 동작이 발생할 수 있다.
zookeeper.connect
- 카프카 브로커와 연동할 주키퍼의 IP와 port를 설정한다.
log.dir
- 로그가 저장되는 위치
선택 옵션
listeners
- 카프카 브로커가 통신을 위해 열어둘 인터페이스 IP, port, 프로토콜을 설정한다.
- 설정하지 않으면 모든 IP와 port에서 접속할 수 있다.
advertised.listeners
- 카프카 클라이언트 또는 커맨드 라인 툴을 브로커와 연결할 때 사용하는 IP와 port 정보를 설정한다.
default.replication.factor
- 리플리케이션 팩터 옵션을 주지 않았을 경우 기본 값을 설정
- 2~3을 권장
min.insync.replicas
min.insync.replicas프로듀서가 메시지를 성공적으로 전송하기 위해 필요한 최소한의 동기화된 레플리카 수를 지정합니다- 프로듀서의
acks설정과 함꼐 쓰인다. - 손실 없는 데이터 전송을 원한다면
acks=all과min.insync.replicas=2토픽의 리플리케이션 팩터를 3으로 설정하는 것을 권장합니다.- 한 브로커의 장애 를 허용하면서도 데이터 안정성을 유지할 수 있습니다.
- 2개의 레플리카만 ISR에 있지만, min.insync.replicas=2를 만족하므로 쓰기가 가능하고, acks=all은 이 2개의 ISR로부터만 확인을 받으면 됩니다.
auto.create.topics.enable
- 존재하지 않는 토픽을 퍼블리셔가 메세지를 보냈을 때 자동으로 토픽을 만드는 설정
- 프로덕션에선
auto.create.topics.enable=false
delete.topic.enable
- 토픽을 삭제 가능하게 설정
num.partition
- 파티션 개수를 명시하지 않고 토픽을 생성할 때 지정되는 파티션 개수를 설정한다.
offsets.retention.minutes
- 오프셋이 유지되는 시간을 설정한다
- 기본값 1일
- 독립적인 소비자의 경우 마지막 커밋 시간 후 이 보존 기간이 지나면 오프셋이 만료됩니다.
2 토픽(topic)
2.1 토픽의 개념
topic이란 카프카에서 데이터를 구분하기 위해 사용하는 단위이다.topic은 1개 이상의partition을 소유하고 있다.- 토픽을 생성할 때
partition수를 설정한다.
- 토픽을 생성할 때