<aside> 💡 최근 Elastic Cloud로 elasticsearch 서비스 클라우드를 이전하는 과정에서 이전에 사용하지 못한 플러그인을 사용할 수 있게되면서 인덱스의 구조 정의를 다시 할 필요성이 생겼다. 인덱스의 매핑구조가 바뀌게 되면 재색인(re-index) 과정이 필요한데 안정적이고 깔끔한 재색인 방법을 위해서 글을 작성하게 되었다.
</aside>
가장 간단한 방식의 흐름은 다음과 같을 수 있다. 먼저 서버가 바라보고 있는 인덱스를 점선 화살표로 설정하였고 우리의 목표는 새롭게 인덱스한 결과를 점선 화살표 위에 올리는 것이다.
Create temp_<index_name>
: 먼저 기존의 인덱스에 영향을 주지 않으면서 새롭게 인덱스를 만들어야 한다. 이름은 어떠한 형식이든 상관없다.
django의 경우 django-elasticsearch 모듈을 사용하고 있기 때문에 prefix를 수정하는 것으로 새로운 인덱스를 독립적으로 생성할 수 있다.
Rename local_<index_name>
→ dummy_<index_name>
: 기존에 있는 인덱스를 버려야 한다. 이름을 바꿔서 서버가 바라보지 않도록 해야한다.
에러 발생이 롤백을 위해서 바로 삭제하는 것은 좋은 방식이 아니라고 판단
Rename temp_<index_name>
→ local_<index_name>
: 새롭게 재색인한 결과값을 서버가 바라보는 인덱스 이름으로 바꿔야한다.
핵심은 두번째 과정과 세번째 과정에서 발생하는 딜레이를 최소한으로 줄이는 것이다.
인덱싱이 정상적으로 작동하지 않은 경우 → 롤백 상황 대처
리인덱싱 쉘 스크립트 사용방법 → 바로가기
재색인 배포 작업은 새로운 파이프라인을 만들지 않고 prefix를 활용하여 shell script를 통해 통제를 하려한다. 옵션을 통해서 각 상황에 맞는 동작을 실행하도록 하였다.
새로운 인덱스 생성
shell
export ES_INDEX_PREFIX=$TMP_PREFIX
yes y | python manage.py search_index --models $MODEL --rebuild
<index_name>/_settings
를 이용해서 적용한 분석기를 확인한다.
<index_name>/_mappings
를 이용해서 적용한 매핑이 잘 들어갔는지 확인한다.
기존의 인덱스를 POST _reindex
를 통해서 복사본을 만든다.
_reindex
의 경우는 인덱스 세팅에 관련된 정보는 가져오지 않기 때문에 이를 위해선 사전에 매핑 데이터를 미리 만들어 주어야 한다.
shell
curl -XPOST -H "Content-Type: application/json" -u $ES_USER_ID:$ES_USER_PW $ES_HOST/_reindex?pretty -d '{
"source": {
"index": "'$PREFIX'_'$INDEX'"
},
"dest": {
"index": "dummy_'$INDEX'"
}
}'
yes y | python manage.py search_index --models $MODEL --delete
yes y | python manage.py search_index --models $MODEL --create
temp 인덱스를 서버가 바라보는 인덱스 이름으로 바꿔준다.
기존 인덱스를 삭제하고 현재 설정으로 인덱스를 정의한 후에 다시 _reindex
API를 요청한다.
shell
yes y | python manage.py search_index --models $MODEL --delete
yes y | python manage.py search_index --models $MODEL --create
# Elasticsaerch reindex API
dt=$(date '+%H:%M:%S')
echo "[$dt] reindexing..."
curl -XPOST -H "Content-Type: application/json" -u $ES_USER_ID:$ES_USER_PW $ES_HOST/_reindex?pretty -d '{
"source": {
"index": "'$TMP_PREFIX'_'$INDEX'"
},
"dest": {
"index": "'$PREFIX'_'$INDEX'"
}
}'
롤백 상황
shell
if [ "$ROLLBACK" = true ]; then
export ES_INDEX_PREFIX=$PREFIX
yes y | python manage.py search_index --models $MODEL --delete
yes y | python manage.py search_index --models $MODEL --create
curl -XPOST -H "Content-Type: application/json" -u $ES_USER_ID:$ES_USER_PW $ES_HOST/_reindex?pretty -d '{
"source": {
"index": "dummy_'$INDEX'"
},
"dest": {
"index": "'$PREFIX'_'$INDEX'"
}
}'
exit 1
fi
롤백과 관련된 설정이 들어왔을 때, 동작하며 기존에 존재하는 인덱스를 지우고 dummy index로 덮어 씌운다.
_reindex
를 사용하였지만 _clone
API가 있다. 둘 중에 어떤 API가 롤백 상황에서 적합할지 생각해보자
완벽한 롤백을 위해선 롤백을 실행하기 전에 이전의 스테이징으로 돌아가야한다. 그러기 위해서는 git checkout
을 통해서 방금 전 단계로 돌아가거나 브랜치를 바꾸어 롤백을 진행해야한다.
→ 다소 배포 프로세스가 복잡하게 느껴진다.