본문 바로가기

컴퓨터/DB

ElasticSearch - index Alias를 활용한 유연한 인덱스 운영

ElasticSearch(이하 ES)를 사용하다 보면 운영 중인 index를 수정할 일이 생긴다. (mapping이나 setting 등) 그런데 ES는 MySQL과 달리 인덱스의 메타데이터를 수정하기가 쉽지 않다. (ES의 데이터 불변성이 인덱스에도 적용되는 느낌이다) 그래서 나는 보통 새로운 인덱스를 생성해 reindex를 해주는 방식을 사용했는데, 이 때 index의 크기가 클 경우 reindex의 시간이 길어 그 동안 해당 index를 사용할 수 없는 문제가 생긴다.

 

실제 운영 중인 서비스의 경우 이 문제가 상당히 크게 다가오는데, 이 때 유용하게 사용될 수 있는 것이 ES에서 제공하는 Alias 기능이다. Alias는 어떤 인덱스의 별칭을 정해두고, ES에 요청이 올 때 인덱스명이 별칭인 요청이 들어올 경우 별칭에 해당하는 인덱스로 보내주는 것이다.

 

ex) index명 : real, Alias명 : Tmp

⇒ Tmp 인덱스를 요청할 경우 자동으로 real 인덱스에서 가져오게 된다.

 

Alias는 말 그대로 인덱스의 별칭 기능을 수행할 뿐이지만, 서비스를 중단하지 않고도 인덱스 설정을 바꾸는 데에도 활용할 수 있다.

이번에는 ES에서 Alias를 만들고 이를 사용해 무중단 상태에서 인덱스를 변경하는 방법을 살펴보려고 한다.

작업 순서는 다음과 같다.

 

기존 인덱스를 대체할 인덱스 생성

PUT origin_v1
{
   "settings":{
      "index":{
         "analysis":{
            "analyzer":{
               "synonym_analyzer":{
                  "type":"custom",
                  "tokenizer":"standard",
                  "filter":[
                     "synonym_filter"
                  ]
               }
            },
            "filter":{
               "synonym_filter":{
                  "type":"synonym",
                  "synonyms_path":"analyzers/F141697201"
               }
            }
         }
      }
   },
   "mappings":{
      "goods":{
         "properties":{
            "category":{
               "type":"text",
               "fields":{
                  "keyword":{
                     "type":"keyword",
                     "ignore_above":256
                  }
               }
            },
            "_ut":{
               "type":"long"
            }
         }
      }
   }
}

 

새 인덱스에 기존 인덱스의 데이터를 reindex

(이 때 인덱스의 크기가 크고 kibana에서 동작시킬 경우 timeout으로 인해 중단될 수 있기 때문에 wait_for_completion=false 옵션을 걸어주는 것이 좋다)

POST _reindex?wait_for_completion=false
{
  "source": {
    "index": "origin"
  },
  "dest": {
    "index": "origin_v1"
  }
}

기존 인덱스 삭제

#인덱스 제거
DELETE origin

기존 인덱스명을 새 인덱스의 Alias로 사용

POST /_aliases
{
    "actions": [
        {
            "add" : {
                "index" : "origin_v1",
                "alias" : "origin"
            }
        }
    ]
}

이렇게 하면 origin이 origin_v1으로 자동으로 연결되어 무중단 상태에서 인덱스 변경이 자유로워진다. 

추가적으로 변경할 일이 있다면 v1, v2 이런식으로 사용해 나가면 될 듯 하다.

'컴퓨터 > DB' 카테고리의 다른 글

ElasticSearch 인덱스에 동의어 사전 적용하기  (0) 2020.11.24
MySQL  (0) 2020.09.29
ElasticSearch document update 방법  (0) 2020.09.25