ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kafka] Log Index File 알아보기
    Kafka 2024. 1. 3. 04:32
    728x90
    반응형

    - 목차

     

     

    들어가며.

    Kafka 는 Log Management 를 위해서 3가지 파일을 사용합니다.

    첫번째 파일은 Log 파일로써 실질적인 Log Segment 를 저장합니다.

    Kafka Producer 가 생성하는 레코드들이 파티션 별로 저장되게 됩니다.

    Log 파일은 .log 로 끝나는 확장자를 가지는 파일입니다.

    https://westlife0615.tistory.com/514

     

    Kafka Log Segment 알아보기

    - 목차 함께 보면 좋은 글. https://westlife0615.tistory.com/474 Docker 로 Kafka Cluster 구축해보기. - 목차 소개. 저는 로컬 환경에서 카프카 관련 테스트를 진행하는 경우가 많이 생기더군요. 그래서 docker-comp

    westlife0615.tistory.com

     

    두번째 파일은 Index 파일과 Time Index 파일입니다.

    이들인 Kafka 의 데이터 조회의 효율을 높이기 위해서 사용되는 Index 파일입니다.

    이름이 의미하는 바처럼 Index 파일은 Record 의 Offset 별로 인덱싱을 지원합니다.

    그리고 Time Index 파일은 Record 의 Timestamp 별로 인덱싱을 지원하죠.

    Kafka 는 이렇게 Offset 과 Timestamp 를 기준으로 인덱싱을 처리하며,

    이번 글에서 살펴볼 Index File 은 Record 의 Offset 과 관련이 깊습니다.

     

    또한 Kafka 는 Sparse Indexing 방식을 사용합니다.

    일반적인 Database 에서 Primary Key 에 적용하는 Dense Indexing 과 그 관점이 다릅니다.

     

    이어지는 글에서 Kafka 의 Indexing 과 Index 파일에 대해서 그리고 관련한 여러 설정들에 대해서 알아보도록 하겠습니다.

     

    Index File.

    Index File 은 Log Segment 의 Offset 과 Offset 에 해당하는 Record 의 위치를 byte 단위로 기록합니다.

    예를 들어, 5개의 Record 들이 Log Segment File (.log) 에 저장되어 있습니다.

    그리고 각각의 Record 의 byte length 가 1KB 라고 한다면,

    Index FIle 은 아래와 같이 Offset 에 해당하는 Record 의 시작 위치를 저장합니다.

    1: 1KB
    2: 2KB
    3: 3KB
    4: 4KB
    5: 5KB

     

    Index FIle 은 Binary 형식으로 저장되어 있기 때문에 내부 컨텐츠를 읽기 위해서는 kafka-dump-log 실행파일을 활용해야합니다.

    kafka-dump-log --files /var/lib/kafka/data/test_topic-0/00000000000000000000.index
    Dumping /var/lib/kafka/data/test_topic-0/00000000000000000000.index
    offset: 188 position: 16372
    offset: 282 position: 32631
    offset: 376 position: 48890
    offset: 470 position: 65149
    offset: 564 position: 81408
    offset: 658 position: 97667
    offset: 752 position: 113926
    offset: 846 position: 130185
    offset: 940 position: 146444

     

     

    Index Entry 알아보기.

    Index FIle 은 .index 확장자로 표현되는 하나의 파일입니다.

    Index File 은 Index Entry 들로 구성되는데요.

    Index Entry 는 Log Segment File 에서 특정 Record 가 파일의 어느 위치에 있는지 정보를 저장합니다.

    예를 들어, Offset 이 0 ~ 9999 까지의 Record 들을 저장한 Log Segment File 이 있다고 가정하겠습니다.

    이 Log Segment File 은 0000.log 와 같은 이름을 가지는 파일이 됩니다.

    마찬가지로 Index File 또한 0000.index 와 같은 이름을 가집니다.

    (.log 와 .index 앞에 붙는 숫자는 파일이 취급하는 Record 들의 첫번째 Offset 에 해당합니다. )

     

    그리고 Index Entry 는 Relative OffsetPhysical Position 두가지 정보를 포함합니다.

    Relative Offset 은 0 번 Offset 인 Base Offset 으로부터 상대적으로 얼마나 떨어져 있는지를 표현합니다.

    즉, 상대적 거리를 표현합니다.

    그리고 Physical Position 은 Record 가 실제 Log Segment File 에서 어느 위치에 존재하는지 물리적 거리를 Bytes 로써 표현합니다.

    정리하면, Index Entry 는 Offset 의 상대 거리와 Record 의 물리적 위치를 설명하게 됩니다.

     

    Index Entry 는 12 Bytes 로 표현되는데요.

    4 Bytes 는 Relative Offset 을 저장하는데에 사용되고, 나머지 8 Bytes 는 Physical Position 을 저장하는데에 사용됩니다.

     

     

    log.index.interval.bytes ( Sparse Index )

    Kafka Topic 은 log.index.interval.bytes 라는 설정을 가집니다.

    Kafka 는 Sparse Indexing 방식을 취하게 됩니다.

    즉, 일반적인 데이터베이스처럼 모든 Record 의 Primary Key 를 대상으로 Indexing 을 취하지 않습니다.

    따라서 Sparse Indexing 을 위한 Gap 또는 Interval 를 설정할 수 있어야하며,

    log.index.interval.bytes 설정이 바로 Indexing Interval 을 위한 설정입니다.

    이는 Bytes 를 단위로써 적용되며, 기본값은 4KB 입니다.

    Log Segment 가 4KB 만큼 쌓이게 되면, Index File 에 Index Entry 가 추가되는 구조입니다.

     

    log.index.interval.bytesIndex Entry 가 추가되는 기준 또는 트리거라고 생각하시면 좋을 것 같네요.

     

    segment.index.bytes

    segment.index.bytesIndex File 의 기본 크기값을 지정하는 설정입니다.

    아래 이미지처럼 segment.index.bytes 의 기본값은 10mb 이구요.

    처음 Topic 이 생성되는 순간 10MB 의 Index File 이 생성됩니다.

     

    그리고 Log Segment File 이 Rolling 되는 시점에 새로운 Log Segment FileIndex File 이 생성됩니다.

    Rolling 되는 시점에 Index File 은 적절한 크기로 Resizing 되는데요.

    한번 테스트를 통해서 확인해보겠습니다.

     

    "index_topic" 이라는 새로운 Topic 을 생성하고, 데이터를 추가해보겠습니다.

    저의 경우 log.segment.bytes 의 값은 기본값인 1GB입니다.

    그리고 Log Segment File 의 크기가 log.segment.bytes 에 도달하게 되면 Rolling 이 시작됩니다.

     

    아래 이미지는 Rolling 되기 직전의 모습입니다.

    Log Segment File 의 크기는 971.6MB 이구요.

    Index File 은 여전히 10MB 입니다.

     

    그리고 Segment Rolling 이 트리거된 이후에 Index File 의 크기는 적절한 사이즈인 516.3KB 로 리사이징됩니다.

    새롭게 생성된 Index File10MB 가 됩니다.

     

     

     

     

    Index File 은 언제 사용될까 ? (Seek)

    일반적으로 Index 는 데이터의 조회의 효율을 높이는 방식입니다.

    Kafka Index 는 Consumer 의 레코드 조회를 돕기 위한 장치이며, 이는 Consume 의 Consume 방식과 관련이 있습니다.

    보통 Kafka Consumer 는 earliest 또는 latest 방식으로 토픽을 조회합니다.

    Earliest 방식은 Topic 의 모든 레코드들을 조회할 수 있고, Latest 방식은 현 시점을 기준으로 레코드를 읽어들입니다.

    이 두가지 방식은 가장 흔하게 사용되지만, Kafka Topic 의 Indexing 을 활용하는 방식은 아닙니다.

    그 외에 Kafka Consumer 는 Seek 기능을 통해서 특정 Offset 을 기준으로 데이터를 읽어들일 수 있습니다.

    아래와 같이 --offset 옵션을 통해서 조회하고자하는 Starting Offset 을 지정할 수 있고, 이 과정에서 Index 파일이 사용됩니다.

    kafka-console-consumer.sh \
    --bootstrap-server localhost:9092 \
    --topic my-topic \
    --partition 0 --offset 10

     

     

     

     

    반응형
Designed by Tistory.