데이터 삭제

데이터 삭제 (Data deletion)

Apache Druid에서 데이터를 삭제하는 방법을 소개해요. 시간 범위 삭제, drop rule을 이용한 자동 삭제, 특정 레코드 삭제, 그리고 kill task를 이용한 영구 삭제까지, 목적에 맞는 삭제 방식을 골라 쓸 수 있어요.

출처: 문서

본문

시간 범위로 데이터 수동 삭제하기

Apache Druid는 데이터를 시간 청크(time chunk) 단위로 파티셔닝해 저장해요. 그리고 segment를 삭제하는 방식으로 특정 시간 청크의 데이터를 삭제할 수 있는데, 이는 메타데이터만 바꾸는 빠른 작업이에요.

시간 범위에 따른 삭제는 두 단계로 이루어져요:

  • 삭제할 segment는 먼저 "unused" 상태로 표시해야 해요. 이는 drop rule에 의해 segment가 drop될 때, 또는 Coordinator API나 웹 콘솔에서 수동으로 segment를 unused로 표시할 때 발생해요. 이것은 소프트 삭제(soft delete)라서 데이터는 조회할 수 없지만, segment 파일은 deep storage에 남아 있고 segment 레코드는 메타데이터 저장소에 남아 있어요.
  • segment가 "unused"로 표시되면, kill task를 사용해 deep storage에서 segment 파일을 영구히 삭제하고 메타데이터 저장소에서 레코드를 제거할 수 있어요. 이것은 하드 삭제(hard delete)라서 백업이 없다면 데이터를 복구할 수 없어요.

Coordinator API로 segment를 비활성화하는 방법에 대한 문서는 Legacy metadata API reference를 참고하세요.

데이터 삭제 튜토리얼은 Tutorial: Deleting data에서 확인할 수 있어요.

drop rules로 데이터 자동 삭제하기

Druid는 load 및 drop rules을 지원해요. 이 규칙으로 데이터를 보존할 시간 간격과 버릴 시간 간격을 정의할 수 있어요. drop rule에 해당하는 데이터는 수동으로 unused로 표시했을 때와 같은 방식으로 unused 처리되는데, 이는 빠른 메타데이터 전용 작업이에요.

이렇게 drop된 데이터는 unused로 표시되지만 deep storage에는 남아 있어요. 영구히 삭제하려면 kill task를 사용하세요.

특정 레코드 삭제하기

Druid는 reindexing과 필터를 조합해서 특정 레코드를 삭제할 수 있어요. 필터는 reindexing 후 남는 데이터를 지정하므로, 삭제하려는 데이터의 역(inverse)이 되어야 해요. 이런 방식으로 데이터를 삭제하려면 segment를 다시 써야 하기 때문에 시간이 오래 걸릴 수 있어요.

예를 들어 userName이 'bob'인 레코드를 native batch indexing으로 삭제하려면, filter가 {"type": "not", "field": {"type": "selector", "dimension": "userName", "value": "bob"}}인 transformSpec을 사용하세요.

같은 레코드를 SQL로 삭제하려면 WHERE userName <> 'bob' 조건과 함께 REPLACE를 사용하세요.

native batch로 reindex하려면 druid input source를 사용해요. 필요하다면 reindexing 작업 중 데이터를 필터링하거나 수정하도록 transformSpec을 쓸 수 있어요. SQL로 reindex하려면 SELECT ... FROM <table>과 함께 REPLACE <table> OVERWRITE를 사용하세요. (Druid에는 UPDATE나 ALTER TABLE 문이 없어요.) reindexing 작업 중 데이터를 필터링·수정·보강하려면 어떤 SQL SELECT 쿼리든 사용할 수 있어요.

이렇게 삭제된 데이터는 unused로 표시되지만 deep storage에는 남아 있어요. 영구히 삭제하려면 kill task를 사용하세요.

테이블 전체 삭제하기

테이블 전체를 삭제하는 것은 kill task를 사용한 영구 삭제와 같은 방식으로 동작해요. 먼저 Coordinator API나 웹 콘솔로 모든 segment를 unused로 표시하세요. 그다음, 원한다면 kill task로 영구 삭제하세요.

kill task로 데이터 영구 삭제하기

