본문 바로가기

Database/elastic search

[es] ILM + rollover 설정

1. 

하루에 대략 20기가의 메트릭 정보가 쌓이고 있다. 그런데~~ ILM이 설정되어 있지 않았다.

[깨끗한 설정값을 보라..]

GET metricbeat-*/_settings?filter_path=**.index.lifecycle*

응답
{}

 

현재 ES 버전을 확인해보면

GET /


응답
{
  "name" : "data-es-coordination",
  "cluster_name" : "data-es-cluster",
  ...........................
  "version" : {
    "number" : "7.10.2",
    ..................
  },
  "tagline" : "You Know, for Search"
}

지금 ES 버전이 7.10.2이기 때문에, ILM(라이프사이클 정책)  rollover(인덱스 전환)  별도로 직접 설정해줘야 한다.

데이터 스트림(Data Stream) 기능이 도입되기 직전 버전으로 (8.x부터는 자동으로 ILM + rollover가 통합됨) matric에 대한 ILM과 rollover를 설정하려 한다. 

 

 


 

ILM(Index Lifecycle Management) = 인덱스의 생애주기를 관리하는 정책
Rollover = 쓰기 중인 인덱스를 교체

 

구분 ILM (정책) Rollover (행위)

  ILM (정책) Rollover (액션)
개념 인덱스 생애주기를 정의한 '정책' 현재 쓰기 인덱스를 새 인덱스로 교체하는 '액션'
예시 “30일 지나면 rollover, 90일 지나면 delete” 실제로 metricbeat-000001 → metricbeat-000002로 바꿈
주체 Elasticsearch의 Lifecycle Engine ILM 정책 내에서 수행됨
트리거 시간, 인덱스 크기, 문서 수 등 조건 조건이 만족되면 자동 실행
결과 hot → warm → delete 등 단계 이동 새 인덱스 생성 + alias 이동

 


 

 

2. 

먼저 해당 인덱스를 읽기전용으로 바꿔준다. (계속 데이터가 들어오면 설정이 안된다)

PUT metricbeat-7.10.2/_settings
{ "settings": { "index.blocks.write": true } }


응답
{
  "acknowledged" : true
}

 

 

3.

해당 인덱스를 다른 이름으로 복사한다 (clone)

POST metricbeat-7.10.2/_clone/metricbeat-7.10.2-000001


응답
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "metricbeat-7.10.2-000001"
}

 

 

4.

index lifecycle policles 생성 (name : metricbeat로 생성)

 

 

4. 

alias 지정

PUT metricbeat-7.10.2-000001/_settings
{
  "index.lifecycle.name": "metricbeat",
  "index.lifecycle.rollover_alias": "metricbeat-7.10.2"
}

응답
{
  "acknowledged" : true
}

 

 

 

5. 

다시 쓰기 모드로 변경 

PUT metricbeat-7.10.2/_settings
{ "settings": { "index.blocks.write": false } }

응답
{
  "acknowledged" : true
}

 

 

 

6. 

기존 인덱스 삭제 (이제 ILM과 rollover 적용된 인덱스가 생성됨)

DELETE metricbeat-7.10.2

응답
{
  "acknowledged" : true
}

 

 

 

7. 

다시 해당 인덱스의 셋팅을 확인해보면 ILM과 rollover 설정을 볼수 있다. 

GET metricbeat-*/_settings?filter_path=**.index.lifecycle*

응답 
{
  ".ds-metricbeat-8.14.3-000071" : {
    "settings" : {
      "index" : {
        "lifecycle" : {
          "name" : "metricbeat",
          "indexing_complete" : "true"
        }
      }
    }
  },
  "metricbeat-7.10.2-2025.11.05-000001" : {
    "settings" : {
      "index" : {
        "lifecycle" : {
          "name" : "metricbeat",
          "rollover_alias" : "metricbeat-7.10.2"
        }
      }
    }
  },
  ".ds-metricbeat-8.14.3-000072" : {
    "settings" : {
      "index" : {
        "lifecycle" : {
          "name" : "metricbeat"
        }
      }
    }
  }
}

 

 

 

 

번외 

설정을 완료했는데, 다음과 같이 에러가 발생했다면

Index lifecycle error
illegal_argument_exception: index.lifecycle.rollover_alias [metricbeat-7.10.2] does not point to index [metricbeat-7.10.2-000001]

 

먼저 해당 인덱스의 alias를 확인해보자 

GET /_alias/metricbeat-7.10.2

응답
{
  "error" : "alias [metricbeat-7.10.2] missing",
  "status" : 404
}

 

 

기존 인덱스를 삭제하고 (이미 clone했기 때문에 데이터는 남아잇음)

DELETE metricbeat-7.10.2

 

alias 재생성

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "metricbeat-7.10.2-000001",
        "alias": "metricbeat-7.10.2",
        "is_write_index": true
      }
    }
  ]
}

 

 

혹시 alias 생성시 에러가 난다면 아마도 이름이 중복되어 생성이 불가능한 경우다. 

ilm의 이름을 변경하거나 새롭게 생성한다면 정상적으로 동작한다. (아래와 같이 alias를 metricbeat-7.10.2-alias 로 변경해보았다.)

정상적으로 셋팅되었다면 키바나의 index management에서 해당 Index를 검색해보면 셋팅된 값을 볼수 있다 .