본문 바로가기
도서기록/카프카인액션

07 토픽과 파티션

by 코엘리 2025. 2. 15.
반응형

7.1 토픽

  • 토픽은 물리적 구조가 아닌 추상적인 개념이다.
  • 토픽은 일반적으로 하나의 브로커에만 존재하는 것은 아니다.
  • 토픽 이름 뒤에는 실제로 데이터를 보유하는 하나 이상의 파티션이 있다.
  • 파티션은 각 디스크에 물리적 공간이 존재한다.
  • 토픽을 구성하는 역할과 부분은 컨슈머가 데이터에 접근하는 방식에 영향을 미친다.

토픽 설계

  • 첫 번째 단계는 이벤트를 확인하고 하나의 토픽에 속해 있는지 아니면 둘에 속해있는지 구분한다.
  • 두 번째 단계는 각 토픽을 고려하는데, 이 때 파티션의 수를 고려하면 좋다. 중요한 점은 파티션이 토픽별 설계에 대한 질문이지, 클러스터 전체의 제한이나 요구가 아니라는 것이다. 토픽 생성을 위한 기본 파티션 수를 설정할 수 있지만, 대부분의 경우 토픽이 사용되는 방식과 보유할 데이터를 고려해야 한다.
    • 특정 수의 파티션을 선택해야 하는 확실한 이유 중에는 준 라오의 '카프카 클러스터에서 토픽/파티션 수를 선택하는 방법' 을 확인해보자.

데이터

  • 데이터 정확성
    • 이는 순서를 지정해야 하는 이벤트가 동일한 파티션, 토픽에 있는지 확인하는 작업이 포함된다.
    • 컨슈머가 타임스탬프 기반으로 이벤트를 순서대로 배치할 수 있지만, 교차 토픽 이벤트를 조정하는 것이 더 문제가 되고 오류가 발생하기 쉽다.
    • 키드 메시지(keyed message)를 사용하여 순서가 필요하다면, 파티션 그리고 해당 파티션에 대한 향후 변경사항에 주의해야 한다.
  • 컨슈머당 메시지의 양
    • 대량 생산 메시지와 소수 메시지가 동일 토픽에 위치하는 경우, 소수만을 처리하기 위해 대량의 이벤트를 필터링하는데 사용될 수 있다.
  • 가지고 있거나 처리해야 할 데이터 양
    • 제한된 시간 내 처리하기 위해 메시지 수에 따라 여러 컨슈머가 실행되야 하는지 여부
    • 파티션을 많이 만들면 되지만, 파티션이 무제한의 무료 리소스가 아니라는 점을 알아야 한다.

7.1.1 토픽 생성 옵션

  • 토픽 생성 시 내려야 할 또 다른 중요한 결정은 토픽을 삭제해야 하는지 여부이다. 이는 타당한 확인 없이 발생하지 않도록 해야 한다.
    • 이를 위해서는 delete.topic.enable 옵션의 활성화를 요구한다.
  • auto.create.topics.enable.false 로 설정하면 메시지 전달을 시도하기 전에는 실제로 존재하지 않았고 잘못 입력된 토픽 이름으로 프로듀서가 메시지를 보내면 자동으로 토픽 생성을 차단할 수 있다.

7.1.2 복제 팩터

  • 실질적으로 운영되기 위해서는 총 레플리카 수가 브로커 수보다 적거나 같도록 계획해야 한다.
  • 총 브로커수보다 많은 레플리카 수로 토픽을 생성하려고 시도하면 InvalidReplicationFactorException 오류가 발생한다.
  • 위 에러가 발생하는 사유는, 예를들어 2개의 브로커, 3개의 파티션이 있을 때 2개의 레플리카 호스팅 서버가 브로커를 잃어버리면 데이터 사본 하나만 남게 되기 때문이다.

7.2 파티션

  • 컨슈머 관점에서 각 파티션은 변경할 수 없는 메시지 로그이다.
  • 데이터 저장소의 크기를 늘리고 메시지를 추가하기만 하면 된다.

7.2.1 파티션 위치

  • 확장자가 .log 인 파일은 데이터 페이로드가 저장되는 위치다.
  • 로그 파일의 다른 중요한 정보에는 메시지 오프셋과 CreateTime 필드가 포함된다.
  • 카프카는 속도를 위해 만들어졌기 때문에 논리적 메시지 오프셋과 인덱스 파일 내의 물리적 위치 간의 매핑을 저장한다.
  • 파티션은 많은 파일로 구성된다. 실제 파티션은 여러 세그먼트가 모여 하나의 파티션이 된다.
    kinaction_topicandpart파티션
    세그먼트파일(비활성세그먼트) 세그먼트파일(활성)
    7.log 10.log
    7.index 10.index
    7.timeindex 10.timeindex
  • 10.log 는 메시지가 파티션 디렉터리에 기록되는 위치다. 카프나는 활성 세그먼트가 아닌 이전 세그먼트를 다양한 방식으로 관리한다.
  • 세그먼트에 대하여 요약하면 파티션 디렉터리에 이름은 같지만 확장자가 .idex, .timeindex, .log 파일이 여러 개 있다.

7.2.2 로그 보기

  • 로그파일을 직접 cat 하거나 세그먼트 파일에서 메시지를 볼 수 있다.
  • 로그 파일 이름의 큰 단위 숫자는 무작위가 아니다. 세그먼트 이름은 해당 파일의 첫 번째 오프셋과 동일해야 한다.

7.4 토픽 컴팩션

  • 컴팩션 목표는 메시지를 만료시키는 것이 아니라 키의 최신 값이 존재하는지 확인하고 이전 상태를 새 상태로 교체하는 것이다.
  • 컴팩션된 토픽이 데이터를 표시하는 방법에 대한 가장 쉬운 방법 중 하나는 코드가 더 많은 데이터를 추가하는 대신 배열의 기존 필드를 업데이트 하는 방식이다.
  • 카프카는 컨슈머 그룹이 소비하는 오프셋 이력이 필요한 것이 아니라 최신 오프셋만 필요하다.
  • 토픽이 컴팩션으로 표시되면 두 가지 상태(컴팩션 된 상태, 그렇지 않은 상태)의 단일 로그를 볼 수 있다.
  • 활성 세그먼트 메시지는 아직 컴팩션을 거치지 않은 메시지다.
  • 이벤트 엔티티 중 삭제를 처리할 때는 삭제하고자 하는 키 값에 대하여 값을 Null 로 보낸다.
    • 애플리케이션이 삭제 규칙을 직접 처리하지 않고도 카프카가 이러한 데이터 요구사항을 충족하는데 도움을 줄 수 있다.
반응형

'도서기록 > 카프카인액션' 카테고리의 다른 글

08 카프카 스토리지  (0) 2025.02.23
06 브로커  (0) 2025.02.15
05 컨슈머: 데이터 열기  (0) 2025.01.19
04 프로듀서: 데이터 공급  (0) 2025.01.12
03 카프카 프로젝트  (1) 2025.01.05