ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kafka Log Segment 알아보기
    Kafka 2023. 12. 25. 16:23
    728x90
    반응형

    - 목차

     

    함께 보면 좋은 글.

    https://westlife0615.tistory.com/474

     

    Docker 로 Kafka Cluster 구축해보기.

    - 목차 소개. 저는 로컬 환경에서 카프카 관련 테스트를 진행하는 경우가 많이 생기더군요. 그래서 docker-compose 를 활용하여 Kafka, ZooKeeper 클러스터를 구축하는 내용을 작성하려고 합니다. docker-com

    westlife0615.tistory.com

     

    소개.

    KafkaBrokerProducer 에 의해서 생성되는 메시지들을 저장하고 관리합니다. 

    생성되는 메시지는 Log Segment 라는 단위로 묶이게 되는데요. 

    Log Segment 는 카프카 메시지들이 저장되는 단위이자 하나의 파일로 생각하시면 됩니다. 

    이번 글에서 Log Segment 가 무엇이며, Log Segment 와 관련된 설정들은 어떠한 것들이 존재하는지 알아보겠습니다. 

     

    Log Segment 가 저장되는 위치는 어디일까 ?

    Kafka Brokerserver.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"}

    Kafdrop Image

     

     

    그 이후 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 SegmentKafka 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일이기 때문에 긴 텀을 두고 여유롭게 테스트를 진행해보아야 할 것 같습니다. 

     

     

     

     

    반응형
Designed by Tistory.