본문 바로가기
데이터 엔지니어링

Druid segment retention rules | 세그먼트 보존 규칙

by 내기록 2023. 3. 26.
반응형

Using rules to drop and retain data

데이터 보존 정책은 어떤 데이터를 보존하고 어떤 데이터를 클러스터에서 삭제할지 지정합니다.
-> Coordinator는 rules를 사용해서 히스토리컬에 어떤 세그먼트를 load/drop 할지 결정

 

코디네이터는 메타데이터 스토리지에서 set of rules를 로드합니다. 규칙(role)은 특정 데이터 소스에 한정해서 적용할 수도 있고, 기본 설정으로 구성할 수도 있습니다. 규칙은 순서대로 읽히므로 순서가 중요합니다. 코디네이터는 사용 가능한 모든 세그먼트를 순환하며 각 세그먼트를 가장 먼저 적용되는 규칙과 매핑합니다. 각 세그먼트는 하나의 규칙만 가질 수 있습니다.

 

크게 3개(load, drop, broadcase)의 룰이 있습니다.

 

Retention rule은 영속적이어서 다시 수정하기 전까지 유지됩니다. Druid는 retention rule을 메타데이터 스토어에 저장합니다.

 

Retention rule은 드루이드 웹 콘솔이나 코디네이터 API를 사용해서 생성하거나 관리할 수 있습니다.

curl --location --request POST 'http://localhost:8888/druid/coordinator/v1/rules/{datasourceName}' \
--header 'Content-Type: application/json' \
--data-raw '[{
   "type": "dropByPeriod",
   "period": "P1M",
   "includeFuture": true
   },
   {
    "type": "broadcastByPeriod",
    "period": "P1M",
    "includeFuture": true
   }]'

 

Rules의 순서는 매우 중요합니다. 

https://druid.apache.org/docs/latest/operations/rule-configuration.html

코디네이터는 사용된 모든 세그먼트를 순환하며 각 세그먼트에서 가장 먼저 적용되는 규칙을 적용시킵니다. 각 세그먼트는 하나의 규칙만 적용될 수 있습니다.

 


Load rules : 세그먼트를 서로 다른 히스토리컬 계층에 할당하는 방법과 각 계층에 세그먼트의 복제본이 몇 개 있어야 하는지

Drop rules : 세그먼트를 클러스터에서 완전히 삭제해야 하는 시기

Broadcast rules : 클러스터의 모든 브로커에 세그먼트 데이터 로드

 

다음과 같은 방법으로 보존 또는 삭제할 데이터를 지정할 수 있습니다.

  • Forever : all data in the segment
  • Period : 현재 시간으로부터 오프셋으로 지정된 세그먼트 데이터
  • Interval : 고정 시간 범위

 

