카프카, 데이터 플랫폼의 최강자 저자의 후속편.
조금 더 많은 실습/팁과 최신 카프카의 근황에 대해 담고 있다
기본적인 카프카에 대한 설명을 생략하였다
-
카프카 특징
- 높은 처리량, 낮은 지연시간
- 백 프레셔 핸들링 → 클라이언트가 속도 조절
- 적어도 한번 전송 방식을 통한 누락 제거
- 백그라운드로 파일 저장(fsync) 처리하고 Zero-Copy에 의존
- 페이지 캐시를 이용한 성능 향상
- 배치 전송/압축 전송 지원
-
주키퍼
- 카프카의 정상 동작을 보장하기 위해 메타데이터를 관리하는 분산 코디네이터 서드파티 모듈
- 반드시 홀수로 구성해야 한다 → 살아있는 노드가 과반수 이상이어야 운영이 가능하다
- Kafka 4.0 에서 제거가 되었다
-
파티션
- 한 개의 토픽을 병렬 처리하기 위해 분산하여 저장하는 개념적 공간
- 오프셋: 각 파티션에서 메시지가 저장되는 위치(id). 64비트 정수
-
로그 세그먼트
- 파티션 내부에서 실제 데이터를 담고 있는 로그 형태의 파일
- 메시지는 정해진 형식에 맞추어 순차적으로 저장한다
- 한 개의 파티션에 여러 개의 세그먼트가 존재할 수 있다
- 기본 크기는 1GB 이며 넘을 경우 롤링 방식을 이용한다
- 기본 보존주기는 7일이다 ( retention.ms 옵션 )
- 로그 컴팩션
- 로그를 삭제하지 않고 키 값을 기준으로 마지막 값만 보관하는 정책
- 이 정책을 사용하는 경우 키를 필수적으로 전송해야 한다
-
리플리케이션
- 각 Record를 여러 개로 복제해서 브로커(서버 인스턴스)에 분산시키는 행위
- 각 토픽의 파티션을 리플리케이션하여 내결함성을 얻는다
- 권장하는 리플리케이션 팩터( 브로커 수 )는 3
- 여러 개의 리플리케이션 브로커 중 한 개만 리더로 선정되며 컨슈머는 리더를 통해서만 읽기/쓰기가 가능하다
- 성능을 위해 리더가 푸시하는 방식이 아닌 팔로워가 풀하는 방식으로 이루어진다
- ISR ( In Sync Replica )
- 토픽의 리더와 팔로워가 논리적으로 묶인 그룹
- 하이워터마크: 리더가 팔로워의 모든 복제가 완료 될 시 커밋하는 오프셋. 커밋된 오프셋만 컨슈머가 읽을 수 있다
- Leader Epoch
- 파티션 복구 동작 시에 메시지의 일관성을 위한 방칙
- 팔로워가 새로운 리더로 선출될 때 자신의 하이워터마크보다 높은 오프셋을 무조건 삭제하지 않고, 복구된 리더에게 Epoch 요청을 보내 최종 오프셋을 확인하여 메시지의 유실을 방지하는 방법
-
컨트롤러
- ISR 그룹에서 리더를 선출하는 동작을 담당하는 모듈
- 랜덤한 하나의 브로커가 컨트롤러를 담당한다
현재 ISR 리스트의 정보는 주키퍼에 저장되어 있다
-
프로듀서

- ProducerRecord
- 실제 전송하는 데이터 구조
- 구성
- 토픽: 전송할 토픽의 이름
- 파티션(옵션): 특정 파티션으로 전송하기 위한 값
- 키(옵션): 특정 파티션에서 레코드를 정렬하기 위한 값
- 밸류: 레코드의 실제 데이터
- 시리얼라이져: ProducerRecord를 전송하기 위한 형태로 변환
- 파티셔너: 키를 Hash 처리하여 파티션을 선택하는 모듈
- 기본적으로는 라운드 로빈 방식으로 동작한다
- 만약 파티션을 지정했다면 ByPass 한다
- 파티셔닝 전략
- 라운드 로빈
- 키 값이 Null인 경우 순차적으로 파티션 1개씩 돌아가며 할당하는 전략
- Batch 전송 옵션으로 인해 오랜 기간 버퍼에 대기 후에 전송되는 케이스가 발생할 수 있다
- 스티키 파니셔닝
- 라운드 로빈의 단점을 해결하기 위함
- 하나의 파티션부터 레코드를 먼저 채워서 빠르게 전송하는 전략
- 주요 옵션
- acks: 요청 완료에 대한 결정 옵션
- 0, 1, -1(all) 3가지가 존재하며 각각
전송여부 확인하지 않음/ 리더만 저장여부 확인/ 전체 팔로워 저장여부 확인 으로 동작한다
- enable.idempotence: 중복 없는 전송을 위한 옵션
- max.in.flight.requets.per.connection 5 이하 , retries는 0 이상, acks 옵션이 all로 설정되어야 동작한다
- transactional.id: 정확히 한 번 전송을 위한 옵션. 반드시 enable.idempotence 가 켜져 있어야 한다
- 처리량을 높이려면 batch.size, linger.ms 값을 크게하고, 지연을 줄이려면 두 값을 작게 해야 한다
- 정확히 한 번 전송 옵션
- 트랜잭션 코디네이터 모듈을 서버에 이용하여 같은 메시지를 중복으로 카프카에 저장하지 않는 옵션
- ProductId ( 설정필요 ) 와 transactional.id 를 이용하여 메시지 전송 트랜잭션을 관리한다
- 컨슈머는 read_committed 옵션 설정을 통해 트랜잭션에 성공한 메시지만 읽을 수 있다
-
컨슈머
- 카프카 토픽의 메시지를 가져오는 역할을 담당
- 가장 핵심 기능은 오프셋 관리. 컨슈머는 다음으로 읽어야 할 위치를 _consumer_offsets 토픽에 저장한다
- 컨슈머 그룹: 토픽과 1:1로 대응하는 하나 이상의 컨슈머들이 모여있는 그룹.
- 그룹 코디네이터: 안정적인 그룹 관리를 위해 브로커 중 하나에 존재하는 모듈
- 파티셔닝(컨슈머 할당) 전략
- 주요 옵션
- 메시지 손실: 잘못된 오프셋 커밋으로 인해 메시지를 컨슈머가 읽어오지 못하는 현상
- 프로듀서의 정확히 한 번 전송을 이용하기
- LAG: 프로듀서가 보낸 메시지 수 - 컨슈머가 가져간 수 → 컨슈머 어플리케이션 성능의 지표가 될 수 있다