검색 엔진 Search/Elastic Search

Reindex, Alias 활용해 문서 재색인하기 (비동기, 무중단)

Elasticsearch Reindexing은 데이터의 이동, 수정, 또는 클러스터 업데이트 시 중요한 역할을 하는 프로세스입니다. 데이터의 성능 향상, 새로운 매핑의 적용, 또는 클러스터 확장을 위해 필요한 작업으로, Elasticsearch의 핵심 기능 중 하나로 꼽힙니다.

 

Reindexing은 주로 데이터 업데이트를 위해 사용됩니다. 기존 데이터 스키마를 새로운 구조로 변경하거나 업데이트해야 할 필요가 있을 때 사용합니다. 새로운 필드의 추가나 기존 필드의 삭제 등의 매핑 변경을 수행할 수 있습니다.

 

본 글에서는 Reindexing이 어떻게 작동하는지, 그리고 어떻게 효율적으로 사용할 수 있는지, 무중단으로 새로운 인덱스를 적용할 수 있을지 살펴보겠습니다.

Elasticsearch 시리즈는 7.1x 버전을 기본으로 설명합니다. 필요하다면 8.0 이후의 버전 내용을 추가로 설명합니다.

 

1. Reindex 어떻게 수행할까?

Reindex는 기존에 사용하던 소스 인덱스에서 문서 소스를 추출하고 문서를 대상 인덱스에 색인합니다.

모든 문서를 대상 인덱스로 복사하거나 문서의 하위 집합을 다시 색인할 수 있습니다. 말 그대로 재색인입니다.

*인덱스 외에도 인덱스, 별칭(Alias) 또는 데이터 스트림을 소스로 사용할 수 있지만, 본 글에서는 인덱스로 한정해서 설명합니다.



재색인을 하려면 사전 준비 과정이 필요합니다.

  1. 우선 소스의 모든 문서에 대해 _source가 활성화되어 있어야 합니다.
  2. Reindex를 호출하기 전에 옮기고자 하는 대상 인덱스를 원하는 대로 구성해야 합니다.
    • 재색인을 통해서 기존 인덱스 또는 관련 컴포넌트, 인덱스 템플릿의 설정을 복사할 수 없습니다.
    • 매핑이나 샤드 수 등을 미리 설정해 대상이 될 인덱스를 미리 정의해놓아야 합니다.

 

위 준비 과정이 끝나면 아래와 같이 _reindex API를 호출하면 됩니다.

POST _reindex
{
  "source": {
    "index": "my-index-000001"
  },
  "dest": {
    "index": "my-new-index-000001"
  }
}

 

2. 효율적으로 reindexing 진행하기

(1) 비동기 처리 wait_for_completion

요청에 wait_for_completion=false가 포함된 경우 reindexing 작업을 비동기로 처리합니다.

비동기 처리하지 않을 경우 reindexing이 완료될 때까지 요청을 받을 수 없습니다.

심지어 재색인할 대상 문서가 많은 경우 timeout error 가 발생하기도 하므로 실전에서 필수적으로 적용할 파라미터라고 할 수 있습니다.

 

이 파라미터를 사용할 경우 ES에서 reindex 요청을 실행한 후 취소하거나 작업의 상태를 가져오는 데 사용할 수 있는 _task 객체를 생성하고 내용을 확인할 수 있는 문서의 _id를 반환합니다.

GET _tasks/<task_id> API를 통해 해당 작업에 관한 내용을 조회할 수 있습니다.

*task가 완료되면 해당 문서를 삭제하여 공간을 확보할 수 있도록 해야 합니다.

 

(2) 병렬화 slices

ES에서 reindexing 프로세스를 병렬화하기 위해 슬라이스 스크롤을 지원합니다.

이 병렬화를 통해 효율성을 개선하고 요청을 더 작은 부분으로 나눌 수 있습니다.

 

직접 _id 필드와 최대 개수를 사용하여 명시적으로 slicing해 요청할 수도 있습니다.

하지만 더 많이 사용하는 방법은 자동으로 슬라이싱할 수 있는 slices 파라미터를 사용하는 것입니다.

파라미터로 사용할 슬라이스 수를 지정하여 _reindex가 자동으로 병렬화되도록 할 수 있습니다. 

