개발이 취미인 사람

[Kafka] - Broker 로그(로그 세그먼트) 본문

카테고리 없음

[Kafka] - Broker 로그(로그 세그먼트)

RyanSin 2024. 10. 19. 14:25
반응형

개요

안녕하세요. 이번 시간에는 로그 세그먼트 관리 방식에 대해 알아보겠습니다.

 

카프카의 토픽으로 들어오는 메시지(or 레코드 Record)는 세그먼트(Segment) 또는 로그 세그먼트(Log segment)라는 파일에 저장됩니다.

 

실제 메시지 내용만 저장되는 게 아닌 메시지 키, 값, 오프셋, 메시지 크기 같은 정보도 같이 저장되며, 중개인의 로컬 디스크에 보관됩니다.

 

xxx.index, xxx.log, xxx.timeindex, leader-epoch-checkpoint 파일을 보관합니다.

 

xxx.index : 로그 세그먼트에 저장된 위치와 오프셋 정보를 기록하는 파일

xxx.log : 실제 메시지들이 저장되는 파일

xxx.timeindex : 메시지의 타임스탬프를 기록하는 파일

leader-epoch-checkpoint: 리더 에포크 정보를 관리하는 파일

 

로그 세그먼트 관리는 다음과 같은 설정으로 관리를 할 수 있습니다. (롤링, 삭제, 컴팩션)

 

로그 세그먼트 롤링

로그 세그먼트 파일은 기본적으로 1GB로 설정되어 있어 로그 파일 크기가 1GB보다 커지는 경우에는 기본적으로 롤링(Rolling) 전략을 적용됩니다.

 

롤링 전략으로는 두 가지 방식이 존재합니다. 하나는 크기 기반 또 하나는 시간 시간입니다.

 

  1. 크기 기반 롤링 전략
    메시지를 로그 파일에 계속 덧붙이다가 로그 파일 크기가 1GB가 도달하면 세그먼트 파일을 클로즈하고 새로운 로그 세그먼트 파일을 생성합니다. 세그먼트 최대 크기(log.segment.bytes) 설정
  2. 시간 기반 롤링 전략
    메시지를 로그 파일에 계속 덧붙이다가 설정한 시간이 지나면 새로운 로그 세그먼트 파일을 생성합니다.
    최대시간(log.roll.ms 또는 log.roll.hours) 설정

 

로그 세그먼트 삭제

Kafka는 기본적으로 오래된 로그를 삭제하거나 보관하는 전략을 가지고 있습니다.

 

삭제 옵션은 브로커의 설정 파일인 server.properties에서 log.cleanup.policy가 delete로 명시되어야 합니다. 해당 값은 기본값으로 적용되므로, 관리자가 server.properties에 해당 옵션을 따로 명시하지 않았다면 로그 세그먼트는 삭제 정책이 적용됩니다. 

 

이때 사용되는 두 가지 주요 설정이 있습니다:

  1. 로그 유지 기간 (log.retention.hours, log.retention.ms): 세그먼트가 생성된 지 일정 시간이 지나면 해당 세그먼트가 삭제됩니다.
  2. 로그 크기 (log.retention.bytes): 파티션별 전체 로그 크기가 특정 용량을 초과하면 오래된 세그먼트부터 삭제됩니다.

이 설정들은 데이터를 얼마나 오랫동안 유지할지, 또는 얼마나 많은 용량의 데이터를 유지할지를 정의합니다. 일정 시간이나 크기를 넘으면 Kafka는 오래된 세그먼트를 삭제하여 디스크 공간을 확보합니다.

 

로그 세그먼트 컴팩션

Kafka에서 로그 컴팩션은 특정 키(key)에 대해 가장 최근에 쓰여진 메시지만 남기고 이전 메시지는 제거하는 방식입니다.

 

로그 컴팩션은 주로 데이터의 최신 상태를 유지하고, 중복된 데이터를 제거하는 데 사용됩니다. 특정 키에 대해 여러 값이 있을 때, 컴팩션은 해당 키의 가장 최신 값을 제외한 모든 이전 데이터를 삭제합니다.

 

출처: https://kafka.apache.org/documentation/#compaction

 

위 그림에서 보는 것 처럼 컴팩션 전과 후를 설명하는 그림입니다.

 

각 키(Key)별 최신 데이터만 추출해서 로컬 디스크에 저장해서 관리합니다. 이런식으로 관리를 하면 장애 복구 단계에서 메시지 전체를 복구하는 방식이 아닌 최신 데이터만 가져올 수 있기 때문에 속도가 훨씬 빠릅니다.

 

반대로 컴팩션을 활용하면 작업이 실행되는 동안 브로커의 과도한 입출력 부하가 발생할 수 있습니다. 꼭 모니터링을 통해 관리되어야 합니다.

 

이번 시간에는 로그 세그먼트에 대해 알아봤습니다. 혹시 헷깔리시는 분들은 댓글을 꼭 남겨주시면 감사하겠습니다.