DevBoi

[Kafka] 세그먼트와 삭제 주기 본문

Develop/[Kafka]

[Kafka] 세그먼트와 삭제 주기

HiSmith 2023. 7. 20. 00:54
반응형

cleanup.policy로 해당 삭제 주기를 정할수 있다.

delete를 하게되면, 기본값 7일이 지나면 삭제된다 (액티브 세그먼트 제외)
retention.bytes로 하게되면, 해당 세그먼트의 크기에 따라 삭제 여부를 결정한다.

만료된 세그먼트의 크기를 보고 결정한다.

 

이 삭제에 대한 작업은 브로커가 한다.

log.retention.check.interval.ms에 설정한 값에 따라, 세그먼트가 삭제 영역에 들어왔는지 확인 한다.

기본값은 5분이다. 스케줄링이라고 생각하면 된다.

 

retention.ms 는 기간으로 삭제를 체크하기 때문에, 기간 동안 쌓이는 용량에 따라 디스크의 용량의 문제가 발생할 수있다.

따라서, 앵간하면 크기로 판단하는 것이 중요하다.

 

retention.ms 에서 보유할 최대기간은 기본적으로 3일로 지정한다고한다.

 

카프카에서 데이터는 세그먼트 단위로 삭제가 발생하기 때문에 로그단위로는 개별 삭제가 불가능하다.

 

특정 레코드만 삭제하는 것은 불가능하다.

세그먼트에 대한 전체 삭제가 이루어져야한다.

또한 개별 수정이 불가능 하다. 왜냐면 레코드 메시지 키, 메시지 값, 오프셋,헤더 등 이미 적재된 데이터에 대해서 수정이 불가능하다.

따라서, 프로듀서에서 토픽으로 보낼때, 레코드를 보낼때는 검증하는 구문을 포함해야 좋다.

그래야 잘못된 데이터가 들어가지 않기떄문에...

 

cleanup.policy = compact delete와 다른 것도 있다.

딜리트는 액티브가 아닌 것들에 대한 일괄 삭제가 이루어지는데, 컴팩트로 할때는 key의 기준으로 가장 최근에 쌓인 데이터를 제외한 모든 데이터들이 삭제된다. 아래의 그림을 보자

 

compact으로 클린업을 하게 되면, key기준으로, k3 16번은 가장 최신이므로 남고, 나머지는 삭제가 된다.

즉, Key기준으로 최근 것만 빼고 삭제가 된다. 물론, 액티브 세그먼트는 삭제 대상에서 제외된다.

 

컴팩트인 경우는 위와 같은 영역으로 나뉜다.

압축이 안료가되면, 테일 영역이고 아직 컴팩트하게 클린업하지 않은 대상은 헤드 영역이다.

 

 

이미 한번 클린업한 영역을 클린 레코드, 하지않은 것을 더티 레코드라고 한다.

이렇게 됬을떄, min.cleanable.dirty.ratio의 설정값 기준으로, 더티 레코드의 특정 기준이 넘어가면

클린없 과정을 진행하게 된다.

 

즉 데이터 압축 시작 시점은 Min.cleanable.dirty.ratio 옵션값을 따른다.

min.cleanable.dirty.ratio 옵션값은 액티브 세그먼트를 제외한 세그먼트에 남아있는 테일영역의 레코드 개수와 헤드영역의 레코드 개수의 비율을 뜻한다. 0.5로 설정하면, 테일영역의 레코드개수가 헤드영역의 레코드 개수가 동일할 경우 앞축이 실행된다.

 

0.9로 크게 하면, 90%더 차지하면, 클린업 작업을 하게 된다.

하지만 용량이 그만큼 찰떄까지 기다리기 떄문에, 저장공간 효율이 좋지않다.

반면에 너무 낮추면 너무 빈번하게 발생하므로, 브로커에 부담이 된다.

반응형

'Develop > [Kafka]' 카테고리의 다른 글

[Kafka] ISR (In-Sync-Replicas)  (0) 2023.07.21
[Kafka] Replica  (0) 2023.07.20
[Kafka] 브로커의 역할  (0) 2023.07.20
[Kafka] Broker의 역할  (0) 2023.07.18
[Kafka]주키퍼 앙상블  (0) 2023.07.18