전체 그래프
Elasticsearch

Data Lifecycle

data-engineeringelasticsearchilmdata-tiering

상위: Elasticsearch

요약

데이터의 수명 주기에 따라 저장 위치를 최적화(Data Tiering)하고, 관리를 자동화(ILM)하여 비용을 절감하고 성능을 유지하는 방법입니다.

Data Tiering (데이터 계층화)

데이터의 접근 빈도와 중요도에 따라 노드를 구분하여 비용을 절감하고 성능을 최적화합니다.

티어접근 빈도스토리지용도
Hot높음SSD최신 데이터, 활발한 읽기/쓰기
Warm중간HDD덜 빈번한 조회
Cold낮음저렴한 스토리지가끔 조회
Frozen매우 낮음최저비용거의 조회 안 함

노드 역할 설정

node.roles: master, data_hot, data_content

데이터 할당 규칙

cluster.routing.allocation.require._tier: data_hot
cluster.routing.allocation.include._tier: data_warm
cluster.routing.allocation.exclude._tier: data_cold

인덱스 레벨 티어링

index.routing.allocation.include._tier_preference: data_hot

계층 간 데이터 이동

es.indices.put_settings(index=index_name, body={
  "index.routing.allocation.include._tier_preference": "data_warm"
})

ILM (Index Lifecycle Management)

인덱스의 생성부터 삭제까지의 과정을 정책(Policy)으로 정의하여 자동화합니다.

주요 단계 (Phases)

  1. Hot: 데이터가 활발히 적재되고 검색됨. Rollover (크기나 기간 도달 시 새 인덱스 생성) 수행.
  2. Warm: 읽기 전용으로 전환, 세그먼트 병합(Force Merge)으로 최적화.
  3. Cold: 스냅샷 생성 또는 저비용 노드로 이동.
  4. Delete: 보관 기간 만료 시 삭제.

Rollover & Alias

  • Alias: 여러 인덱스를 가리키는 별칭. 클라이언트는 Alias를 통해 쓰기/읽기 수행.
  • Rollover: Alias가 가리키는 쓰기 전용 인덱스가 조건(크기, 시간)을 만족하면 새로운 인덱스를 생성하고 Alias를 갱신.
  • 반드시 "is_write_index": true 필요

ILM 정책 예제

{
  "phases": {
    "hot": {
      "actions": {
        "rollover": { "max_age": "30d", "max_size": "50gb" }
      }
    },
    "warm": {
      "min_age": "45d",
      "actions": {
        "allocate": { "include": { "node_type": "warm" } },
        "forcemerge": { "max_num_segments": 1 }
      }
    },
    "cold": {
      "min_age": "60d",
      "actions": {
        "allocate": { "include": { "node_type": "cold" } }
      }
    }
  }
}

Index Template

es.indices.put_index_template(name="demo-ilm-template", body={
  "index_patterns": ["demo-ilm-*"],
  "template": {
    "settings": {
      "index.lifecycle.name": "simple-ilm-policy",
      "index.lifecycle.rollover_alias": "demo-ilm-write"
    }
  }
})
es.indices.create(index="demo-ilm-000001", body={
  "aliases": {
    "demo-ilm-write": {"is_write_index": True}
  }
})