Elasticsearch 인덱스 별칭(Alias) 활용한 무중단 리인덱싱
문제 상황
상품 검색 기능에서 카테고리 필드의 타입을 text에서 keyword로 변경해야 하는 상황이 생겼다. 집계(aggregation) 성능 개선이 목적이었다. 하지만 Elasticsearch는 기존 인덱스의 매핑을 직접 수정할 수 없기 때문에 새 인덱스를 만들고 데이터를 옮겨야 했다.
문제는 검색 서비스가 24시간 운영되고 있다는 점이었다. 다운타임 없이 인덱스를 교체하는 방법이 필요했다.
인덱스 별칭 활용
인덱스 별칭(Alias)을 사용하면 애플리케이션 코드 변경 없이 인덱스를 교체할 수 있다.
1. 현재 상태 확인
GET /products/_mapping
GET /_cat/aliases?v
기존 인덱스명이 products였고, 별칭은 사용하지 않고 있었다.
2. 새 인덱스 생성
PUT /products_v2
{
"mappings": {
"properties": {
"category": {
"type": "keyword"
},
"name": {
"type": "text"
}
}
}
}
3. 데이터 복사
POST /_reindex
{
"source": {
"index": "products"
},
"dest": {
"index": "products_v2"
}
}
약 500만 건의 문서를 복사하는데 20분 정도 소요됐다.
4. 별칭 원자적 교체
POST /_aliases
{
"actions": [
{ "add": { "index": "products", "alias": "products_alias" } },
{ "remove_index": { "index": "products" } },
{ "add": { "index": "products_v2", "alias": "products_alias" } }
]
}
이후 애플리케이션 코드에서 products 대신 products_alias를 사용하도록 변경했다.
5. 이후 교체 시
다음 변경이 필요할 때는 코드 수정 없이 별칭만 교체하면 된다.
POST /_aliases
{
"actions": [
{ "remove": { "index": "products_v2", "alias": "products_alias" } },
{ "add": { "index": "products_v3", "alias": "products_alias" } }
]
}
주의사항
- 리인덱싱 중에도 기존 인덱스에 새 데이터가 들어올 수 있다. 배치 작업이나 증분 업데이트 고려 필요
- 별칭 교체는 원자적이지만, 클라이언트가 이미 연결된 요청은 기존 인덱스를 계속 참조할 수 있음
- 디스크 용량을 2배 이상 확보해야 함
결과
다운타임 없이 인덱스 구조를 변경했고, 카테고리 집계 속도가 약 3배 개선됐다. 앞으로는 처음부터 별칭을 사용하는 것을 기본 패턴으로 삼기로 했다.