Hot, Warm, Cold 및 Delete 4단계를 정의한다.
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는 기본적으로 10분이 걸리지만 이 동작을 무시하고 1분으로 설정할 수 있다.
PUT _cluster/settings
{
"transient": {
"indices": {
"lifecycle": {
"poll_interval": "1m"
}
}
}
}
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,
.....
}
}
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/