토픽 정리 정책(cleanup.policy)
토픽의 데이터는 시간 또는 용량에 따라 삭제 규칙을 적용할 수 있다. 또한 삭제를 원치 않는다면 카프카 클러스터가 살아있는한 토픽의 데이터를 삭제하지 않도록 설정할 수 있다.
데이터가 삭제되지 않고 남아있으면 추후에 데이터가 필요할때 오프셋을 지정해서 일주일, 한달 이상 지난 데이터를 다시 가져올 수 있다.
데이터를 더는 사용하지 않을 경우에는 cleanup.policy 옵션을 사용해서 데이터를 삭제할 수 있다.
옵션은 2가지다.
1) delete : 데이터의 완전 삭제
2) compact : 동일한 메시지 키의 가장 오래된 데이터를 삭제
토픽 삭제 정책(delete policy)
토픽을 운영하면 일반적으로 대부분의 토픽의 cleanup.policy를 delete로 설정한다. 이 옵션은 명시적으로 토픽의 데이터를 삭제하는 것을 뜻한다. 토픽의 삭제는 세그먼트 단위로 삭제를 진행한다.
- 세그먼트 : 토픽의 데이터를 저장하는 명시적인 파일 시스템 단위
세그먼트는 여러 단위로 나뉘는데, segment.bytes 옵션으로 1개의 세그먼트 크기 지정이 가능하다. segment.bytes 크기보다 커질 경우 기존에 적재하던 세그먼트 파일을 닫고 새로운 세그먼트를 열어서 데이터를 저장한다.
데이터를 저장하기 위해 사용중인 세그먼트를 액티브 세그먼트라고 한다.
삭제 정책이 실행되는 시점은 시간 또는 용량이 기준이 된다. retention.ms는 토픽의 데이터를 유지하는 기간을 밀리초(millisecond)로 설정할 수 있다.
카프카는 일정 주기마다 세그먼트 파일의 마지막 수정 시간과 retention.ms를 비교하는데, 세그먼트 파일의 마지막 수정 시간이 retention.ms를 넘어가면 세그먼트 삭제된다. retention.bytes는 토픽의 최대 데이터 크기를 제어한다. retention.bytes를 넘어간 세그먼트 파일들은 삭제된다. 삭제된 데이터는 복구할 수 없으니 유의해야한다.
토픽 압축 정책(compact policy)
압축
메시지 키별로 해당 메시지 키의 레코드 중 오래된 데이터를 삭제하는 정책
메시지 키를 기준으로 오래된 데이터를 삭제하기 때문에 삭제 정책과 다르게 1개 파티션에서 오프셋의 증가가 일정하지 않을 수 있다. 즉 1부터 10까지 오프셋이 있고, 4, 5, 6이 동일한 메시지 키를 가질 경우 오프셋과 관계없이 중간에 있는 4, 5번 오프셋의 레코드가 삭제될 수 있다. 6번에 비해 4, 5번 오프셋의 레코드가 오래된 데이터이기 때문이다.
토픽 압축 정책은 메시지 키를 기반으로 데이터를 처리할 경우 유용하다. 데이터의 흐름이 아닌 가장 마지막으로 업데이트된 메시지 키의 데이터가 중요할 경우 가장 최신의 데이터를 제외한 나머지 데이터들을 삭제할 수 있기 때문이다.
압축 정책은 액티브 세그먼트를 제외한 나머지 세그먼트들에 한해서만 데이터를 처리한다. 데이터의 압축 시작 시점은 min.cleanable.dirty.ratio 옵션값을 따른다.
- min.cleanable.dirty.ratio 옵션값
액티브 세그먼트를 제외한 세그먼트에 남아있는 데이터의 테일(tail) 영역의 레코드 개수와 헤드(head) 영역의 레코드 개수의 비율을 뜻한다.
- 테일 영역
브로커의 압축 정책에 의해 압축이 완료된 레코드들
압축이 완료됬기 때문에 테일 영역에는 중복된 키가 없다.
- 클린(clean) 로그
테일 영역의 레코드들
- 더티(dirty) 로그
헤드 영역의 레코드들
압축이 되기전 레코드들이 있으므로 중복된 메시지 키를 가진 레코드들이 있다.
- 더티 비율(dirty ratio)
더티 영역의 메시지 개수를 압축 대상 세그먼트에 남아있는 데이터의 총 레코드 수로 나눈 비율
레코드 수 = (더티 영역 메시지 개수 + 클린 영역 메시지 개수)
만약 클린 영역에 3개의 레코드가 있고, 더티 영역에 레코드가 3개 있을 경우
더티 비율 : 3 (더티 영역의 메시지 개수) / 6 (총 레코드 수) = 0.5
토픽의 압축은 min.cleanable.dirty.ratio 값에 따라 수행된다.
만약 min.cleanable.dirty.ratio 옵션값을 0.5로 설정한 경우에 더티 비율이 0.5가 넘어가면 압축이 수행된다. min.cleanable.dirty.ratio 값을 크게 설정하면 그 용량을 차지할 때까지 용량 효율이 좋지 않다.
작게 설정하면 압축이 더 자주 발생하여, 계속해서 메시지 키의 최신 데이터만 유지할 수 있지만 압축이 자주 발생하는 만큼 브로커에 부담을 줄 수 있다. 그러므로 토픽 별로 특성에 맞는 적절한 min.cleanable.dirty.ratio 값을 설정해야한다.
'Coding > Apache Kafka' 카테고리의 다른 글
[아파치 카프카 어플리케이션 프로그래밍] 16. 카프카 프로듀서 - acks 옵션 (0) | 2022.05.29 |
---|---|
[아파치 카프카 어플리케이션 프로그래밍] 15. ISR(In-Sync-Replicas) (0) | 2022.05.28 |
[아파치 카프카 어플리케이션 프로그래밍] 13. 토픽과 파티션 (0) | 2022.05.26 |
[아파치 카프카 어플리케이션 프로그래밍] 12. 카프카에서 제공하는 AdminClient 사용하여 정보 조회하기 (0) | 2022.05.24 |
[아파치 카프카 어플리케이션 프로그래밍] 11. 컨슈머 토픽, 파티션 명시적 선언과 정상 종료 처리 실습 (0) | 2022.05.23 |