-
[Kafka] Log Index File 알아보기Kafka 2024. 1. 3. 04:32728x90반응형
- 목차
들어가며.
Kafka 는 Log Management 를 위해서 3가지 파일을 사용합니다.
첫번째 파일은 Log 파일로써 실질적인 Log Segment 를 저장합니다.
Kafka Producer 가 생성하는 레코드들이 파티션 별로 저장되게 됩니다.
Log 파일은 .log 로 끝나는 확장자를 가지는 파일입니다.
https://westlife0615.tistory.com/514
두번째 파일은 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 Offset 와 Physical 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.bytes 는 Index Entry 가 추가되는 기준 또는 트리거라고 생각하시면 좋을 것 같네요.
segment.index.bytes
segment.index.bytes 는 Index File 의 기본 크기값을 지정하는 설정입니다.
아래 이미지처럼 segment.index.bytes 의 기본값은 10mb 이구요.
처음 Topic 이 생성되는 순간 10MB 의 Index File 이 생성됩니다.
그리고 Log Segment File 이 Rolling 되는 시점에 새로운 Log Segment File 과 Index 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 File 은 10MB 가 됩니다.
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
반응형'Kafka' 카테고리의 다른 글
[Kafka] ProducerInterceptors 알아보기 (0) 2024.01.05 [Kafka] Partition Ownership 알아보기 (0) 2024.01.05 [Kafka] listeners, advertised.listeners 알아보기 (2) 2024.01.01 [Kafka] Partition Leader Election 알아보기 (파티션 리더 선출) (0) 2023.12.31 [Kafka Streams] Config 알아보기 (0) 2023.12.29