규칙을 사용한 데이터 보존 및 삭제(Using rules to drop and retain data)
규칙을 사용한 데이터 보존 및 삭제(Using rules to drop and retain data)
데이터 보존 규칙(Data retention rules)을 사용하면 Apache Druid가 데이터 보존 정책에 맞게 동작하도록 구성할 수 있어요. 이 문서에서는 로드(load), 드롭(drop), 브로드캐스트(broadcast) 규칙의 종류와 각 규칙의 JSON 구조를 설명드릴게요.
출처: 문서
본문
데이터 보존 규칙을 사용하면 Apache Druid가 데이터 보존 정책에 맞게 동작하도록 구성할 수 있어요. 데이터 보존 정책은 클러스터에서 어떤 데이터를 보존하고 어떤 데이터를 삭제할지 지정합니다.
Druid는 로드(load), 드롭(drop), 브로드캐스트(broadcast) 규칙을 지원해요. 각 규칙은 JSON 객체입니다. 자세한 내용은 아래의 규칙 정의를 참고하세요. 모든 데이터소스에 적용할 기본 규칙 세트를 구성할 수도 있고, 특정 데이터소스에 대한 특정 규칙을 설정할 수도 있어요. 규칙 순서가 Coordinator가 보존 규칙을 적용하는 방식에 어떤 영향을 주는지는 규칙 구조(rule structure)를 참고하세요.
보존하거나 삭제할 데이터는 다음 방식으로 지정할 수 있어요:
- Forever: 세그먼트의 모든 데이터.
- Period: 현재 시점으로부터 오프셋으로 지정된 세그먼트 데이터.
- Interval: 고정된 시간 범위.
보존 규칙은 영구적이라서 변경할 때까지 계속 적용됩니다. Druid는 보존 규칙을 메타데이터 저장소에 저장해요.
보존 규칙 설정
Druid 웹 콘솔이나 Service status API reference를 사용해 보존 규칙을 만들고 관리할 수 있어요.
웹 콘솔 사용
Druid 웹 콘솔에서 보존 규칙을 설정하려면:
- 콘솔 홈 페이지에서 Datasources를 클릭하세요.
- 데이터소스 이름을 클릭해 데이터 창을 엽니다.
- Actions > Edit retention rules를 선택하세요.
- +New rule을 클릭하세요.
- 규칙 타입을 선택하고 규칙의 속성을 설정하세요.
- Next를 클릭하고 규칙에 대한 설명을 입력하세요.
- Save를 클릭해 규칙을 저장하고 데이터소스에 적용하세요.
Coordinator API 사용
모든 데이터소스에 대한 기본 보존 규칙을 하나 이상 설정하려면, 각 규칙에 대한 JSON 객체를 포함한 POST 요청을 /druid/coordinator/v1/rules/_default로 보내세요. 다음 예시 요청은 모든 데이터소스에 대한 기본 forever 브로드캐스트 규칙을 설정합니다:
curl --location --request POST 'http://localhost:8888/druid/coordinator/v1/rules/_default' \
--header 'Content-Type: application/json' \
--data-raw '[{
"type": "broadcastForever"
}]'
특정 데이터소스에 대한 보존 규칙을 하나 이상 설정하려면, 각 규칙에 대한 JSON 객체를 포함한 POST 요청을 /druid/coordinator/v1/rules/{datasourceName}으로 보내세요. 다음 예시 요청은 wikipedia 데이터소스에 period 드롭 규칙과 period 브로드캐스트 규칙을 설정합니다:
curl --location --request POST 'http://localhost:8888/druid/coordinator/v1/rules/wikipedia' \
--header 'Content-Type: application/json' \
--data-raw '[{
"type": "dropByPeriod",
"period": "P1M",
"includeFuture": true
},
{
"type": "broadcastByPeriod",
"period": "P1M",
"includeFuture": true
}]'
모든 데이터소스의 모든 규칙을 가져오려면 /druid/coordinator/v1/rules로 GET 요청을 보내세요. 예를 들면:
curl --location --request GET 'http://localhost:8888/druid/coordinator/v1/rules'
규칙 구조
규칙 API는 JSON 객체의 배열을 받아요. 각 규칙에 대해 API 요청에서 보내는 JSON 객체는 아래에 설명된 규칙 타입에 특화되어 있습니다. 각 API 요청마다 원하는 순서대로 전체 규칙 배열을 전달해야 해요. 규칙 API에 대한 각 POST 요청은 지정된 데이터소스의 기존 규칙을 덮어씁니다.
규칙의 순서는 매우 중요해요. Coordinator는 규칙 목록에 나타나는 순서대로 규칙을 읽습니다. 예를 들어 Coordinator는 데이터를 규칙 1, 규칙 2, 규칙 3 순서로 평가합니다. Coordinator는 모든 사용 중인 세그먼트를 순회하며 각 세그먼트를 첫 번째로 적용되는 규칙과 매칭합니다. 각 세그먼트는 단일 규칙과만 매칭될 수 있어요. 웹 콘솔에서는 인터페이스 오른쪽의 위/아래 화살표를 사용해 규칙 순서를 변경할 수 있어요.
로드 규칙
로드 규칙은 Druid가 세그먼트를 Historical 프로세스 티어에 어떻게 할당하고, 각 티어에 세그먼트 리플리카가 몇 개 존재하는지를 정의합니다. 단일 티어가 있다면 Druid가 자동으로 티어 이름을 _default로 지정해요. 추가 티어를 정의한다면, 그 티어에 어떤 세그먼트를 로드할지 지정하는 로드 규칙을 정의해야 합니다. 로드 규칙을 정의하기 전까지는 새 티어는 비어 있습니다.
모든 로드 규칙은 다음 속성을 가질 수 있어요:
| Property | Description | Required | Default value |
|---|---|---|---|
tieredReplicants |
티어 이름에서 해당 티어에 로드할 세그먼트 리플리카 수로의 매핑. 각 티어의 리플리카 수는 0 또는 양의 정수여야 합니다. | No | useDefaultTierForNull이 true일 때 기본값은 {"_default_tier": 2}, 즉 _default_tier에 2개의 리플리카를 로드합니다. useDefaultTierForNull이 false일 때 기본값은 {}, 즉 어떤 티어에도 로드할 리플리카가 없습니다. |
useDefaultTierForNull |
tieredReplicants가 지정되지 않거나 null로 설정될 때 그 기본값을 결정합니다. |
No | true |
아래에서 설명하는 특정 유형의 로드 규칙은 다른 속성도 가질 수 있어요.
로드 규칙은 딥 스토리지(deep storage)에서 데이터를 쿼리해서 얻는 자원 절약 효과를 활용하는 방법이기도 해요. 특정 세그먼트가 Historical 티어에 로드되지 않되 딥 스토리지에서 쿼리할 수 있도록 구성하는 한 가지 방법은, interval이나 period로 그 세그먼트들에 대해 tieredReplicants를 빈 배열로, useDefaultTierForNull을 false로 설정하는 것입니다.
Forever 로드 규칙
forever 로드 규칙은 모든 데이터소스 세그먼트를 지정된 티어에 할당합니다. Druid가 데이터소스에 적용하는 기본 규칙입니다. Forever 로드 규칙의 타입은 loadForever입니다. 다음 예시는 각 세그먼트의 리플리카 하나를 hot이라는 커스텀 티어에, 또 다른 단일 리플리카를 기본 티어에 배치합니다.
{
"type": "loadForever",
"tieredReplicants": {
"hot": 1,
"_default_tier": 1
}
}
다음 속성을 설정하세요:
tieredReplicants: 티어 이름에서 해당 티어의 세그먼트 리플리카 수로의 매핑.useDefaultTierForNull: 이 파라미터는tieredReplicants의 기본값을 결정하며 필드가 존재하지 않을 때만 효과가 있습니다.useDefaultTierForNull의 기본값은 true입니다.
Period 로드 규칙
period 로드 규칙을 사용해 특정 기간의 세그먼트 데이터를 티어에 할당할 수 있어요. Druid는 규칙에서 지정한 period와 세그먼트의 interval을 비교해 일치하는 데이터를 로드합니다. Period 로드 규칙의 타입은 loadByPeriod입니다. 다음 예시는 한 달 기간의 데이터 리플리카 하나를 hot이라는 커스텀 티어에, 또 다른 단일 리플리카를 기본 티어에 배치합니다.
{
"type": "loadByPeriod",
"period": "P1M",
"includeFuture": true,
"tieredReplicants": {
"hot": 1,
"_default_tier": 1
}
}
다음 속성을 설정하세요:
period: ISO 8601 기간을 나타내는 JSON 객체. 기간은 과거의 어떤 시점부터 현재까지, 또는includeFuture가true로 설정되면 미래까지입니다.includeFuture: 세그먼트를 매칭하라고 Druid에 지시하는 boolean 플래그입니다:
세그먼트 interval이 규칙 interval과 겹치면, 또는 세그먼트 interval이 규칙 interval 시작 이후의 어떤 시점에 시작하면 매칭됩니다.
이 속성을 사용해 미래의 시작/종료 날짜가 있는 세그먼트를 로드할 수 있는데, 여기서 "미래"는 Coordinator가 데이터를 규칙과 비교해 평가하는 시점 기준입니다. 기본값은 true입니다.
tieredReplicants: 티어 이름에서 해당 티어의 세그먼트 리플리카 수로의 매핑.useDefaultTierForNull: 이 파라미터는tieredReplicants의 기본값을 결정하며 필드가 존재하지 않을 때만 효과가 있습니다.useDefaultTierForNull의 기본값은 true입니다.
Interval 로드 규칙
interval 규칙을 사용해 특정 범위의 데이터를 티어에 할당할 수 있어요. 예를 들어 분석가들은 보통 지난 한 주 전체의 완전한 데이터 세트를 다루고, 이번 주 데이터는 그렇게 많이 다루지 않을 수 있어요.
Interval 로드 규칙의 타입은 loadByInterval입니다. 다음 예시는 지정된 interval과 일치하는 데이터의 리플리카 하나를 hot이라는 커스텀 티어에, 또 다른 단일 리플리카를 기본 티어에 배치합니다.
{
"type": "loadByInterval",
"interval": "2012-01-01/2013-01-01",
"tieredReplicants": {
"hot": 1,
"_default_tier": 1
}
}
interval: 문자열로 인코딩된 ISO 8601 범위로 지정되는 로드 interval.
드롭 규칙
드롭 규칙은 Druid가 언제 클러스터에서 세그먼트를 삭제하는지 정의해요. Druid는 삭제된 데이터를 딥 스토리지에 보관합니다. 참고로 사용하지 않는 세그먼트의 자동 정리(automatic cleanup)를 활성화하거나 kill 태스크를 실행하면 Druid가 딥 스토리지에서 데이터를 삭제합니다. 데이터 삭제에 대한 자세한 내용은 Data deletion 문서를 참고하세요.
로드 규칙을 사용해 정의된 기간의 데이터만 보존하려면 드롭 규칙도 함께 정의해야 합니다. 드롭 규칙을 정의하지 않으면 Druid는 기본 규칙인 loadForever에 따라 정의된 기간 밖의 데이터를 보존해요.
Forever 드롭 규칙
forever 드롭 규칙은 클러스터에서 모든 세그먼트 데이터를 삭제합니다. forever 드롭 규칙을 마지막 규칙으로 하는 규칙 세트를 구성하면, Druid는 더 높은 우선순위 규칙을 평가한 뒤 남은 세그먼트 데이터를 모두 삭제해요. Forever 드롭 규칙의 타입은 dropForever입니다:
{
"type": "dropForever"
}
Period 드롭 규칙
Druid는 규칙에서 지정한 period와 세그먼트의 interval을 비교해 일치하는 데이터를 삭제합니다. period가 세그먼트 interval을 포함하면 규칙이 매칭됩니다. 이 규칙은 항상 최근 데이터를 삭제해요. Period 드롭 규칙의 타입은 dropByPeriod이고 JSON 구조는 다음과 같습니다:
{
"type": "dropByPeriod",
"period": "P1M",
"includeFuture": true
}
period: ISO 8601 기간을 나타내는 JSON 객체. 기간은includeFuture플래그에 따라 과거의 어떤 시점부터 미래 또는 현재 시점까지입니다.includeFuture: 다음 조건 중 하나가 적용되면 세그먼트를 매칭하라고 Druid에 지시하는 boolean 플래그입니다:
세그먼트 interval이 규칙 interval과 겹치거나 세그먼트 interval이 규칙 interval 시작 이후의 어떤 시점에 시작하는 경우.
이 속성을 사용해 미래의 시작/종료 날짜가 있는 세그먼트를 삭제할 수 있는데, 여기서 "미래"는 Coordinator가 데이터를 규칙과 비교해 평가하는 시점 기준입니다. 기본값은 true입니다.
Period 드롭 이전(Period drop before) 규칙
Druid는 규칙에서 지정한 period와 세그먼트의 interval을 비교해 일치하는 데이터를 삭제합니다. 세그먼트 interval이 지정된 period 이전이면 규칙이 매칭됩니다. 최근 데이터만 보존하고 싶다면, 이 규칙을 사용해 지정된 period 이전의 오래된 데이터를 삭제하고, 그 뒤에 따라오는 데이터를 보존하기 위해 loadForever 규칙을 추가하면 돼요. 참고로 dropBeforeByPeriod + loadForever 규칙 조합은 loadByPeriod(includeFuture = true) + dropForever와 동등합니다.
Period 드롭 규칙의 타입은 dropBeforeByPeriod이고 JSON 구조는 다음과 같습니다:
{
"type": "dropBeforeByPeriod",
"period": "P1M"
}
period: ISO 8601 기간을 나타내는 JSON 객체.
Interval 드롭 규칙
드롭 interval 규칙을 사용해 지정된 범위의 데이터가 어떤 티어에도 로드되지 않게 할 수 있어요. 그 범위는 보통 가장 오래된 데이터입니다. 삭제된 데이터는 딥 스토리지에 있으며 딥 스토리지에서 여전히 쿼리할 수 있어요. Interval 드롭 규칙의 타입은 dropByInterval이고 JSON 구조는 다음과 같습니다:
{
"type": "dropByInterval",
"interval": "2012-01-01/2013-01-01"
}
interval: 문자열로 인코딩된 ISO 8601 범위로 지정되는 드롭 interval.
브로드캐스트 규칙
Druid 확장은 브로드캐스트 규칙을 사용해 세그먼트 데이터를 클러스터의 모든 Broker에 로드합니다. 브로드캐스트 규칙은 프로덕션 환경이 아니라 테스트 환경에서 적용하세요. 브로드캐스트 규칙을 사용하려면 druid.segmentCache.locations가 Broker와 Historical 모두에 구성되어 있는지 확인하세요. 그래야 Druid가 그 서버들에 세그먼트를 로드할 수 있어요. 자세한 내용은 Segment cache size 문서를 참고하세요.
Forever 브로드캐스트 규칙
forever 브로드캐스트 규칙은 데이터소스의 모든 세그먼트 데이터를 클러스터의 모든 Broker에 로드합니다. Forever 브로드캐스트 규칙의 타입은 broadcastForever입니다:
{
"type": "broadcastForever"
}
Period 브로드캐스트 규칙
Druid는 규칙에서 지정한 period와 세그먼트의 interval을 비교해 일치하는 데이터를 클러스터의 Broker에 로드합니다. Period 브로드캐스트 규칙의 타입은 broadcastByPeriod이고 JSON 구조는 다음과 같습니다:
{
"type": "broadcastByPeriod",
"period": "P1M",
"includeFuture": true
}
includeFuture: 다음 조건 중 하나가 적용되면 세그먼트를 매칭하라고 Druid에 지시하는 boolean 플래그입니다:
세그먼트 interval이 규칙 interval과 겹치거나 세그먼트 interval이 규칙 interval 시작 이후의 어떤 시점에 시작하는 경우.
이 속성을 사용해 미래의 시작/종료 날짜가 있는 세그먼트를 브로드캐스트할 수 있는데, 여기서 "미래"는 Coordinator가 데이터를 규칙과 비교해 평가하는 시점 기준입니다. 기본값은 true입니다.
Interval 브로드캐스트 규칙
interval 브로드캐스트 규칙은 특정 범위의 데이터를 클러스터의 Broker에 로드합니다. Interval 브로드캐스트 규칙의 타입은 broadcastByInterval이고 JSON 구조는 다음과 같습니다:
{
"type": "broadcastByInterval",
"interval": "2012-01-01/2013-01-01"
}
interval: 문자열로 인코딩된 ISO 8601 범위로 지정되는 브로드캐스트 interval.
데이터 영구 삭제
Druid는 unused로 표시된 세그먼트에 대해 클러스터에서 데이터를 완전히 삭제하고, 메타데이터 저장소 항목을 지우며, 딥 스토리지에서 데이터를 제거할 수 있어요. 참고로 Druid는 규칙에 의해 클러스터에서 삭제된 세그먼트를 항상 unused로 표시합니다. 이를 위해 Overlord에 kill 태스크를 제출할 수 있어요.
삭제된 데이터 다시 로드
단일 규칙을 사용해 Druid가 클러스터에서 삭제한 데이터를 다시 로드할 수는 없어요. 삭제된 데이터를 다시 로드하려면:
- 보존 기간을 설정하세요. 예를 들어 보존 기간을 한 달에서 두 달로 변경하세요.
- 웹 콘솔이나 API를 사용해 데이터소스에 속한 모든 세그먼트를
used로 표시하세요. - 그러면 Druid가 Coordinator 규칙을 다시 실행하고 누락된 모든 세그먼트를 로드하도록 유도됩니다. Coordinator는 세그먼트의 최신 버전을 식별하고 이전 버전을 삭제합니다.
더 알아보기 (Learn more)
Druid에서 보존 규칙을 사용하는 방법에 대한 자세한 내용은 다음 주제들을 참고하세요:
- Tutorial: Configuring data retention
- Configure Druid for mixed workloads
- Router process