kafka 메시지 삭제 정책
개요
kafak를 운영하면 메시지를 언제까지 보관해야 할까요?
kafka의 cleanup policy, retention policy, delete policy, compact policy 등에 대해 알아보고자 합니다.
Kafka의 데이터는 어떻게 저장될까?
kafka는 파티션에 데이터를 저장합니다.
카프카를 설정하면 파티션이 저장될 디렉토리의 위치를 log.dirs 매개변수에 지정할 수 있습니다.
Kafka는 다른 메시징 시스템과 달리 토픽의 메시지가 소비된 후 즉시 삭제하지 않습니다.
대신 각 토픽의 구성에 따라 허용되는 공간과 관리 방식이 결정됩니다.
Kafka의 구조는 Cluster -> Broker -> Topic -> Partition -> Segment
Segment의 구조
특정 오프셋이나 설정된 byte가 넘어가면 새로운 segment가 생성되어 메시지가 관리된다!
Cleanup Policyes
default cleanup policy는 delete입니다.
시간 기반, 크기 기반으로 오래된 세그먼트를 삭제합니다.
compact policy
토픽에 대한 로그 압축을 수행합니다.
key별로 가장 최근의 value만 저장합니다.
K1에 대한 값인 V1을 정리하고 V4로 유지되는 모습을 볼 수 있습니다.
시간 기반 보유
Segments에 대해 retention time에 도달하면 정의된 정책에 따라 segments가 삭제 또는 압축 대상으로 표시됩니다.
기본 보존 기간은 7일이며 retention.hours, minutes, ms 등으로 런타임에서 값을 수정할 수 있습니다.
크기 기반 보유
토픽 파티션에 대한 로그 데이터 구조의 최대 크기를 설정할 수 있습니다.
로그의 크기가 설정에 도달한다면 마지막부터 세그먼트를 제거하기 시작합니다.
메시지 삭제에 대한 가시성을 제공하지 않기 때문에 널리 사용되지는 않지만 디스크 공간이 제한되는 상황에서는 유용할 수 있습니다.
하지만 세그먼트가 하나밖에 없는 경우에는 정상적으로 삭제되지 않을 수 있습니다.
Segment 테스트
- log.retention.bytes는 1MB로 설정
- log.segment.bytes는 1GB로 설정
설정된 용량인 1MB를 넘어도 logs.dir 용량이 계속 증가한다.
- log.segment.bytes 설정을 512KB로 설정하면 log 파일이 분리되고 생성된 segment들이 1MB에 도달하면 가장 오래된 segment가 delete 된다
참고자료
https://medium.com/@sunny_81705/kafka-log-retention-and-cleanup-policies-c8d9cb7e09f8