본 포스팅은 2023년 12월 30일을 기준으로 작성되었습니다.
통상 로그, 메트릭 같은 시계열데이터는 시간에 따라 중요도, 사용빈도, 사용방법이 달라진다. 따라서 시간에 따른 관리가 필요한데 Elasticsearch는 ILM을 통한 효율적인 관리를 제공한다.
ILM의 작동방식을 이해하기 위해 우선 Elasticsearch의 Rollover pattern를 알아야한다. Rollover pattern을 더 간편하고 자동화하게 구현한 것이 ILM이다.
Rollover API는 인덱스에 특정 조건을 설정해 해당 조건을 만족하면 인덱스를 새로 만들고, 새롭게 생성된 인덱스로 요청을 받는 API이다. 만약 기존 인덱스가 너무 오래 되었거나, 너무 크거나, 너무 많은 document를 가지고 있어 관리차원에서 효율이 떨어진다면 Rollover API를 사용하면 좋다.
Rollover API는 Alias API를 통한 별칭 설정이 반드시 필요하다.
인덱스에 별칭을 적용하면 사용자는 실제로 어느 인덱스에 접근하는지 인지하지 않아도 사용할 수 있다.
여러 조건(기간, document수, 용량 등) 중 하나만 충족되면 자동으로 rollover하여 새로운 인덱스를 만들어 관리할 수 있고 사용자는 접근하는 인덱스의 이름을 변경할 필요없이 계속 색인하고 검색 할 수 있다.
그리고 대부분 상황에서 쓰기 작업은 새로운 인덱스에 하게 되지만 읽기 작업은 여러 인덱스에서 할 것이다.
따라서 alias 속성 중 “is_write_index”를 true로 설정하게 되면 쓰기 작업은 가장 최근에 rollover로 생성 혹은 지정된 인덱스로 하게 되고 검색은 alias를 가진 모든 인덱스에서 하게 된다.
ILM은 크게 hot, warm, cold, frozen, delete 5개의 phase로 인덱스를 구분해 관리한다.
Hot Phase :
> 빠른 쓰기/검색 작업이 필요한 최근 데이터
> 특정 조건을 충족하면 새로운 인덱스로 rollover
Warm Phase:
> 상대적으로 적게 검색되는 읽기 전용 데이터
> 보다 적은 샤드(primary)로 shrink, read-only상태로 전환하고 warm node로 migrate
Cold Phase:
> 드물게 검색되는 데이터
> 인덱스의 replica수 감소하고 cold node로 migrate
Frozen Phase:
> 사용하지 않지만 의무적으로 보관해야하는 데이터
> Snapshot을 생성하고 partially mounted index로 snapshot 데이터를 mount
ILM 각 phase 마다 여러 action들을 수행할 수 있다.
Set_priority
phase로 이동 시 노드 재시작 시 복구되는 우선순위를 정한다. 값이 클수록 우선순위가 높고 일반적으로 hot phase에 있는 인덱스는 cold phase에 있는 인덱스보다 priority 값이 높아야 한다.
Rollover
기존 인덱스가 특정 조건을 충족할 때 대상을 새로운 인덱스로 rollover한다. Rollover 대상은 data stream 혹은 alias가 될 수 있다. 대상이 alias일 경우 alias와 쓰기 인덱스는 아래 조건을 충족해야한다.
인덱스 이름은 ^.*-\d+$ 패턴에 일치해야한다. (ex, ilm-test-000001)
“index.lifecycle.rollover_alias” 설정값과 alias가 같아야한다.
대상 인덱스가 alias의 쓰기 인덱스여야한다. (“is_write_index” : true)
Allocate
인덱스의 샤드를 할당한 노드를 변경하거나 replica수를 변경한다.
Unfollow
CCR follower 인덱스를 일반 인덱스로 전환한다. Unfollow는 아래 조건이 충족될 때 진행된다.
Leader 인덱스의 “index.lifecycle.indexing_complete” 값이 true로 설정되어야한다.
Leader 인덱스에서 진행된 모든 작업이 follower index에도 적용된 상태여야한다.
Read_only
인덱스를 읽기전용으로 전환한다. Hot phase에서 read_only를 사용할 경우 rollover action이 필수로 있어야한다.
Forcemerge
지정한 세그먼트 수까지 인덱스의 세그먼트들을 강제로 merge한다. Elasticsearch 샤드는 여러 세그먼트로 구성되어 있는데 주기적으로 작은 세그먼트를 큰 세그먼트로 병합함으로써 하드웨어 자원 사용 균형을 조정한다. forcemerge 할 경우 해당 인덱스는 읽기전용으로 전환된다.
Shrink
인덱스을 읽기전용으로 전환하고 보다 적은 primary 샤드를 가진 인덱스를 생성한다. 새로 생성된 인덱스는 shrink-<random-uuid>-<original-index-name>으로 명명된다. Shrink가 되면 기존 인덱스에 설정된 alias는 새로운 인덱스에 적용된다.
Migrate
“index.routing.allocation.include._tier_preference”설정값을 업데이트하여 현재 phase에 해당하는 data tier로 인덱스를 이동시킨다. 기본적으로 migrate는 자동으로 진행되고 명시적으로 진행되지 않게 설정할 수 있다.
Searchable_snapshot
지정 레포지토리에 인덱스의 스냅샷을 생성하고 특정 인덱스에 mount 한다. Searchable snapshot은 hot, cold, frozen phase에서만 설정할 수 있다. Frozen phase에서 사용할 경우 mount되는 인덱스는 partial-로 시작하고 hot, cold에서 사용할 경우 restored-로 시작하게 된다.
Delete
인덱스 원본을 삭제한다. Searchable snapshot 또한 삭제할 수 있다.
Wait_for_snapshot
인덱스를 삭제하기 전에 지정된 SLM(snapshot lifecycle management)정책이 완료될 때까지 기다린다.
ILM은 create or update policy API로 생성하거나 Kibana의 Index Lifecycle Polices 메뉴에서 생성할 수 있다.
생성된 ILM policy는 인덱스를 생성하면서 적용하거나 index settings을 업데이트하여 적용할 수 있다.
# Elasticsearch index settings에 ILM 적용
PUT ilm-test-000001
{
"aliases" : {
"ilm-test" : {
"is_write_index" : true
}
}
"settings" : {
"index.lifecycle.name" : "ilm-hwcf-policy",
"index.lifecycle.rollover_alias" : "ilm-test"
}
}
시나리오 예제:
hot, warm, cold, frozen phase로 나눠 인덱스를 관리한다.
Hot phase에서는 2주마다 새로운 인덱스로 rollover 하고 alias를 지정해준다.
Warm phase에서는 rollover한 인덱스를 읽기전용으로 전환하고 1주동안 보관한다.
Cold phase에서는 rollover한 인덱스의 replica수를 줄이고 3주동안 보관한다.
Frozen phase에서는 rollover한 인덱스의 snapshot을 생성하고 영구 보관한다.
# Elasticsearch create or update ilm policy
PUT _ilm/policy/ilm-hwcf-policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_age": "14d"
},
"set_priority": {
"priority": 100
}
},
"min_age": "0ms"
},
"warm": {
"min_age": "0d",
"actions": {
"set_priority": {
"priority": 50
},
"readonly": {}
}
},
"cold": {
"min_age": "7d",
"actions": {
"set_priority": {
"priority": 0
},
"allocate": {
"number_of_replicas": 0
}
}
},
"frozen": {
"min_age": "28d",
"actions": {
"searchable_snapshot": {
"snapshot_repository": "found-snapshots"
}
}
}
}
}
}
시나리오 예제:
hot, warm, cold, frozen phase로 나눠 인덱스를 관리한다.
Hot phase에서는 2주마다 새로운 인덱스로 rollover 하고 alias를 지정해준다.
Warm phase에서는 rollover한 인덱스를 읽기전용으로 전환하고 1주동안 보관한다.
Cold phase에서는 rollover한 인덱스의 replica수를 줄이고 3주동안 보관한다.
Frozen phase에서는 rollover한 인덱스의 snapshot을 생성하고 영구 보관한다.