메타데이터 레코드 자동 정리
메타데이터 레코드 자동 정리 (Automated cleanup for metadata records)
드루이드(Druid)가 삭제된 엔티티와 관련된 메타데이터 저장소 레코드를 자동으로 제거해 성능을 유지하도록 설정하는 방법을 설명하는 문서예요. 엔티티별 정리 전략과 설정 프로퍼티를 다루어요.
출처: 문서
본문
Apache Druid는 데이터 저장, 운영, 시스템 설정에 관한 정보를 추적하기 위해 메타데이터 저장소에 의존해요. 메타데이터 저장소에는 다음이 포함돼요.
- 세그먼트 레코드
- 감사(audit) 레코드
- supervisor 레코드
- 규칙(rule) 레코드
- 컴팩션 구성 레코드
- supervisor가 생성한 데이터소스 레코드
- 인덱서 태스크 로그
- 인덱싱 상태(Indexing State) 레코드
Apache Druid에서 일부 엔티티를 삭제하면, 그 엔티티와 관련된 레코드가 메타데이터 저장소에 남을 수 있어요. 데이터소스 변경(churn)률이 높아(즉, 수명이 짧은 많은 데이터소스나 컴팩션 구성, 규칙 같은 관련 엔티티를 자주 만들고 삭제한다면) 남은 레코드가 메타데이터 저장소를 채워 성능 문제를 일으킬 수 있어요. 메타데이터 저장소 성능을 유지하기 위해 Apache Druid가 삭제된 엔티티와 관련된 레코드를 메타데이터 저장소에서 자동으로 제거하도록 구성할 수 있어요.
기본적으로 Druid는 90일보다 오래된 메타데이터를 자동으로 정리해요. 이는 이 문서의 모든 메타데이터 엔티티에 적용되며, 컴팩션 구성 레코드와 인덱서 태스크 로그는 예외로 기본적으로 정리가 비활성화되어 있어요. 사용 가능한 경우 각 메타데이터 타입의 보존 기간을 레코드의 durationToRetain 프로퍼티로 구성할 수 있어요. 일부 레코드는 정리가 발생하기 전에 추가 조건이 충족되어야 할 수 있어요.
특정 사용 사례에 맞게 자동 메타데이터 정리를 사용자 지정하는 방법은 예시를 참고하세요.
자동 정리 전략 (Automated cleanup strategies)
삭제된 데이터소스와 관련된 메타데이터의 자동 정리를 고려해야 하는 경우가 몇 가지 있어요.
- 변경률이 높은 데이터소스가 많다는 것을 아는 경우. 예를 들어 정기적으로 supervisor를 만들고 삭제하는 스크립트가 있는 경우예요.
- 메타데이터 데이터베이스의 하드 디스크가 가득 차는 문제가 있는 경우.
- 메타데이터 데이터베이스에서 성능 문제가 발생하는 경우. 예를 들어 API 호출이 매우 느리거나 실행에 실패하는 경우예요.
감사 레코드를 보존해야 하는 규정 준수 요구 사항이 있고 감사 레코드에 대한 자동 정리를 활성화한다면, 예를 들어 감사 메타데이터 레코드를 주기적으로 외부 저장소로 내보내는 등 대체 방법으로 감사 메타데이터를 보존하세요.
자동 메타데이터 정리 구성 (Configure automated metadata cleanup)
이 섹션에서 설명하는 것처럼 각 엔티티에 대해 정리를 개별적으로 구성할 수 있어요. 달리 명시되지 않으면 해당 프로퍼티를 coordinator/runtime.properties 파일에 정의하세요.
한 엔티티의 정리는 다음과 같이 다른 엔티티의 정리에 의존할 수 있어요.
- 규칙 레코드나 컴팩션 구성 레코드에 대한 자동 정리를 구성하기 전에 세그먼트 레코드용 kill 태스크를 구성해야 해요.
- 메타데이터 관리 태스크를 가장 빈번한 정리 작업과 같거나 더 높은 빈도로 실행하도록 예약해야 해요. 예를 들어 가장 빈번한 정리 작업이 매 시간이라면 메타데이터 저장소 관리 주기를 한 시간 이하로 설정하세요:
druid.coordinator.period.metadataStoreManagementPeriod=P1H.
설정 프로퍼티에 대한 자세한 내용은 메타데이터 관리(Configuration) 문서를 참고하세요. 세부 내용을 건너뛰고 싶다면 자동 메타데이터 정리 구성 예시를 참고하세요.
세그먼트 레코드와 딥 스토리지의 세그먼트 (kill 태스크) (Segment records and segments in deep storage (kill task))
info: kill 태스크는 이 문서에서 실제 딥 스토리지 데이터에 영향을 주는 유일한 설정이에요. 나머지는 단순히 메타데이터나 로그에만 영향을 줘요.
세그먼트 레코드와 딥 스토리지의 세그먼트는 다음 두 조건이 모두 충족될 때 삭제 대상이 돼요.
- Coordinator 동적 구성에 설정된
killDataSourceWhitelist에 따른 kill 태스크 데이터소스 구성의 자격 요건을 충족할 때. - 생성 이후
durationToRetain시간이 지났을 때.
Coordinator에서 사용되지 않는 세그먼트의 자동 kill을 구성하려면 Coordinator의 데이터 관리 문서를 참고하세요.
감사 레코드 (Audit records)
모든 감사 레코드는 생성 이후 durationToRetain 시간이 지나면 삭제 대상이 돼요.
감사 정리는 다음 설정을 사용해요.
druid.coordinator.kill.audit.on:true일 때 감사 레코드 정리를 활성화해요.druid.coordinator.kill.audit.period: 정리 작업이 삭제 대상 감사 레코드를 확인하고 삭제하는 빈도를 ISO 8601 형식으로 정의해요. 기본값은P1D예요.druid.coordinator.kill.audit.durationToRetain: 생성 후 감사 레코드가 삭제 대상이 되는 보존 기간을 ISO 8601 형식으로 정의해요.
supervisor 레코드 (Supervisor records)
supervisor 레코드는 supervisor가 종료되고 생성 이후 durationToRetain 시간이 지나면 삭제 대상이 돼요.
supervisor 정리는 다음 설정을 사용해요.
druid.coordinator.kill.supervisor.on:true일 때 supervisor 레코드 정리를 활성화해요.druid.coordinator.kill.supervisor.period: 정리 작업이 삭제 대상 supervisor 레코드를 확인하고 삭제하는 빈도를 ISO 8601 형식으로 정의해요. 기본값은P1D예요.druid.coordinator.kill.supervisor.durationToRetain: 생성 후 supervisor 레코드가 삭제 대상이 되는 보존 기간을 ISO 8601 형식으로 정의해요.
규칙 레코드 (Rules records)
규칙 레코드는 데이터소스의 모든 세그먼트가 kill 태스크에 의해 kill되고 생성 이후 durationToRetain 시간이 지나면 삭제 대상이 돼요. 규칙 자동 정리에는 kill 태스크가 필요해요.
규칙 정리는 다음 설정을 사용해요.
druid.coordinator.kill.rule.on:true일 때 규칙 레코드 정리를 활성화해요.druid.coordinator.kill.rule.period: 정리 작업이 삭제 대상 규칙 레코드를 확인하고 삭제하는 빈도를 ISO 8601 형식으로 정의해요. 기본값은P1D예요.druid.coordinator.kill.rule.durationToRetain: 생성 후 규칙 레코드가 삭제 대상이 되는 보존 기간을 ISO 8601 형식으로 정의해요.
컴팩션 구성 레코드 (Compaction configuration records)
Druid는 기본적으로 모든 컴팩션 구성 레코드를 보존하는데, 이는 대부분의 사용 사례에 적합해요. 수명이 짧은 데이터소스를 높은 빈도로 만들고 삭제하면서 그 데이터소스에 자동 컴팩션 구성을 설정한다면, 컴팩션 구성 레코드의 자동 정리를 켜는 것을 고려하세요.
info: 컴팩션 구성 레코드의 자동 정리를 사용할 때, 예를 들어 초기 인제스트가 아직 진행 중이라 데이터소스가 존재하기 전에 어떤 데이터소스에 컴팩션 구성을 만들면, Druid가 컴팩션 구성을 제거할 수 있어요. 구성이 조기에 제거되지 않도록 하려면 데이터소스에 컴팩션 구성을 적용하기 전에 데이터소스가 생성될 때까지 기다리세요.
다른 메타데이터 레코드와 달리 컴팩션 구성 레코드는 durationToRetain으로 설정된 보존 기간이 없어요. Druid는 사용되거나 사용되지 않는 세그먼트가 모두 없는 비활성 데이터소스에 대해 매 정리 주기마다 컴팩션 구성 레코드를 삭제해요.
druid_config 테이블의 컴팩션 구성 레코드는 데이터소스의 모든 세그먼트가 kill 태스크에 의해 kill된 후 삭제 대상이 돼요. 컴팩션 구성 자동 정리에는 kill 태스크가 필요해요.
컴팩션 구성 정리는 다음 설정을 사용해요.
druid.coordinator.kill.compaction.on:true일 때 컴팩션 구성 레코드 정리를 활성화해요.druid.coordinator.kill.compaction.period: 정리 작업이 삭제 대상 컴팩션 구성 레코드를 확인하고 삭제하는 빈도를 ISO 8601 형식으로 정의해요. 기본값은P1D예요.
info: 이미 매우 큰 컴팩션 구성이 있다면 감사 로그의 크기 제한 때문에 컴팩션 구성을 삭제하지 못할 수 있어요. 이 경우
druid.audit.manager.maxPayloadSizeBytes와druid.audit.manager.skipNullField를 설정해 감사 문제를 피할 수 있어요. 감사 로깅 문서를 참고하세요.
인덱싱 상태 레코드 (Indexing State Records)
info: 인덱싱 상태 레코드는 overlord가 정리해요. 따라서 이 섹션은
overlord/runtime.properties파일에 구성해야 해요.
info: 인덱싱 상태 레코드는 자동 컴팩션 supervisor를 사용하는 경우에만 생성돼요.
인덱싱 상태 레코드는 다음 시나리오에서 삭제 대상이 돼요.
- 레코드의
fingerprint와 같은indexing_state_fingerprint를 가진used세그먼트가 없을 때. - 레코드의
pending상태가true로 설정되어 있을 때.
인덱싱 상태 정리는 다음 설정을 사용해요.
druid.overlord.kill.indexingStates.on:true일 때 인덱싱 상태 레코드 정리를 활성화해요.druid.overlord.kill.indexingStates.period: 정리 작업이 삭제 대상 인덱싱 상태 레코드를 확인하고 삭제하는 빈도를 ISO 8601 형식으로 정의해요. 기본값은P1D예요.druid.overlord.kill.indexingStates.durationToRetain: 인덱싱 상태 레코드가used=false로 표시된 후 삭제 대상이 되는 보존 기간을 ISO 8601 형식으로 정의해요. 기본값은P7D예요.druid.overlord.kill.indexingStates.pendingDurationToRetain: pending 인덱싱 상태 레코드가 생성 후 삭제 대상이 되는 보존 기간을 ISO 8601 형식으로 정의해요. 기본값은P7D예요.- 이 값은 pending 레코드가 조기에 삭제되지 않도록 컴팩션 태스크의 최대 예상 지속 시간보다 크게 하는 것을 권장해요.
supervisor가 생성한 데이터소스 레코드 (Datasource records created by supervisors)
supervisor가 생성한 데이터소스 레코드는 supervisor가 종료되거나 druid_supervisors 테이블에 존재하지 않고, 생성 이후 durationToRetain 시간이 지나면 삭제 대상이 돼요.
데이터소스 정리는 다음 설정을 사용해요.
druid.coordinator.kill.datasource.on:true일 때 supervisor가 생성한 데이터소스 정리를 활성화해요.druid.coordinator.kill.datasource.period: 정리 작업이 삭제 대상 데이터소스 레코드를 확인하고 삭제하는 빈도를 ISO 8601 형식으로 정의해요. 기본값은P1D예요.druid.coordinator.kill.datasource.durationToRetain: 생성 후 데이터소스 레코드가 삭제 대상이 되는 보존 기간을 ISO 8601 형식으로 정의해요.
인덱서 태스크 로그 (Indexer task logs)
Overlord를 구성해 인덱서 태스크 로그와 관련 메타데이터를 주기적으로 삭제할 수 있어요. 정리 중에 Overlord는 다음을 제거해요.
- 딥 스토리지의 인덱서 태스크 로그.
- 메타데이터 저장소의 tasks 테이블(기본 이름
druid_tasks)의 인덱서 태스크 로그 메타데이터. (Metadata storage 문서 참고)
Overlord의 태스크 로그 정리를 구성하려면 overlord/runtime.properties 파일에 다음 프로퍼티를 설정하세요.
Overlord의 인덱서 태스크 로그 정리는 다음 설정을 사용해요.
druid.indexer.logs.kill.enabled:true일 때 태스크 로그 정리를 활성화해요.druid.indexer.logs.kill.durationToRetain: 태스크 로그를 보존할 시간(밀리초)을 정의해요.druid.indexer.logs.kill.initialDelay: Overlord가 시작된 후 태스크 로그 kill 작업을 처음 실행하기 전까지의 시간(밀리초)을 정의해요.druid.indexer.logs.kill.delay: 태스크 로그 kill 작업 사이의 시간(밀리초)이에요.
자세한 내용은 태스크 로깅 문서를 참고하세요.
자동 메타데이터 정리 비활성화 (Disable automated metadata cleanup)
Druid는 컴팩션 구성 레코드와 인덱서 태스크 로그를 제외한 메타데이터 레코드를 자동으로 정리해요. 자동 메타데이터 정리를 비활성화하려면 coordinator/runtime.properties 파일에 다음 프로퍼티를 설정하세요.
# Keep unused segments
druid.coordinator.kill.on=false
# Keep audit records
druid.coordinator.kill.audit.on=false
# Keep supervisor records
druid.coordinator.kill.supervisor.on=false
# Keep rules records
druid.coordinator.kill.rule.on=false
# Keep datasource records created by supervisors
druid.coordinator.kill.datasource.on=false
overlord/runtime.properties 파일에 다음 프로퍼티를 설정하세요.
# Keep indexing state records
druid.overlord.kill.indexingStates.on=false
자동 메타데이터 정리 구성 예시 (Example configuration for automated metadata cleanup)
하루에 수백 개의 데이터소스와 관련 엔티티를 만들고 삭제하는 스크립트가 있는 시나리오를 생각해 보아요. 남은 레코드로 메타데이터 저장소를 채우고 싶지 않아요. 데이터소스와 관련 엔티티는 보통 하루나 이틀만 지속돼요. 따라서 데이터를 복구하고 싶을 때를 대비해 7일의 버퍼 기간 후 최소 4일 된 남은 레코드를 식별·제거하는 정리 작업을 실행하려 해요. 예외는 감사 로그인데, 이는 30일 동안 보존해야 해요.
Coordinator 구성 (coordinator/runtime.properties):
...
# Schedule the metadata management store task for every hour:
druid.coordinator.period.metadataStoreManagementPeriod=PT1H
# Set a kill task to poll every day to delete segment records and segments
# in deep storage > 4 days old after a 7-day buffer period. When druid.coordinator.kill.on is set to true,
# you can set killDataSourceWhitelist in the dynamic configuration to limit
# the datasources that can be killed.
# Required also for automated cleanup of rules and compaction configuration.
druid.coordinator.kill.on=true
druid.coordinator.kill.period=P1D
druid.coordinator.kill.durationToRetain=P4D
druid.coordinator.kill.bufferPeriod=P7D
druid.coordinator.kill.maxSegments=1000
# Poll every day to delete audit records > 30 days old
druid.coordinator.kill.audit.on=true
druid.coordinator.kill.audit.period=P1D
druid.coordinator.kill.audit.durationToRetain=P30D
# Poll every day to delete supervisor records > 4 days old
druid.coordinator.kill.supervisor.on=true
druid.coordinator.kill.supervisor.period=P1D
druid.coordinator.kill.supervisor.durationToRetain=P4D
# Poll every day to delete rules records > 4 days old
druid.coordinator.kill.rule.on=true
druid.coordinator.kill.rule.period=P1D
druid.coordinator.kill.rule.durationToRetain=P4D
# Poll every day to delete compaction configuration records
druid.coordinator.kill.compaction.on=true
druid.coordinator.kill.compaction.period=P1D
# Poll every day to delete datasource records created by supervisors > 4 days old
druid.coordinator.kill.datasource.on=true
druid.coordinator.kill.datasource.period=P1D
druid.coordinator.kill.datasource.durationToRetain=P4D
...
Overlord 구성 - 자동 컴팩션 supervisor를 사용하는 경우 (overlord/runtime.properties):
...
# Poll every day to delete pending or unreferenced indexing state records > 4 days old
druid.overlord.kill.indexingStates.on=true
druid.overlord.kill.indexingStates.period=P1D
druid.overlord.kill.indexingStates.durationToRetain=P4D
druid.overlord.kill.indexingStates.pendingDurationToRetain=P4D
...
더 알아보기 (Learn more)
- 메타데이터 관리(Configuration) 문서에서 메타데이터 저장소 구성 참조를 확인해 보세요.
- 메타데이터 저장소(Design) 문서에서 메타데이터 저장소 데이터베이스 개요를 살펴보아요.