- 용어 요약
- 메시지: 데이터의 기본 단위
- 키: 메시지를 저장할 파티션을 결정하는 값
- 사용자 페이로드와 시스템 헤더 두 부분으로 나누어진다
- 토픽: 메시지 종류의 분류 단위
- 파티션: 추가만 가능한 로그로써 토픽은 여러 개의 파티션으로 구성된다
- 늘릴 수만 있고 줄일 수는 없다
- 고른 분산을 위해 주로 토픽 당 파티션의 수를 브로커 수의 배수로 설정한다
- 프로듀서: 메시지를 생성하는 주체
- 네트워크 효율성을 위해 메시지를 배치 단위로 모아서 전송한다
- 모든 프로듀서는 리더 브로커에 메시지를 발행해야 한다
- 컨슈머: 메시지를 읽는 주체
- 컨슈머 그룹: 각 파티션이 하나의 컨슈머에 의해서만 읽히도록 하기 위한 집합체
- 컨슈머는 리더 또는 팔로워로부터 메시지를 읽을 수 있다
- 브로커: 하나의 카프카 서버 인스턴스
- 클러스터: 브로커의 집합. 하나의 카프카를 표현하는 논리적 개념
- 하나의 클러스터로 설정하기 위해서는 모든 브로커가 동일한 zookeeper.connect 설정 값을 가져야 한다
- 주키퍼: 카프카의 브로커,토픽, 파티션 메타데이터 정보를 저장하기 위한 분산 코디네이션 서비스
- 프로듀서
- 메시지를 생성하는 주체
- 구성:
- 토픽과 벨류(메시지) 값은 필수. 파티션 및 키 값은 선택 사항
- 키: 추가 정보로써 해당 메시지가 저장될 파티션을 결정하는 역할
- 헤더: 레코드의 키/벨류를 건드리지 않고 추가 메타데이터가 필요할 때 사용
- 접착성 처리
- 파티션의 메시지 배치를 채울 때 다음 배치로 넘어가기 전 이전 배치를 먼저 채우는 규칙
- 네트워크 효율성을 높히고 요청 횟수를 줄이기 위해 사용된다
- acks 옵션
- 컨슈머가 읽는 시간과는 무관하게 쓰기 작업이 성공했다고 판단하기 위한 조건 지정
- acks = 0: fire and forget. 전송 성공 여부와 무관하게 항상 성공
- acks = 1: 리더 브로커가 메시지를 받는 순간 성공
- acks=all: 모든 in-sync 레플리카에 메시지가 전달된 뒤에야 성공
- enable.idempotence: 레코드를 전송할 때 순차적인 번호를 붙여서 전송하여 최소 한번 쓰기 를 지원한다
- 압축: 저자가 강력추천하는 기능으로 한 번의 배치에 더 많은 데이터를 전송 할 수 있다
- 컨슈머
- 메시지를 구독하는 주체(집합)
- 하나의 스레드에 하나의 파티션 컨슈머가 원칙이다
- 컨슈머 그룹의 일부로써 작동한다.
- 제일 먼저 참여한 컨슈머가 그룹 리더가 된다
- 그룹 리더는 참여한 컨슈머들의 파티션 분배를 담당하게 된다
- max.poll.interval.ms 시간 이상으로 호출하지 않는 컨슈머는 그룹에서 퇴출된다
- 리밸런스 방식
- 할당되었던 파티션을 다른 컨슈머에게 할당해주는 작업
- eager 방식: 모든 컨슈머가 읽기를 멈추고 소유권을 포기한 뒤에 전부 재 할당 받는 방식
- 협력 방식: 전체 읽기 멈춤을 방지하기 위해 한 컨슈머에게 할당된 파티션만을 재 할당하는 방식
- 정적 방식: 컨슈머에게 지정된 파티션을 재 할당하지 않고 다시 컨슈머가 시작되면 해당 파티션을 할당하는 방식
- 파티션 할당 전략(partition.assignment.strategy)
- range: 구독하는 각 토픽의 파티션들을 연속된 그룹으로 나눠서 할당한다
- roundRobin: 모든 토픽의 각 파티션을 순차적으로 하나씩 컨슈머에 할당한다
- sticky: 리밸런스 발생 시 가능하면 많은 파티션을 같은 컨슈머에 할당하는 방식
- 협력적 sticky: 협력 방식의 리밸런스를 이용하여 재 할당이 일어나지 않는 파티션을 계속 읽을 수 있도록하는 방식
- 오프셋과 커밋
- 오프셋: 토픽에서 현재 컨슈머 그룹이 읽어간 파티션 별 레코드의 위치
- 커밋: 읽어간 레코드 오프셋을 업데이트하는 행위
- 읽어간 레코드의 오프셋 바로 다음 오프셋 값을 커밋하는 것이 기본 동작
- 동기 커밋은 재시도를 수행하지만 비동기 커밋은 하지 않는다
- 컨트롤러
- 클러스터에서 가장 먼저 시작되는 브로커
- 클러스터의 상태를 변경하는 모든 작업 및 파티션 리더 선출하는 역할을 담당
- 스플릿 브레인 현상을 막기 위해 에포크 번호를 이용한다
- KRaft
- 주키퍼 기반의 컨트롤러를 브로커 기반으로 변경하는 신규 방식
- 클러스터 메타데이터 변경 내역을 카프카 로그로써 관리
- 컨트롤러 노드들은 메타데이터 이벤트 로그를 관리하는 레프트 쿼럼으로 지정
- 액티브 컨트롤러: 메타데이터 로그의 리더 역할인 브로커
- 복제
- 레플리카: 설정한 크기만큼 토픽의 파티션 각각 데이터를 복제한 브로커
- 리더: 일관성 보장을 위해 모든 쓰기/읽기 요청을 받는 브로커
- 팔로워: 리더를 제외한 브로커. 특정 설정을 통해 읽기만 가능
- in vs out sync 레플리카: 복제를 위해 최신 메시지를 항상 요청하는 경우 in-sync, 아닌 경우 out-sync
- 브로커
- 클라이언트에 보내는 메시지에 제로 카피 최적화를 적용 → 파일에서 읽어온 메시지를 중간 버퍼를 거치지 않고 바로 네트워크 채널로 전송
- 내부 스레드 구조
- accepter 스레드: 연결을 받는 포트 별로 실행되어 들어온 요청을 processor 스레드로 넘긴다
- 네트워크 스레드
- 클라이언트 연결로부터 요청을 받아 요청 큐에 넣는다
- 응답 큐에서 응답을 가져다가 클라이언트로 전송한다
- io 스레드: 요청 큐의 작업을 가져다가 수행 후 응답 큐에 넣는 작업을 수행
- 클러스터의 토픽 파일 관리
- 기본 방식: 특정 마운트 지점의 경로만 지정 할 수 있다
- 계층화 방식: 로컬과 원격 두 가지로 나누어 완료된 로그 세그먼트는 원격 저장소를 이용 할 수 있다
- 세그먼트
- 하나의 파티션의 데이터를 1GB 혹은 1주일 치 데이터로 분할한 파일
- 액티브 세그먼트: 완료되지 않고 현재 쓰여지고 있는 세그먼트 → 삭제 불가
- 인덱스
- 파일에서 빠르게 오프셋을 찾기 위해 메시지 오프셋 과 세그먼트 파일 및 위치를 맵핑
- 추가로 타임 스탬프와 메시지 오프셋을 맵핑하는 인덱스도 추가로 저장
- 압착
- 카프카의 신뢰성 보장
- 정확히 한 번 의미
- 데이터 파이프라인
- 데이터 미러링
- 보안
- 모니터링
- 스트림 처리(카프카 스트림즈)
- 팁
- 발행/구독 패턴: 전송자가 메시지를 보낼 때 수신자에게 직접 보내지 않고 브로커를 통하는 방식
- CDC: 데이터베이스의 변경점을 저장하는 로그를 추적하는 개념
- TLS v1.3 은 JAVA 11 이후에 지원되므로 이하 버전에서는 사용 할 수 없다