개요
Elasticsearch를 검색 엔진으로 사용하기 위해서는 다운 타임이 없어야 한다.
또한 데이터 정합성, 실시간 데이터 반영을 챙기기 위해서는 동적, 정적 색인을 진행한다.
동적 색인이란, 실시간 데이터 반영을 위해 색인을 위한 데이터의 변경사항이 발생할 때마다 감지하여 ES에 색인시키는 동작을 의미한다.
정적 색인이란, 데이터 정합성이 깨지는 이슈를 방지하기 위해 특정 주기(매일, 매주 등)마다 색인 데이터를 전체 재색인하는 동작을 의미한다.
정적 색인 시에 검색 성능 영향을 최소화하기 위해 인덱스 교체 전략이 필요해진다.
ES에서 데이터를 색인시키는 경우, 검색에 사용 중인 인덱스에 데이터를 대량으로 색인하는 경우 검색 성능이 현저히 떨어진다. e.g. 10ms -> 2000ms 등
이 이슈를 해결하기 위해서는 검색에 사용 중인 인덱스와 별도의 인덱스에 정적 색인을 진행한 뒤, 색인을 교체하는 것이 좋다.
이것이 대해 알아보자.
검색 엔진이 고려해야 할 내용
- 라이브 중인 서비스가 영향을 받으면 안 된다.
- 데이터를 업데이트할 때 서비스의 TPS나 Response Time이 하락하면 안 된다.
- 모든 데이터를 빠짐없이 포함해야 한다.
- 데이터는 준실시간으로 업데이트되어야 한다.
- 동적으로 업데이트만 하는 경우, 싱크/정합성 문제가 발생할 수 밖에 없기 때문에 한 번씩 전체 데이터를 재색인해서 싱크를 맞춰줘야 한다.
ES의 문제점
- 인덱스에 몇 백만건 이상의 데이터를 연속으로 색인(정적 색인)하는 경우, 검색 성능이 아주 크게 떨어진다.
- 색인 중이 아닌 경우: 10~100ms / 색인 중인 경우: 10,000ms (10초)
- 따라서 라이브 중인 인덱스가 아닌 별도의 인덱스에 색인을 하고, 색인이 완료되면 라이브 중인 인덱스를 교체하는 전략이 필요하다
인덱스 교체 전략
- 인덱스는 항상 두 개의 이름을 활용한다. e.g. collection-0, collection-1
- 두 개의 인덱스에 live, stage alias를 부여한다. e.g. collection-live, collection-stage
- 검색 운영용 인덱스는 live alias를 활용하고, 동적 색인은 live alias로 흘러가도록 설정한다.
- 정적 색인 시 stage alias에 색인하고, 색인 완료 시 live alias와 stage alias를 스위칭한다.
- 스위칭 시에는 데이터 정합성 이슈가 없도록 정적 색인 동안의 동적 색인을 백필하는 등의 노력을 한다.
- 정적 색인 시에는 성능 극대화를 위해 refresh interval을 꺼두고, 동적 색인 전 1초로 전환 후 스위칭한다.
위와 같은 방법으로 운영 중인 인덱스에 서비스 영향도를 낮추면서 데이터 정합성 이슈를 최소화할 수 있었다.
다만 동적 색인에 대량의 데이터가 흘러들어갈 경우 색인 속도를 조절하는 등의 추가적인 조치가 필요하다.
'스터디 > 검색 엔진' 카테고리의 다른 글
[검색엔진] Elasticsearch 랭킹 (2) - 유사도 점수 정규화 (0) | 2024.03.31 |
---|---|
[검색엔진] 검색 엔진 리서치 (1) | 2024.01.21 |