개발

[Kafka] retention.ms 가 지난 message 가 읽히는 이유

hojak99 2023. 9. 13. 22:31

배경

kafka 에 특정 토픽에서 메세지를 찾는 중 retention 기간이 지난 메세지가 존재하는 것을 확인했다.
토픽 리텐션 기간을 확인 시 retention.ms=604800000 를 확인할 수 있었는데 해당 ms -> day 로 변환 시 7일이다. 그러나 09-11 에 조회 시 08-29 메세지가 조회되어서 관련해서 검색하게 되었다.

수행 명령어

./kafka-topics --bootstrap-server ... --describe --topic ....

수행 결과

- segment.ms = 604800000 (7일)
- delete.retention.ms = 86400000 (1일)
- segment.bytes = 1073741824 (1GB)
- retention.ms = 604800000 (7일)
- file.delete.delay.ms = 60000 (1분)
- retention.bytes = -1 (무제한)
- 만약, 파티션이 8개고 retention.bytes = 1GB 일 때 보존되는 데이터의 사이즈는 최대 8GB 이다.
- 출처: https://stackoverflow.com/questions/65507232/kafka-log-segment-bytes-vs-log-retention-hours
- segment.index.bytes =  (10MB)

검색 결과

Segment 란
- kafka 메시지는 topic안에 partition별로 로그를 쓰게 되는데, 로그를 직접적으로 써지고 보관하는 단위가 segment이다.
- topic 아래에 파티션들이 존재하고 파티션 아래에 segment들이 존재한다.
- 활성 segment는 하나이다.
- Topic 별로 관리되는 디렉터리 아래에 파티션 폴더가 존재하고 그 안에. log,. index 파일들이 존재하게 된다.

delete.retention.ms VS retention.ms

delete.retention.ms

log.cleaner.delete.retention.ms는 cleanup policy 가 "compact"인 토픽에 적용된다. 로그 압축된 토픽에 대한 삭제된 tombstone marker 를 보존하는 시간이다. 
key 와 null 페이로드가 있는 메시지를 tombstone message 라고 한다. 이러한 메시지는 로그 압축 중에 제거된다.

retention.ms

log.retention.ms는 cleanup policy 가 "delete"인 항목에 적용된다. 로그 파일을 삭제하기 전에 로그 파일을 보관하는 시간을 제어한다.

_그러나 배경에서 얘기한 topic 은 cleanup policy = delete 이기 때문에 retention.ms 가 적용된다._

출처: https://stackoverflow.com/questions/53411956/what-is-the-difference-between-log-cleaner-delete-retention-ms-and-log-retention

삭제되는 기준

위에서 이야기를 하였듯이 topic 내 파티션에는 각 메세지들이 segment 단위로 관리된다. 
아래 설정 값은 segment 의 크기와, segment 가 존재하는 시간을 의미한다.
- segment.bytes = 1GB
- segment.ms = 7일

_1개의 segment 는 1GB 까지만 메세지를 보존하거나, 7일동안만 보존된다. 둘 중 하나라도 적용되면 segment 는 닫히고 새로운 segment 가 생성된다._

----

_retention.ms 와 retention.bytes 는 닫힌 segment 에만 적용된다._ 활성화 되어있는 segment 에는 적용되지 않는다. 
- retention.ms = 7일
- retention.bytes = 무제한

segment.bytes, segment.ms 로 인해서 닫힌 segment 에 대해 retention.ms = 7일이기에 하나의 segment 에 1GB 이하로 메세지가 적게 쌓이는 topic 일 때 segment.ms(7일) + retention.ms(7일) = 14일동안 메세지가 남게 될 수 있다. 

참고 링크

https://kafka.apache.org/documentation/#configuration
https://stackoverflow.com/questions/65507232/kafka-log-segment-bytes-vs-log-retention-hours

반응형