• 용어 요약
    • 메시지: 데이터의 기본 단위
      • 키: 메시지를 저장할 파티션을 결정하는 값
      • 사용자 페이로드와 시스템 헤더 두 부분으로 나누어진다
    • 토픽: 메시지 종류의 분류 단위
    • 파티션: 추가만 가능한 로그로써 토픽은 여러 개의 파티션으로 구성된다
      • 늘릴 수만 있고 줄일 수는 없다
      • 고른 분산을 위해 주로 토픽 당 파티션의 수를 브로커 수의 배수로 설정한다
    • 프로듀서: 메시지를 생성하는 주체
      • 네트워크 효율성을 위해 메시지를 배치 단위로 모아서 전송한다
      • 모든 프로듀서는 리더 브로커에 메시지를 발행해야 한다
    • 컨슈머: 메시지를 읽는 주체
      • 컨슈머 그룹: 각 파티션이 하나의 컨슈머에 의해서만 읽히도록 하기 위한 집합체
      • 컨슈머는 리더 또는 팔로워로부터 메시지를 읽을 수 있다
    • 브로커: 하나의 카프카 서버 인스턴스
      • **broker.id** 설정 값은 유일한 값이여야 한다
    • 클러스터: 브로커의 집합. 하나의 카프카를 표현하는 논리적 개념
      • 하나의 클러스터로 설정하기 위해서는 모든 브로커가 동일한 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 이후에 지원되므로 이하 버전에서는 사용 할 수 없다