Partitions and Segments in Kafka Logs
카프카 로그의 파티션과 세그먼트
- 카프카 로그는 실제로는 segment로 저장됨
- 파티션은 단순히 파일 디렉토리로만 되어 있고, 해당 파티션 디렉토리에 메시지 저장 segment를 file로 가지고 있음
- 파티션은 여러 segment로 구성되며 개별 segment는 용량이 차거나 일정 기간 경과 시 close되고 새로운 segment 생성
- segment가 close되면 더 이상 write 불가하고 read-only 됨
- broker는 여러 개의 segment 중 하나의 active segment에만 write/read 수행
- 하나의 파티션은 단 하나의 active segment 가짐

Segment 저장 및 roll 관련 설정
log.segment.bytes
- 개별 segment 최대 크기 (default 1GB)
- topic config는
segment.bytes이고 기본 값은log.segment.bytes설정을 따름
log.roll.hours(ms)
- 개별 segment가 유지되는 최대 시간 (default 7일)
- 지정된 시간 넘기면 close됨
- log.segment.bytes 만큼 차지 않아도 log.roll.ms 만큼의 시간이 지나면 해당 segment를 close함
- topic config는
segment.ms이며, 기본 값은log.roll.hours설정을 따름
kafka-configs --bootstrap-server localhost:9092 --entity-type topics --entity-name 토픽명 --alter --add-config segment.bytes=1024
# 원복
kafka-configs --bootstrap-server localhost:9092 --entity-type topics --entity-name 토픽명 --alter --delete-config segment.bytes
kafka-configs --bootstrap-server localhost:9092 --entity-type topics --entity-name 토픽명 --alter --add-config segment.ms=60000
# 원복
kafka-configs --bootstrap-server localhost:9092 --entity-type topics --entity-name 토픽명 --alter --delete-config segment.ms
kafka-configs --bootstrap-server localhost:9092 --entity-type topics --entity-name 토픽명 --describe
파티션 디렉토리 내의 Segment와 Index 파일 구성
- topic을 생성하면 파티션 디렉토리내에 메시지 내용이 있는 segment, offset의 위치에 대한 byte 정보를 가지는 index 파일, record 생성 시간에 따른 위치 byte 정보를 가지는 timeindex 파일로 구성됨
메시지 로그 Segment와 Index, TimeIndex
- index 파일은 offset 별로 byte position 정보를 가지고 있음
- segment는 file 기반이므로 데이터를 읽기 위해서는 시작 pointer에서 얼마만큼의 byte에 위치해 있는지 알아야 함
- index 파일은 모든 offset에 대한 byte position을 가지고 있지 않으며,
log.index.interval.bytes에 설정된 bytes가 만들어 질 때마다 해당 offset에 대한 byte position 정보를 기록함 - timeindex 파일은 메시지의 생성 unix 시간을 밀리 세컨드 단위로 가지고 있고 해당 생성 시간에 해당하는 offset을 가짐

Segment 파일의 Rolling

- segment 파일 명은 segment 별로 시작 offset 기반
- segment 파일은
active -> closed -> deleted or compacted단계로 관리 - log cleanup 정책에 따라 특정 시간 또는 파일 크기에 따라 삭제되거나 compact 형태로 저장됨