세그먼트 보존
세그먼트 보존 (Segment Retention)
Apache Pinot 개념 가이드 중 하나로, 세그먼트 보존이 어떻게 동작하는지 배우는 페이지예요. 보존 매니저가 만료된 세그먼트와 교체된 세그먼트를 어떻게 정리하는지, 그리고 특별한 경우에는 어떻게 처리하는지 이해할 수 있어요.
본문
Pinot 테이블의 세그먼트는 보존 시간을 가지며, 그 시간이 지나면 세그먼트가 삭제돼요. 일반적으로 오프라인 테이블은 실시간 테이블보다 더 오랜 기간 세그먼트를 보존해요.
세그먼트 제거는 보존 매니저(retention manager)가 담당해요. 기본적으로 보존 매니저는 6시간마다 한 번 실행돼요.
보존 매니저는 두 가지 유형의 세그먼트를 제거해요:
- 만료된 세그먼트: 종료 시간이 보존 기간을 초과한 세그먼트.
- 교체된 세그먼트: merge rollup task의 일부로 교체된 세그먼트.
오프라인 테이블의 세그먼트가 제거되지 않는 몇 가지 시나리오가 있어요:
- 세그먼트에 종료 시간이 없는 경우. 이는 세그먼트에 시간 칼럼이 없을 때 발생해요.
- 세그먼트 테이블의
segmentIngestionType이REFRESH인 경우.
잘못된 종료 시간을 가진 세그먼트 처리 (Handling segments with invalid end times)
기본적으로 세그먼트의 종료 시간이 잘못되었거나 없으면 보존 매니저가 해당 세그먼트를 완전히 건너뛰므로, 보존 정책과 관계없이 세그먼트가 삭제되지 않아요. 이러한 세그먼트를 자동 정리하려면 클러스터 구성에서 controller.retentionManager.enableCreationTimeFallback을 true로 설정해 생성 시간 폴백(creation time fallback)을 활성화할 수 있어요. 활성화되면 보존 매니저가 종료 시간이 유효하지 않을 때 세그먼트의 생성 시간(segmentZKMetadata.getCreationTime())을 폴백으로 사용해요.
이 구성은 동적이며 적용하기 위해 controller 재시작이 필요 없어요. 클러스터 구성 변경 리스너를 통해 업데이트할 수 있어요.
보존 기간이 지정되지 않으면 세그먼트가 테이블에서 제거되지 않아요.
보존 매니저는 처음에 이러한 세그먼트를 Deleted Segments 영역으로 옮기고, 거기서 결국 영구적으로 제거돼요. 삭제된 세그먼트가 유지되는 기간은 controller.deleted.segments.retentionInDays 구성(기본: 7일)으로 제어돼요.
API를 통해 테이블을 삭제할 때 retention 쿼리 파라미터를 전달해 이 동작을 재정의할 수 있어요. 예를 들어 DELETE /tables/{tableName}?retention=0d는 삭제된 세그먼트 영역으로 이동하지 않고 모든 세그먼트를 즉시 삭제해요. 자세한 내용은 Controller API 예제를 참조하세요.