Elasticsearch reindex를 진행할 때, 단순하게 새로운 인덱스를 만들고 reindex api를 진행하고 기존 인덱스를 지우고 새로 만들어서 다시 reindex를 해줬다. (이전글: https://wedul.site/611?category=680504)
하지만 그것은 해당 인덱스의 document의 수가 적어서 금방 진행이 되었었고 만약 document수가 10만가지만 넘어도 생각보다 오래걸려서 서비스의 흐름이 끊어지게 된다는걸 인지하지 못했다. 같은 회사 동료분께서 해당 부분에 대해서 말씀해주셨고, 그 분이 가이드 해주신대로 진행해서 reindex를 무중단하게 진행하는 방법을 찾아봤다.
Alias를 이용하여 reindex하기
기존 index wedul의 매핑구조이다.
PUT wedul
{
"mappings": {
"dynamic": false,
"properties": {
"name": {
"type": "text"
}
}
}
}
해당 인덱스의 데이터는 현재 다음과 같이 들어있는 것을 볼 수 있다. 여기서 age는 매핑이 안되어있어서 검색에 잡을 수 없기에 이를 reindex를 통해 매핑 정보를 업데이트해주자.
그럼 reindex를 위해 새로운 인덱스 wedul_v1을 만들어보자.
그리고 wedul_v1으로 reindex를 실행해준다. 이때 주의사항이 있는데 document양이 10만 이상이 넘어가게 되면 작업이 오래걸리기에 kibana에서 504 gateway timeout이 발생하고 작업이 중단된다. 그래서 해당 작업을 비동기로 실행시키는 옵션인 wait_for_completion=false를 함께 설정해주고 진행해야한다.
POST _reindex?wait_for_completion=false
{
"source": {
"index": "wedul"
},
"dest": {
"index": "wedul_v1"
}
}
그럼 위에 이미지처럼 task 프로세스 번호가 나오고 이 프로세스에 시작시간 상태 취소 가능여부 등등을 GET _task 명령어를 통해 볼 수 있다. 여기서 프로세스가 종료되면 reindex가 다 된것이다.
그 다음 wedul_v1에 wedul이라는 alias를 지정해줘야한다.
POST _aliases
{
"actions": [
{
"add": {
"index": "wedul_v1",
"alias": "wedul"
}
}
]
}
alias를 지정하기 전에 기존 인덱스 wedul을 지워줘야한다. DELETE wedul 명령어를 날려서 기존 인덱스를 지우고 위의 alias 명령어를 실행시킨다.
그럼 정상적으로 alias를 통해 무중단 reindex를 실행되었다. 정상적으로 실행 되었는지 age에 대한 query를 날려보자.
ㅋㅋ 정상적으로 실행되었다.
앞으로 이런 방식으로 진행해야겠다.
출처 : https://discuss.elastic.co/t/reindex-big-index/83047
https://www.elastic.co/kr/blog/changing-mapping-with-zero-downtime
'데이터베이스 > Elasticsearch' 카테고리의 다른 글
Elasticsearch node 종류와 기본 설정 옵션 (0) | 2019.08.01 |
---|---|
Elasticsearch version conflict 에러 (0) | 2019.07.12 |
Elasticsearch nori 형태소 분석기에서 readingform filter를 이용해서 한자 내용을 한글로 변환하기 (0) | 2019.06.18 |
Elasticsearch 특정 형태소 종류를 제외하여 검색하는 필터 nori_part_of_speech 적용 (2) | 2019.06.18 |
Elasticsearch에서 Dictionary 변경 시 analyzer와 인덱싱된 Document 갱신 방법 (2) | 2019.06.15 |