목차

 

     


     

    Load rules

    Load 규칙은 드루이드가 세그먼트를 히스토리컬 노드(historical process tiers)에 할당하는 방법과 각 계층(tier)에 존재하는 세그먼트 복제본 수를 정의합니다.

     

    만약 단일 tier를 가지고 있다면, 드루이드는 자동적으로 _default_tier에 모든 세그먼트를 로드할 것입니다. 만약 추가적인 티어가 있다면, 로드 규칙을 정의하여 해당 계층에 로드할 세그먼트를 지정해야 합니다. 로드 규칙을 정의할 때까지 새 계층은 비어있는 상태로 유지됩니다.

    (현 프로젝트는 _default_tier만 사용)

    => what is the 'historical process tiers'?

     

    Forever load rule

    모든 데이터소스 세그먼트를 특정 티어에 로드합니다. Druid가 데이터소스에 적용하는 기본 규칙입니다.

    영구 로드 규칙 유형은 'loadForever' 입니다.

     

    다음 예시는 각 세그먼트의 복제본을 hot이라는 사용자 지정 계층에 하나씩 배치하고, 기본 계층에 다른 단일 복제본을 배치합니다.

    {
      "type": "loadForever",
      "tieredReplicants": {
        "hot": 1,
        "_default_tier": 1
      }
    }
    • tieredReplicants : map 타입으로 각 티어마다 tier name에 따른 segment replicas 수를 설정합니다.

     

    예) default

    Cluster Default: loadForever / replica 1 , Tier : _default_tier

     

    Period load rule

    특정 주기의 세그먼트 데이터를 티어에 할당할 수 있습니다. 드루이드는 세그먼트의 간격을 rule에서 정의한 기간(period)과 비교하여 일치하는 데이터를 로드합니다.

     

    Period load 룰은 `loadByPeriod` 타입을 사용합니다. 

    다음 예제는 1개월 기간의 데이터에 대한 복제본을 hot이라는 사용자 지정 계층에 배치하고, default 계층에 다른 단일 복제본을 배치합니다.

    {
      "type": "loadByPeriod",
      "period": "P1M",
      "includeFuture": true,
      "tieredReplicants": {
          "hot": 1,
          "_default_tier": 1
      }
    }
    • period : 기간(period)은 과거의 어느 시점부터 현재까지, 또는 includeFuture 설정이 true일 경우에는 미래까지입니다.
    • includeFuture : 세그먼트 간격이 겹치는 경우 드루이드에서 세그먼트를 일치시키도록 지시합니다.
      이 속성을 사용하여 Future 시작 및 종료 날짜가 있는 세그먼트를 로드할 수 있으며, 여기서 Future는 코디네이터가 rule에 의해 데이터를 평가하는 시점 기준입니다.

     

    이해한대로 예를 들어보면, Rule interval은 한달이고 segment interval은 일주일이며 현재 요일은 수요일인 상황입니다.

    includeFuture=true이면 범위는 과거에서 미래까지 적용되어서 segment interval에 따라 월요일~일요일로 잡히게 되고

    false인 경우 과거에서 현재 날짜까지만 적용하기 때문에 월요일~수요일로 잡히게 될 것 같아요. (아니라면 댓글 부탁드립니다.)

     

    Interval load rule

    interval rule을 사용하여 특정 범위의 데이터를 계층에 할당할 수 있습니다.

    예를 들어, 어떤 분석가는 지난주의 전체 데이터 집합으로만 작업을 하고, 이번주 데이터는 사용하지 않을 수 있습니다.

     

    다음 예는 지정된 간격과 일치하는 데이터 복제본 하나를 hot에 배치하고, 다른 단일 복제본은 기본 계층에 배치합니다.

    {
      "type": "loadByInterval",
      "interval": "2012-01-01/2013-01-01",
      "tieredReplicants": {
        "hot": 1,
        "_default_tier": 1
      }
    }

     

    Drop rules

    클러스터로부터 드루이드가 언제 세그먼트를 drop하는지 정해주는 rule입니다.

    드루이드는 drop한 데이터를 deep storage에 보관하고 있습니다. 만약 사용하지 않는 세그먼트의 자동 정리 설정(enable automatic cleanup)을 하거나 kill task 작업을 실행하면, 드루이드는 딥 스토리지에서 데이터를 삭제합니다.

     

    로드 규칙을 사용하여 정의된 기간의 데이터만 유지하려면 삭제 규칙도 정의해야 합니다. 삭제 규칙을 정의하지 않으면 데이터는 기본 규칙인 loadForever에 따라 보존합니다.

     

    Forever drop rule

    클러스터에서 모든 세그먼트 데이터를 삭제(drop)합니다. forever drop(영구 삭제) 규칙을 마지막 규칙으로 사용하여 규칙 집합을 구성하면, 드루이드는 우선순위가 더 높은 규칙들을 매핑한 후 남은 모든 세그먼트 데이터를 삭제합니다.

    => 위에서 규칙(rule)은 순서가 중요하다고 했습니다. json format으로 된 규칙들 중에 가장 하단에 영구 삭제를 위치시키면, 위 규칙들에서 매핑되지 않고 남은 세그먼트들은 모두 삭제된다는 뜻입니다.

     

    {
      "type": "dropForever",
    }

     

    Period drop rule

    세그먼트의 간격을 규칙에서 정의한 기간과 비교하여 일치하는 데이터를 삭제합니다. 이 규칙은 항상 최근 데이터를 삭제합니다.

    {
      "type": "dropByPeriod",
      "period": "P1M",
      "includeFuture": true,
    }

     

    Period drop before rule

    세그먼트의 간격을 규칙에서 정의한 기간과 비교하여 일치하는 데이터를 삭제한다는 점은 위와 같으나, 세그먼트 간격이 지정된 기간 이전인 경우 규칙이 적용됩니다. (예 : 지금으로부터 한달 이전의 데이터 삭제)

     

    최근 데이터만 유지하려는 경우 이 규칙을 사용해서 지정한 기간 이전의 오래된 데이터를 사용하여 loadForever 규칙을 추가하여 그 이후의 데이터를 유지할 수 있습니다.

    * dropBeforeByPeriod + loadForever 규칙 조합은 loadByPeriod(includeFuture=true) + dropForever과 동일합니다.

    {
      "type": "dropBeforeByPeriod",
      "period": "P1M"
    }

     

    Interval drop rule

    드루이드가 지정한 범위의 데이터를 모든 계층에 로드하지 못하도록 할 수 있습니다. 이 범위는 일반적으로 가장 오래된 데이터입니다.

    삭제된 데이터는 콜드 스토리지에 상주하지만 쿼리할 수 없습니다. 데이터를 쿼리해야 하는 경우 드루이드가 데이터를 다시 로드하도록 drop interval 규칙을 업데이트 하거나 제거해야 합니다.

    {
      "type": "dropByInterval",
      "interval": "2012-01-01/2013-01-01"
    }

     

    Broadcast rules

    드루이드의 확장 프로그램(extension)는 브로드캐스트 규칙을 사용하여 클러스터의 모든 브로커에 세그먼트 데이터를 로드합니다.

    ** 브로드캐스트 규칙은 프로덕션 환경이 아닌 테스트 환경에서 적용하는 것을 권장합니다.

     

    Forever broadcast rule

    클러스터에 있는 모든 브로커에 데이터소스에 있는 모든 세그먼트 데이터를 로드합니다.

    {
      "type": "broadcastForever",
    }

    Period broadcast rule

    세그먼트의 간격을 규칙에서 지정한 기간과 비교하여 일치하는 데이터를 클러스터의 브로커에 로드합니다.

    {
      "type": "broadcastByPeriod",
      "period": "P1M",
      "includeFuture": true,
    }

     

    Interval broadcast rule

    클러스터의 브로커에 특정 범위의 데이터를 로드합니다.

    {
      "type": "broadcastByInterval",
      "interval": "2012-01-01/2013-01-01"
    }

     

    Permanently delete data

    드루이드는 클러스터에서 데이터를 완전히 삭제하고, 메타데이터 스토리지에서 항목을 지우고, 미사용으로 표시된 모든 세그먼트에 대해 딥 스토리지에서 데이터를 제거할 수 있습니다. 드루이드는 규칙에 따라 클러스터에서 삭제된 세그먼트를 미사용으로 표시합니다. 이를 위해 오버로드에 kill task를 제출할 수 있습니다.

     

    Reload dropped data

    삭제된 데이터를 다시 로드하려면,

    1. 보존 기간 설정 (예: 1개월에서 2개월로 변경)
    2. 웹 콘솔 또는 API를 사용하여 데이터 소스에 속한 모든 세그먼트를 'used' 상태로 변경합니다.

     

     

     

     

    References

    https://druid.apache.org/docs/latest/operations/rule-configuration.html

    반응형

    댓글