
Kafka는 대량의 데이터를 효율적으로 저장하고 관리하기 위해 로그 세그먼트(Log Segment) 개념을 사용해요. 토픽(Topic)은 여러 개의 파티션(Partition)으로 나뉘고, 각 파티션은 내부적으로 여러 개의 로그 세그먼트로 구성돼요.
이번 글에서는 Kafka의 Log Segment가 무엇인지, 어떻게 생성되고 관리되는지 알아볼게요.
Log Segment는 Kafka의 파티션 내에서 메시지가 저장되는 기본 단위예요.
즉, 하나의 파티션은 여러 개의 Log Segment 파일로 구성돼요.
이러한 Log Segment는 특정 조건(시간 또는 크기)에 따라 새로운 파일로 롤링(rolling)되며, 기존 세그먼트는 압축(compaction)되거나 삭제(retention)될 수 있어요.
Kafka Broker는 server.properties 파일의 log.dirs 설정을 통해 Log Segment 파일이 저장될 위치를 지정해요.
기본적으로 /var/lib/kafka/data 같은 경로에 저장돼요.
토픽이 생성되면 해당 위치에 새로운 디렉터리가 만들어지고, .log, .index, .timeindex 같은 파일들이 저장돼요.
Kafka의 Log Segment는 메시지를 저장하는 .log 파일과 인덱스 정보를 저장하는 .index, .timeindex 파일로 구성돼요.
.index 파일은 특정 오프셋에서 데이터를 빠르게 찾을 수 있도록 도와주고,
.timeindex 파일은 타임스탬프와 메시지 오프셋 간의 매핑 정보를 포함해요.
Kafka는 특정 조건이 충족되면 새로운 Log Segment를 생성해요.
이를 Rolling Update라고 해요. Log Segment가 생성되는 조건은 두 가지예요:
1. segment.bytes: 설정된 크기보다 커지면 새로운 Log Segment가 생성돼요.
2. segment.ms: 특정 시간이 지나면 새로운 Log Segment가 생성돼요.
log.segment.bytes: 하나의 Log Segment 파일이 가질 수 있는 최대 크기를 지정해요. 기본값은 1GB예요.
log.segment.ms: 설정된 시간이 지나면 새로운 Log Segment를 생성해요. 기본값은 7일이에요.
log.retention.ms: 설정된 시간 이후에는 Log Segment가 삭제돼요.
기본값은 7일이에요.
log.retention.bytes: 저장된 데이터 크기가 설정된 값을 초과하면 오래된 Log Segment가 삭제돼요.
log.cleanup.policy: 로그 정리 방식(delete 또는 compact)을 결정해요.
log.index.interval.bytes: 인덱스 파일이 생성되는 간격을 결정해요.
Kafka는 Log Retention 설정을 통해 일정 기간이 지나거나 특정 크기를 초과하면 오래된 Log Segment를 삭제하거나 압축해요.
이때 Cleanup Policy가 중요한 역할을 해요.
Delete: 기본 정책으로, retention.ms 또는 retention.bytes 기준을 초과하면 Log Segment를 삭제해요.
Compact: 동일한 키를 가진 메시지가 존재할 경우, 최신 값만 남기고 이전 값은 삭제해요. (cleanup.policy=compact 설정 시)
Kafka의 Log Compaction은 과거 데이터를 삭제하는 Retention 정책과 달리, 동일한 키의 최신 값만 남기는 방식이에요. Log Compaction은 현재 Rolling 중인 Log Segment가 아니라, 과거의 Log Segment에 대해 수행돼요.
이 과정에서 불필요한 데이터가 정리되면서 저장 공간을 절약할 수 있어요.
적절한 segment.bytes 설정: 너무 크면 디스크 사용량이 많아지고, 너무 작으면 파일이 많아져서 관리 비용이 증가해요.
Retention 설정 조정: 시스템에 필요한 데이터 보존 기간을 고려해서 retention.ms와 retention.bytes를 조정해야 해요.
Cleanup Policy 선택: Delete 정책과 Compact 정책 중 시스템 요구사항에 맞는 정책을 선택해야 해요.
log.roll.ms 조정: segment.ms와 log.roll.ms 설정이 적절하지 않으면 예상대로 Log Segment가 롤링되지 않을 수 있어요.
Kafka의 Log Segment는 데이터 저장과 관리의 핵심적인 역할을 해요.
Log Segment의 생성, Rolling, Retention, Compaction 등의 개념을 이해하면 Kafka의 데이터를 보다 효율적으로 관리할 수 있어요.
설정을 적절히 조정하면 성능과 유지보수성을 크게 향상시킬 수 있어요.
다음에는 cleanup.policy=compact의 compact topic을 알아볼게요.