-
Kafka Log Segment 알아보기Kafka 2023. 12. 25. 16:23728x90반응형
- 목차
함께 보면 좋은 글.
https://westlife0615.tistory.com/474
소개.
Kafka 의 Broker 는 Producer 에 의해서 생성되는 메시지들을 저장하고 관리합니다.
생성되는 메시지는 Log Segment 라는 단위로 묶이게 되는데요.
Log Segment 는 카프카 메시지들이 저장되는 단위이자 하나의 파일로 생각하시면 됩니다.
이번 글에서 Log Segment 가 무엇이며, Log Segment 와 관련된 설정들은 어떠한 것들이 존재하는지 알아보겠습니다.
Log Segment 가 저장되는 위치는 어디일까 ?
Kafka Broker 는 server.properties 파일을 통해서 설정됩니다.
server.properties 에 기록된 여러 설정들 중에서 log.dir 설정값은 브로커가 관리하는 데이터들이 저장되는 위치 정보인데요.
저의 경우에는 /etc/kafka 하위에 server.properties 파일이 존재하기에 아래와 같은 방식으로 log.dir 값을 조회하였습니다.
cat /etc/kafka/server.properties | grep log.dir
log.dirs=/var/lib/kafka
그럼 log.dir 의 값인 /var/lib/kafka 하위에는 어떤 파일들이 존재하는지 살펴보겠습니다.
ls -ls /var/lib/kafka/data total 12 0 -rw-r--r-- 1 appuser appuser 0 Dec 26 05:29 cleaner-offset-checkpoint 4 -rw-r--r-- 1 appuser appuser 4 Dec 26 05:36 log-start-offset-checkpoint 4 -rw-r--r-- 1 appuser appuser 88 Dec 26 05:29 meta.properties 4 -rw-r--r-- 1 appuser appuser 4 Dec 26 05:36 recovery-point-offset-checkpoint 0 -rw-r--r-- 1 appuser appuser 0 Dec 26 05:29 replication-offset-checkpoint
그리고 Topic 을 하나 생성해보도록 하겠습니다.
http://localhost:9000 인 Kafdrop 웹 UI 에서 test-topic 이라는 이름의 Topic 을 생성하겠습니다.
"test-topic" Topic 이 생성된 이후에 /var/lib/kafka/data 하위 파일들을 조회하게 되면
아래와 같이 test-topic-0 이라는 디렉토리가 생성되어 있습니다.
ls -ls /var/lib/kafka/data total 20 0 -rw-r--r-- 1 appuser appuser 0 Dec 26 05:29 cleaner-offset-checkpoint 4 -rw-r--r-- 1 appuser appuser 4 Dec 26 05:41 log-start-offset-checkpoint 4 -rw-r--r-- 1 appuser appuser 88 Dec 26 05:29 meta.properties 4 -rw-r--r-- 1 appuser appuser 19 Dec 26 05:41 recovery-point-offset-checkpoint 4 -rw-r--r-- 1 appuser appuser 19 Dec 26 05:41 replication-offset-checkpoint 4 drwxr-xr-x 2 appuser appuser 4096 Dec 26 05:40 test-topic-0
/var/lib/kafka/data/test-topic-0 하위의 파일들을 한번 더 조회하게 되면,
아래와 같이 index, log 등의 파일들이 생성됩니다.
ls -ls /var/lib/kafka/data/test-topic-0/ total 8 0 -rw-r--r-- 1 appuser appuser 10485760 Dec 26 05:40 00000000000000000000.index 0 -rw-r--r-- 1 appuser appuser 0 Dec 26 05:40 00000000000000000000.log 0 -rw-r--r-- 1 appuser appuser 10485756 Dec 26 05:40 00000000000000000000.timeindex 4 -rw-r--r-- 1 appuser appuser 8 Dec 26 05:40 leader-epoch-checkpoint 4 -rw-r--r-- 1 appuser appuser 43 Dec 26 05:40 partition.metadata
이번 글의 주제인 Log Segment 는 바로 "00000000000000000000.log" 으로 표현되는 파일입니다.
Log Segment FIle 은 어떻게 생겼을까 ?
생성된 Kafka Message 들은 Log Segment File 에 저장됩니다.
그럼 Log Segment File 은 어떤 데이터들로 구성되어 있는지 한번 살펴보도록 하겠습니다.
저의 경우는 아래의 데이터를 test_topic 에 저장한 상태입니다.
{"name": "Andy", "age": 26, "city": "Seoul"} {"name": "Bruce", "age": 26, "city": "Busan"} {"name": "Chris", "age": 26, "city": "Daegu"} {"name": "Daniel", "age": 26, "city": "Yongin"} {"name": "Emma", "age": 26, "city": "Pohang"}
그 이후 Log Segment File 파일의 내부를 조회해보겠습니다.
Log Segment File 은 "00000000000000000000.log" 와 같이 표현됩니다.
cat 명령어를 통해서 파일 내부를 확인하였습니다.
cat 00000000000000000000.log
????\?9??\?HdX{"name": "Andy", "age": 26, "city": "Seoul"}fZ{"name": "Bruce", "age": 26, "city": "Busan"}fZ{"name": "Chris", "age": 26, "city": "Daegu"}j^{"name": "Daniel", "age": 26, "city": "Yongin"}
위의 결과처럼 입력한 Text 가 그대로 적용되어 있습니다.
별다른 Serialization 방식을 사용하지 않아서 Text 파일 그대로 저장되어 있음을 확인할 수 있습니다.
Segment Rolling.
Segment Rolling 이란 Log Segment File 을 생성하는 과정을 의미합니다.
Log Segment 는 Kafka Message 들이 모여 이뤄지는 단위인데요.
Log Segment 는 자체적인 Retention 조건에 의해서 Log Segment File 이 생성됩니다.
Retention 조건은 시간과 용량입니다.
Kafka Message 들이 쌓여 하나의 Log Segment 를 구성하고, 특정 bytes 이상으로 쌓이게 되면 Segment Rolling 이 발생합니다.
또한 정해진 시간이 지나면 Segment Rolling 이 트리거됩니다.
log.segment.bytes
log.segment.bytes 는 Segment Rolling 의 트리거 조건 중 하나입니다.
log.segment.bytes 는 브로커의 설정 파일인 server.properties 에서 설정됩니다.
만약 설정되지 않았다면 기본값은 1GB 이 됩니다.
cat /etc/kafka/server.properties | grep log.segment.bytes log.segment.bytes=1073741824
한번 1GB 의 Kafka Message 를 생성해보도록 하겠습니다.
touch /tmp/very_large_json.json for number in {1..10000} do json='{"id": 1,"name": "Item 1","details": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."}' echo $json >> /tmp/very_large_json.json done
먼저 100Mb 가 넘는 json 파일 하나를 생성한 이후에,
총 8회에 걸처 100Mb 의 Kafka Message 를 "test-topic" Topic 에 추가하였습니다.
ls -lh /tmp/ | grep very_large_json.json -rw-r--r-- 1 pc wheel 145M 12 26 21:29 very_large_json.json
cat /tmp/very_large_json.json | kafka-console-producer -bootstrap-server localhost:9092 --topic test-topic
아래 예시와 같이 Log Segment 파일이 1Gb 를 초과하는 단계에서 Segment Rolling 이 되어 새로운 Log 파일이 생성됩니다.
log.segment.bytes 에 해당하는 1GB 인 상태의 메시지 갯수를 파일 이름으로 삼는 새로운 Log 파일이 생성됩니다.
ls -lh /var/lib/kafka/data/test-topic-0/ total 8.0K -rw-r--r-- 1 appuser appuser 10M Dec 26 05:40 00000000000000000000.index -rw-r--r-- 1 appuser appuser 0 Dec 26 05:40 00000000000000000000.log -rw-r--r-- 1 appuser appuser 10M Dec 26 05:40 00000000000000000000.timeindex -rw-r--r-- 1 appuser appuser 8 Dec 26 05:40 leader-epoch-checkpoint -rw-r--r-- 1 appuser appuser 43 Dec 26 05:40 partition.metadata
ls -lh /var/lib/kafka/data/test-topic-0/ total 154M -rw-r--r-- 1 appuser appuser 10M Dec 26 12:36 00000000000000000000.index -rw-r--r-- 1 appuser appuser 154M Dec 26 12:36 00000000000000000000.log -rw-r--r-- 1 appuser appuser 10M Dec 26 12:36 00000000000000000000.timeindex -rw-r--r-- 1 appuser appuser 8 Dec 26 05:40 leader-epoch-checkpoint -rw-r--r-- 1 appuser appuser 43 Dec 26 05:40 partition.metadata
ls -lh /var/lib/kafka/data/test-topic-0/ total 308M -rw-r--r-- 1 appuser appuser 10M Dec 26 12:36 00000000000000000000.index -rw-r--r-- 1 appuser appuser 307M Dec 26 12:36 00000000000000000000.log -rw-r--r-- 1 appuser appuser 10M Dec 26 12:36 00000000000000000000.timeindex -rw-r--r-- 1 appuser appuser 8 Dec 26 05:40 leader-epoch-checkpoint -rw-r--r-- 1 appuser appuser 43 Dec 26 05:40 partition.metadata
ls -lh /var/lib/kafka/data/test-topic-0/ total 461M -rw-r--r-- 1 appuser appuser 10M Dec 26 12:37 00000000000000000000.index -rw-r--r-- 1 appuser appuser 461M Dec 26 12:37 00000000000000000000.log -rw-r--r-- 1 appuser appuser 10M Dec 26 12:37 00000000000000000000.timeindex -rw-r--r-- 1 appuser appuser 8 Dec 26 05:40 leader-epoch-checkpoint -rw-r--r-- 1 appuser appuser 43 Dec 26 05:40 partition.metadata
ls -lh /var/lib/kafka/data/test-topic-0/ total 615M -rw-r--r-- 1 appuser appuser 10M Dec 26 12:37 00000000000000000000.index -rw-r--r-- 1 appuser appuser 614M Dec 26 12:37 00000000000000000000.log -rw-r--r-- 1 appuser appuser 10M Dec 26 12:37 00000000000000000000.timeindex -rw-r--r-- 1 appuser appuser 8 Dec 26 05:40 leader-epoch-checkpoint -rw-r--r-- 1 appuser appuser 43 Dec 26 05:40 partition.metadata
ls -lh /var/lib/kafka/data/test-topic-0/ total 768M -rw-r--r-- 1 appuser appuser 10M Dec 26 12:37 00000000000000000000.index -rw-r--r-- 1 appuser appuser 768M Dec 26 12:37 00000000000000000000.log -rw-r--r-- 1 appuser appuser 10M Dec 26 12:37 00000000000000000000.timeindex -rw-r--r-- 1 appuser appuser 8 Dec 26 05:40 leader-epoch-checkpoint -rw-r--r-- 1 appuser appuser 43 Dec 26 05:40 partition.metadata
ls -lh /var/lib/kafka/data/test-topic-0/ total 922M -rw-r--r-- 1 appuser appuser 10M Dec 26 12:38 00000000000000000000.index -rw-r--r-- 1 appuser appuser 921M Dec 26 12:38 00000000000000000000.log -rw-r--r-- 1 appuser appuser 10M Dec 26 12:38 00000000000000000000.timeindex -rw-r--r-- 1 appuser appuser 8 Dec 26 05:40 leader-epoch-checkpoint -rw-r--r-- 1 appuser appuser 43 Dec 26 05:40 partition.metadata
ls -lh /var/lib/kafka/data/test-topic-0/ total 1.1G -rw-r--r-- 1 appuser appuser 516K Dec 26 12:38 00000000000000000000.index -rw-r--r-- 1 appuser appuser 1.0G Dec 26 12:38 00000000000000000000.log -rw-r--r-- 1 appuser appuser 299K Dec 26 12:38 00000000000000000000.timeindex -rw-r--r-- 1 appuser appuser 10M Dec 26 12:38 00000000000006549334.index -rw-r--r-- 1 appuser appuser 50M Dec 26 12:38 00000000000006549334.log -rw-r--r-- 1 appuser appuser 332 Dec 26 12:38 00000000000006549334.snapshot -rw-r--r-- 1 appuser appuser 10M Dec 26 12:38 00000000000006549334.timeindex -rw-r--r-- 1 appuser appuser 8 Dec 26 05:40 leader-epoch-checkpoint -rw-r--r-- 1 appuser appuser 43 Dec 26 05:40 partition.metadata
< 현재 test-topic 의 메시지 갯수 : 6851824 >
log.roll.ms or log.roll.hours
Log Segment 의 Retention 은 파일 사이즈 뿐만 아니라 시간 조건도 존재합니다.
log.roll.ms 의 기본값은 7일로 설정됩니다.
그래서 기본적인 테스트가 어려운 관계로 log.roll.ms 는 1분으로 조작한 이후에
Log Segment 의 Retention 을 살펴보려고 합니다.
echo 1 | kafka-console-producer -bootstrap-server localhost:9092 --topic test-topic
아래와 같이 server.properties 의 log.roll.ms 를 1분으로 변경하였습니다.
1분 주기로 Log Segment 가 어떻게 변하는지 알아보겠습니다.
5분 경과.
ls -lh /var/lib/kafka/data/test-topic-0/ | grep log -rw-r--r-- 1 appuser appuser 1.0G Dec 26 12:38 00000000000000000000.log -rw-r--r-- 1 appuser appuser 50M Dec 26 12:38 00000000000006549334.log
5분이 경과하여도 log.roll.ms 의 값이 Segment Rolling 에 큰 영향을 주진 않는 것 같습니다.
다만 default value 가 7일이기 때문에 긴 텀을 두고 여유롭게 테스트를 진행해보아야 할 것 같습니다.
반응형'Kafka' 카테고리의 다른 글
[Kafka] Partition Leader Election 알아보기 (파티션 리더 선출) (0) 2023.12.31 [Kafka Streams] Config 알아보기 (0) 2023.12.29 [Kafka] Zookeeper 는 Broker 를 어떻게 관리할까 ? (0) 2023.12.22 Kafka Repartition 알아보기. (0) 2023.12.22 Docker 로 Kafka Cluster 구축해보기. (0) 2023.12.16