덮어쓰여지거나 소프트 삭제된 데이터는 여전히 unused로 표시된 segment로 남아 있어요. 이런 데이터는 kill task로 영구히 삭제할 수 있어요.

사용 가능한 문법은 다음과 같아요:

{
	"type": "kill",
	"id": <task_id>,
	"dataSource": <task_datasource>,
	"interval" : <all_unused_segments_in_this_interval_will_die!>,
	"versions" : <optional_list_of_segment_versions_to_delete_in_this_interval>,
	"context": <task_context>,
	"batchSize": <optional_batch_size>,
	"limit": <optional_maximum_number_of_segments_to_delete>,
	"maxUsedStatusLastUpdatedTime": <optional_maximum_timestamp_when_segments_were_marked_as_unused>
}

task payload에서 쓰는 일부 파라미터를 자세히 설명하면 다음과 같아요:

Parameter Default Explanation
versions null (all versions) kill task가 삭제할 지정 interval 내의 segment 버전 목록이에요. 기본 동작은 지정 interval의 모든 unused segment 버전을 삭제하는 거예요.
batchSize 100 한 번의 kill 배치에서 삭제하는 최대 segment 수예요. kill task가 진행되는 동안 동시성 제약(TaskLockbox등) 때문에 Overlord의 일부 연산이 멈출 수 있어요. 그래서kill` task는 삭제할 unused segment 목록을 더 작은 배치로 나눠서, 다른 task 연산에 Overlord 리소스를 intermittently 양보해요.
limit null (no limit) kill task가 삭제할 최대 segment 수예요.
maxUsedStatusLastUpdatedTime null (no cutoff) unused segment를 포함할 기준이 되는 최대 타임스탬프예요. kill task는 지정 interval에 속하면서 이 시간보다 늦지 않게 unused로 표시된 segment만 고려해요. 기본 동작은 표시 시점과 무관하게 interval의 모든 unused segment를 kill하는 거예요.

WARNING: kill task는 해당 segment에 대한 모든 정보를 메타데이터 저장소와 deep storage에서 영구히 제거해요. 이 작업은 되돌릴 수 없어요.

Coordinator duty로 데이터 자동 kill하기

지정 interval에 대해 데이터를 영구 삭제하려고 kill task를 매번 수동으로 제출하는 대신, Coordinator에서 unused segment의 자동 kill(auto-kill)을 활성화할 수 있어요.

Coordinator는 주기적으로 duty를 실행해서 kill 대상이 될 unused segment를 포함한 interval을 찾아내요. 그런 다음 각 interval에 대해 kill task를 실행해요.

Coordinator에서 unused segment 자동 kill을 구성하려면 Data management on the Coordinator를 참고하세요.

Overlord에서 데이터 자동 kill하기 (실험적 기능)

info

이 기능은 실험적 기능이라서 다음 조건에서만 쓸 수 있어요:

  • Overlord에서 segment metadata caching이 활성화되어 있어야 해요.
  • Coordinator에서 unused segment 자동 kill이 이미 활성화되어 있다면 사용하면 안 돼요.

이 실험적 기능은 Overlord 자체에서 "embedded" 모드로 kill task를 실행하는 거예요.

이 embedded task는 Coordinator가 수행하는 자동 kill보다 여러 장점이 있어요:

  • task나 Coordinator가 Overlord에 불필요한 REST API 호출을 많이 하는 것을 피해요.
  • unused segment가 eligible 상태가 되는 즉시 kill해요.
  • Overlord에서 실행되므로 task 슬롯을 차지하지 않아요.
  • task 프로세스를 시작하는 오버헤드를 아끼기 때문에 더 빨리 끝나요.
  • task마다 적은 수의 segment만 kill해서 한 interval의 lock이 너무 오래 잡히지 않도록 해요.
  • kill task의 head-of-line blocking을 피하기 위해 locked interval은 건너뛰어요.
  • 거의 설정이 필요 없어요.
  • 클러스터의 많은 unused segment를 따라잡을 수 있어요.
  • Overlord의 segment metadata cache를 활용해요.

Overlord에서 unused segment 자동 kill을 구성하려면 Auto-kill unused segments on the Overlord를 참고하세요.

embedded kill task가 내보내는 메트릭은 Auto-kill metrics에서 확인할 수 있어요.

더 알아보기 (Learn more)