Elasticsearch - 인덱스 수명 주기 관리 정책 생성

Hyunjun Jang·2021년 11월 13일
0
post-custom-banner

인덱스 수명 주기 관리(ILM) 정책 생성

Hot, Warm, Cold 및 Delete 4단계를 정의한다.

  • 인덱스 조건 중 하나가 충족되면 Hot에서 Warm으로 이동
    (1d 이상이거나 크기가 5GB에 도달되거나 문서 10000000개 이상 넘으면 분기)
  • 30일 이상시 Warm에서 Cold로 이동
  • 60일보다 오래된 경우 Cold 인덱스 삭제
    여기서는 복제본을 사용하지 않는다.
PUT /_ilm/policy/test-policy
{
  "policy": {
  "phases": {
    "hot": {
      "actions": {
        "rollover": {
          "max_age": "1d",
              "max_size": "5GB",
              "max_docs": 10000000
        },
        "set_priority": {
          "priority": 100
        }
      }
    },
    "warm": {
      "actions": {
        "allocate": {
          "number_of_replicas": 0,
              "include": {},
          "exclude": {},
          "require": {
            "temp": "warm"
          }
        },
        "set_priority": {
          "priority": 50
        }
      }
    },
    "cold": {
      "min_age": "30d",
          "actions": {
        "allocate": {
          "require": {
            "temp": "cold"
          },
          "number_of_replicas": 0
        },
        "freeze": {}
      }
    },
    "delete": {
      "min_age": "60d",
          "actions": {
        "delete": {}
      }
    }
  }
}
}

엘라스틱서치 API를 통해서 test-policy 정책을 생성하였다. Kibana UI를 사용하여 정책을 생성하여 적용해도 된다.


인덱스 템플릿 생성

다음으로, 해당 ILM 정책을 인덱스 템플릿에 연결해야 한다.

PUT /_template/my-log-template
{
  "index_patterns": [
    "my-log-*"
  ],
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0,
    "index": {
      "routing.allocation.require.temp": "hot",
      "lifecycle": {
        "name": "test-policy",
        "rollover_alias": "my-log",
        "parse_origination_date": true
      }
    }
  },
  "mappings": {
    "properties": {
      "metricName": {
        "type": "keyword"
      },
      "timestamp": {
        "type": "date",
        "format": "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
      },
      "sampleCount": {
        "type": "double"
      }
    }
  }
}

여기에 별칭의 개념이 있다. 이는 ES가 어디에서 쓸지, 어디에서 읽을지를 결정할 수 있는 방법이다.

기본적으로 새 인덱스가 생성될 때 위에 "index_patterns"를 설정하고 그 뒤에 "{now/d}-000001"을 붙여서 그에 연결된 별칭을 정의한다.

예: /<my-log-{now/d}-000001>

롤오버가 발생하면(예: 인덱스가 warm 노드로 이동) 새 인덱스가 생성되고 ES는 이름을 하나씩 추가한다. 예: <my-log-{now/d}-000002. 별칭은 이 새 인덱스에 연결되어 쓰기 인덱스로 표시된다.

lifecycle.rollover_alias는 다음 섹션에서 생성할 별칭을 가리키도록 정의해야 한다.

PUT /%3Cmy-log-%7Bnow%2Fd%7D-000001%3E
{
  "aliases": {
    "my-log": { "is_write_index": true } 
  }
}

생성한 인덱스에 데이터를 넣어 테스트 해본다. 위에 설정한 ILM 정책에 따라 Rollover가 발생하여 새 인덱스가 생성이 된다.


Rollover 설정

Rollover는 기본적으로 10분이 걸리지만 이 동작을 무시하고 1분으로 설정할 수 있다.

PUT _cluster/settings
{
  "transient": {
    "indices": {
      "lifecycle": {
        "poll_interval": "1m"
      }
    }
  }
}

Rollover 발생 확인

GET my-log/_ilm/explain (truncate snippet)
{
  "indices" : {
    "my-log-2020.05.22.000002" : {
      "index" : "my-log-2020.05.22.000002",
      "managed" : true,
      "policy" : "test-policy",
      "lifecycle_date_millis" : 1596926766848,
      "phase" : "hot",
       ......
      }
    },
    "my-log-2020.05.22.000001" : {
      "index" : "my-log-2020.05.22.000001",
      "managed" : true,
      "policy" : "test-policy",
      "lifecycle_date_millis" : 1596926766855,
      "phase" : "warm",
      "phase_time_millis" : 1596926767360,
      "action" : "complete",
      "action_time_millis" : 1596926767721,
      "step" : "complete",
      "step_time_millis" : 1596926767721,
      .....
    }
  }

Reference

https://lasel.kr/archives/604
https://www.elastic.co/kr/blog/implementing-hot-warm-cold-in-elasticsearch-with-index-lifecycle-management
https://ptran32.github.io/2020-08-08-hot-warm-cold-elasticsearch/

profile
Let's grow together😊
post-custom-banner

0개의 댓글