본문 바로가기
ElasticSearch & OpenSearch

[ElasticSearch] _reindex 및 _forcemerge

by yonikim 2024. 12. 3.
728x90

 

기존 인덱스의 필드 매핑 타입을 수정하고 싶을 경우 어떻게 해야 할까? 

 

1. _reindex

ElasticSearch에서 데이터를 다른 인덱스로 복사하거나 이동하는데 사용되는 API이다.

 

기능 및 특징

  • 기존 데이터를 새로운 인덱스에 복사할 수 있다. 
  • 데이터의 구조를 변경하거나 필드를 추가/삭제할 수 있다.
  • 새로운 매핑 설정을 가진 인덱스를 생성한 후, 데이터를 이전하는 데 주로 사용된다.
  • 데이터를 이동하면서 간단한 스크립트를 사용하여 필드 값을 변환할 수 있다. 

주요 사용 사례

  1. 매핑 변경
    기존 인덱스의 매핑을 수정할 수 없기 때문에 새로운 매핑으로 인덱스를 생성하고 `_reindex`를 사용해 데이터를 이동한다.
  2. 데이터 정제 및 변환 
    `_reindex` 사용시 스크립트를 사용하여 데이터를 변환하거나 필드를 계산할 수 있다. 
POST _reindex
{
  "source": {
    "index": "old_index"
  },
  "dest": {
    "index": "new_index"
  },
  "script": {
    "source": "ctx._source.new_field = ctx._source.old_field + ' transformed';"
  }
}

 

오 _reindex 개쩔잖아?

 

 

But,,,

`_reindex` 는 굉장히 오래 걸리는 작업으로, 그냥 실행하게 되면 아래와 같은 오류를 마주하게 될 수 있다.

{"statusCode":502,"error":"Bad Gateway","message":"Client request timeout"}

 

 

 

따라서 해당 작업을 비동기로 실행시키는 옵션인 `wait_for_completion=false` 를 설정해주고 진행하는게 좋다.

POST _reindex?wait_for_completion=false
{
  "conflicts": "proceed",
  "source": {
    "index": "es-log-202204*"
  },
  "dest": {
    "index": "es-log-202204"
  }
}

 


2. _forcemerge

인덱스의 세그먼트를 강제로 병합하여 디스크 사용량을 줄이고 성능을 최적화하는 데 사용된다. 

 

기능 및 특징

  • ElasticSearch는 데이터 추가와 삭제 시 새로운 세그먼트를 계속 생성하며, 삭제된 문서는 여전히 디스크 공간을 차지한다. 
  • `_forcemerge`는 여러 세그먼트를 병합하여 디스크 사용량을 줄이고 검색 성능을 향상시킨다.  
GET es-log-202204/_segments?verbose=true

 

(전)

{
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "indices" : {
    "es-log-202204" : {
      "shards" : {
        "0" : [
          {
            "routing" : {
              "state" : "STARTED",
              "primary" : true,
              "node" : "W2DkVHboTtqIORuM3IzyOQ"
            },
            "num_committed_segments" : 21,
            "num_search_segments" : 15,
            "segments" : { ... }
          }
        ]
      }
    }
  }
}

 

 

`_forcemerge` 를 통해 segment 수를 줄여주자

POST es-log-202204/_forcemerge?max_num_segments=1

`max_num_segments는 병합 후 남길 세그먼트의 최대 수를 지정한다.

 

(후)

{
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "indices" : {
    "curation-log-202204" : {
      "shards" : {
        "0" : [
          {
            "routing" : {
              "state" : "STARTED",
              "primary" : true,
              "node" : "W2DkVHboTtqIORuM3IzyOQ"
            },
            "num_committed_segments" : 1,
            "num_search_segments" : 1,
            "segments" : { ... }
          }
        ]
      }
    }
  }
}

 

주의사항

  • `_forcemerge`는 디스크 I/O를 많이 사용하기 때문에 클러스터 성능에 영향을 줄 수 있다. 따라서 비활성화된 인덱스에서 수행하는게 좋다. 
  • 병합하는 데이터가 많을수록 시간이 오래 걸린다.

 

728x90