이 설정은 인덱스의 샤드 수 만큼 슬라이스를 사용할 때 가장 큰 효율을 낼 수 있습니다.

 

(3) 속도 개선 

reindexing 이전에 대상이 될 인덱스의 레플리카 수를 1로 구성하는 것이 속도를 높일 수 있습니다.

reindexing이 완료된 이후 다시 레플리카 수를 원하는 개수로 늘리는 방법이 대용량의 문서를 재색인할 때 유용합니다.

 

(4) 문서 수정하여 인덱싱 (선택사항)

기존 문서 내용을 그대로 재색인할 수도 있지만, 특정 내용을 변경하여 색인해야할 경우도 있습니다.

예를 들어, 기존 상품 유형 type이라는 필드의 이름을 types로 바꾸고 싶다거나 'discount' 라는 값을 포함한 데이터는 제외하고 색인하는 등 특정 요구사항을 반영하여 reindex 할 수 있습니다.

 

injest pipeline을 따로 정의하여 사용하거나, script를 사용하거나, 특정 소스 필드만 채택하여 재색인할 수도 있습니다.

자세한 내용은 아래 리스트를 참고할 수 있습니다.

 

3. 무중단으로 기존 인덱스와 신규 인덱스 교체하기 (Alias 사용)

실전에서 reindexing을 수행할 경우 기존 인덱스를 신규 인덱스로 변경까지 해야 작업이 완료됩니다.

어떻게 이를 검색 요청을 받으면서 수행할 수 있을까요?

 

인덱스 별칭인 alias 를 사용해 이를 수행할 수 있습니다.

my-index라는 alias를 가진 기존 인덱스 my-index-000001이 있습니다. 

신규 인덱스인 my-new-index-000001을 alias 에 추가합니다.

 

이때 쓰기 인덱스라고 설정에 명시해 두었다면 이 부분을 함께 변경해 주어야 합니다.

기존 인덱스는 더 이상 쓰기를 수행할 수 없고, 읽기만 가능하게 됩니다.

신규 인덱스가 추가되면서 새로운 문서들은 신규 인덱스로 인덱싱됩니다.

 

신규 인덱스를 추가한 후, 기존 인덱스를 연결된 alias에서 제거하면 중단 없이 인덱스 교체 완료입니다.

이 방법의 단점은 잠깐 2개의 인덱스가 alias에 공존하기 때문에 일시적으로 문서가 중복되어 보일 수 있다는 점입니다.

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "my-index-000001",
        "alias": "my-index",
        "is_write_index": false
      }
    }, {
      "add": {
        "index": "my-new-index-000001",
        "alias": "my-index",
        "is_write_index": true
      }
    }
  ]
}

POST _aliases
{
  "actions": [
    {
      "remove": {
        "index": "my-new-index-000001",
        "alias": "my-index"
      }
    }
  ]
}
* 주의
_aliases API로 remove, add 요청을 같이 전달할 수도 있습니다.
하지만 이 경우 remove 요청이 먼저 수행되면서 이미 기존 인덱스로 인입된 검색 요청에서 에러가 발생할 수 있습니다.
반드시 add → remove 순서로 요청을 전달할 것을 권장합니다.

 

4. 마무리

본 글에선 Elasticsearch Reindexing에 대한 전반적인 이해와 효율적인 활용 방법에 대해 살펴보았습니다. 

데이터의 업데이트와 스키마 변경이 필요한 상황에서 Reindexing은 강력한 도구로서 기능하며, 여러 가지 옵션을 통해 작업을 효율적으로 수행할 수 있습니다. 

또한, 무중단으로 새로운 인덱스를 적용하기 위해 Alias를 활용할 수도 있습니다. 

Elasticsearch 운영에 도움이 될 수 있는 글이었기를 바라며, 더욱 효율적이고 안정적인 reindexing 수행하시길 바랍니다:-)

 

 

레퍼런스

 

Reindex API | Elasticsearch Guide [7.17] | Elastic

Deprecated in 7.6. Sort in reindex is deprecated. Sorting in reindex was never guaranteed to index documents in order and prevents further development of reindex such as resilience and performance improvements. If used in combination with max_docs, conside

www.elastic.co