Elasticsearch 인덱스 매핑 변경 시 재색인 전략
문제 상황
검색 정확도 개선을 위해 특정 필드의 analyzer를 변경해야 했다. Elasticsearch는 이미 생성된 인덱스의 매핑을 변경할 수 없기 때문에 재색인이 필수였다.
기존 인덱스에는 약 500만 건의 문서가 있었고, 검색 서비스는 24시간 운영 중이라 다운타임 없이 작업해야 했다.
해결 방법
1. 새 인덱스 생성
PUT /products_v2
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "nori"
},
"description": {
"type": "text"
}
}
}
}
2. Reindex API 활용
POST _reindex
{
"source": {
"index": "products_v1"
},
"dest": {
"index": "products_v2"
}
}
대용량 데이터였기 때문에 wait_for_completion=false 옵션으로 비동기 실행했고, Task API로 진행 상황을 모니터링했다.
3. Alias 전환
재색인 완료 후 alias를 원자적으로 전환했다.
POST _aliases
{
"actions": [
{ "remove": { "index": "products_v1", "alias": "products" }},
{ "add": { "index": "products_v2", "alias": "products" }}
]
}
애플리케이션 코드는 products alias를 바라보고 있었기 때문에 코드 변경 없이 전환이 가능했다.
추가 고려사항
재색인 중에도 신규 문서가 계속 유입되는 상황이었다. 재색인 시작 시점 이후의 데이터는 애플리케이션에서 양쪽 인덱스에 동시 쓰기하도록 임시 로직을 추가했다.
전환 후 일주일간 구 인덱스를 유지하다가 문제 없음을 확인한 뒤 삭제했다.
결과
약 3시간의 재색인 작업 동안 서비스 중단 없이 매핑 변경을 완료했다. 검색 정확도도 기대했던 대로 개선되었다.