** Elasticsearch를 공부하며 정리한 글입니다.
[ 색인 이중화 ] 참고
검색 서비스 운영 중에 실수로 색인을 잘못 만들어 검색결과에 일부 데이터가 누락된 일이 있다면?
- 원본 색인(some-index)의 문제로 인한 장애를 발견한다.
- 새로운 색인(some-index-new)을 만든다.
- 스냅샷 또는 원본 데이터 저장소로부터 데이터를 추출하여 새로 만든 색인(some-index-new)에 색인한다.
- 검색 클라이언트 코드 내에 하드코딩되어 있는 색인명(some-index)을 새로 만든 색인명(some-index-new)으로 변경하고 배포한다.
여기에는 두 가지 문제점이 있다.
첫번째는 위 과정이 완료될 때까지 장애가 서비스에 그대로 노출된다는 점이다.
색인하는 것은 검색 서비스에서 가장 많은 시간이 소요되는 부분 중 하나이다. 이러한 긴 시간동안 장애가 노출되는 것을 피하기 위해서는 별개의 2차 색인을 미리 만들어 이중화 해 두는게 좋다. 1차 색인에 문제가 생기면 미리 만들어 두었던 2차 색인으로 교체하면 된다.
두번째는 서빙하는 색인을 변경할 때 마다 검색 클라이언트 코드도 함께 변경해야 한다는 점이다.
색인에 별명을 미리 붙여두고 검색 클라이언트 코드에는 실제 색인명이 아닌 별명을 사용하도록 하면 검색 클라이언트 코드와 무관하게 서빙중인 색인을 교체할 수 있다. 원본 색인에 문제가 생기면 별명의 타겟을 2차 색인으로 교체하기만 하면 된다.
[ alias 공식문서 정리 ]
# ADD alias
alias1 이름을 test1에 적용하기
index alias는 date math도 제공한다.
예) <logs_{now/M}> 은 logs_2021.07.06 과 같이 변환된다.
# REMOVE alias
alias1 이름을 가진 alias 삭제
# RENAME alias
alias1을 alias2로 이름 변경하기.
* 이름 변경 프로세스가 remove -> add 이다. 공식 문서에서는 이 과정이 자동이므로, 짧은 순간에 인덱스를 가리키고 있지 않는 것은 걱정하지 말라고 적혀있다.
# ADD multiple alias
두개 이상 인덱스에 alias를 적용할 때 사용한다.
alias1을 test1, test2에 적용한다.
# ADD multiple alias (using indices)
다음과 같이 indices를 사용해서 한 줄로 쿼리를 날릴 수도 있다.
# ADD multiple alias (using globe pattern)
globe pattern을 사용해서 인덱스 이름을 공통화 하여 alias를 설정할 수도 있다.
# swap index
인덱스를 하나의 alias로 변경하는 것은 원자적으로 가능하다. 즉, 클러스터 상태에선 alias가 인덱스를 가리키지 않는 시간이 없다는 뜻이다. 그러나, 인덱싱 및 검색에는 여러 단계가 포함되므로 일시적으로 존재하지 않는 인덱스로 인해 진행 중이거나 대기중인 요청이 실패할 수 있다.
- 실수로 추가 한 색인(test)
- 추가해야 할 색인(test_2)
- 인덱스 삭제(test)
# Write Index
alias당, 하나의 인덱스만 쓰기를 진행할 수 있다.
아래 예시는 “alias1”에 대한 index가 test, test2로 총 2개가 있는데 test 에 대해서만 is_write_index 옵션을 true로 설정했다.
그러면 다음과 같은 쿼리를 날리면 test에 doc이 write 된다.
[ 추가 alias 정리 ]
# alias 조회
# alias를 이용한 index 변경
alias를 변경할 때 주의해야할 점이 한 가지 있다.
아래와 같이 alias를 add 하고 remove 하는 두 가지 작업을 동시에 진행해야 한다!!!
- add -> remove 하기: 동일한 별명을 가진 색인이 2개가 되므로 거의 동일한 검색결과가 2건씩 나오게 됨
- remove -> add 하기: 해당 별명이 없으므로 오류 발생
[ alias 추가 개념 ]
- alias는 하나 이상의 index와 매핑될 수 있다.
- alias의 목적은 검색 시, 필터링된 결과를 자동 반환할 수 있는 것이다.
- 불필요한 shard가 실행되는 것을 막도록 routing도 사용할 수 있다.
- 또한 search할 때 자동으로 적용되는 filter, routing values를 설정할 수 있다.
- index와 같은 이름을 사용할 수 없다.