////
Search
Duplicate
🔟

10장. 색인 성능 최적화

: 노드를 추가하지 않고도 ElasticSearch의 설정을 변경함으로써 불필요한 리소스를 줄일 수 있고 색인 성능을 향상시킬 수 있음
정적 매핑 적용하기
_all field 비활성화
refresh_interval 변경하기
bulk API 활용하여 색인하기
그 외에 색인 성능을 확보하는 다양한 방법

10.1 정적 매핑 적용하기

: ElasticSearch는 인덱스의 매핑 정보를 바탕으로 문서를 색인하고 저장하며 매핑 정보와 맞지 않을 경우 에러를 출력한다.
: 매핑 정보를 생성하는 방법에는 동적 매핑과 정적 매핑 두 가지 방법이 있다.
동적 매핑
: 매핑 정보를 동적으로 생성하는 것, ElasticSearch는 매핑 정보를 미리 만들어 두지 않아도 최초 색인되는 문서를 기준으로 매핑 정보를 생성해낸다.
: 본인은 검색 엔진 용도로 사용하고자 했기 때문에 대부분의 필드에 대한 색인이 필요했고 문자내용들이 text 타입으로 동적매핑 되지 않아 모두 정적매핑해주었다.
정적 매핑
: 매핑 정보를 미리 만들어 두는 것, 사용자가 문서를 색인하기 전 미리 API를 사용하여 매핑 정보를 만들어 둔다.
: 필요한 필드만 정의하여 사용할 수 있다. 불필요한 필드가 생성되지 않는다.
타입
문자열 필드
keyword : ignore_above라는 속성이 하나 더 붙는데, 문자열 중 해당 길이 이상인 값은 색인에 포함되지 않는 것이다.
text

10.2 _all 필드 비활성화

: 사용자가 색인한 문서의 모든 필드값을 하나의 큰 문자열 형태의 필드로 색인하는 필드
{ "first_name": "John", "last_name": "Smith", "date_of_birth": "1970-10-24" }
JSON
복사
{ "first_name": "John", "last_name": "Smith", "date_of_birth": "1970-10-24", "_all": "John Smith 1970-10-24" }
JSON
복사
_all 필드는 ElasticSearch 5.X 이하의 버전에만 해당
: 검색할 때 필드명 없이 검색하기 위해서 존재, 검색 시 필드명을 알 수 없는 경우 사용하기 위해서
5.x 버전에서 진행한 코드로 6.x 버전 이상에서는 지우너 불가 응답이 리턴, 그 대안으로 11장에서 copy_to 기능을 사용하도록 권고

10.3 refresh_interval 변경하기

: refresh란 색인되는 문서들을 메모리 버퍼 캐시에 먼저 저장한 후, 특정 조건이 되면 메모리 버퍼 캐시에 저장된 색인 정보나 문서들을 디스크에 세그먼트 단위로 저장하는 작업
: 이 refresh의 작업 주기를 결정하는 것이 refresh_interval, 기본값은 1초로 되어있음
: refresh_interval이 짧아지면 디스크 I/O가 잦아지므로 성능을 저하시킬 수 있음, 그렇다고 너무 길게 설정하면 색인된 문서를 색인하는데 오래걸리게 된다.
: 실시간 검색 엔진으로 사용하고자 한다면 refresh_interval을 기본값인 1초로 설정, 대용량의 로그를 수집하는 것이 목적이고 당장 검색해서 사용할 필요가 없다면 충분히 늘려서
색인 성능을 확보할 수 있다.

10.4 bulk API

: 한 번에 다량의 문서를 색인, 삭제, 수정할 때 사용할 수 있는 API
: 하나의 문서를 처리할 때, 시스템은 클라이언트와 네트워크 세션을 맺고 끊기를 반복하기 때문에 여러 건의 문서를 처리할 때 단건으로 맺고 끊기를 반복하면 부하가 발생
: 이 때문에 여러 건의 문서를 처리할 때는 bulk API를 통해 문서 색인, 업데이트 등의 작업을 모아서 한 번에 수행하는 것이 좋음
bulk API 동작
설명
index
문서 색인, 인덱스에 지정한 문서 아이디가 있을 경우 업데이트
create
문서 색인, 인덱스에 지정한 문서 아이디가 있을 경우 오류 발생
delete
문서 삭제
update
문서 변경

10.5 그 외의 색인 성능을 확보하는 방법들

1.
문서의 id 없이 색인하는 방법
2.
레플리카 샤드의 갯수를 0으로 설정하여 색인 성능을 확보하는 방법

10.6 마치며

1.
동적 매핑은 매핑 정보를 자동으로 생성해 주지만 불필요한 필드를 만들 수 있어서 성능 저하를 일으킬 수 있다.
2.
정적 매핑은 미리 매핑 정보를 생성해 두어야 하지만 필요한 필드들만 사용하기 때문에 성능 향상에 도움이 된다.
3.
_all 필드는 모든 필드들의 데이터를 바탕으로 text 타입의 필드를 추가로 생성하기 때문에 성능 저하를 일으킬 수 있다.
4.
refresh_interval을 적절히 활용하여 디스크 I/O의 빈도수를 줄이면 색인 리소스를 줄일 수 있다.
5.
bulk API를 활용하여 한번에 다량의 문서를 색인하면 색인 성능 향상을 꾀할 수 있다.
6.
문서 id 지정이 필요하지 않다면 POST 메서드를 이용해 색인하는 것이 PUT 메서드를 이용해 색인하는 것 보다 성능 향상에 도움이 된다.
7.
레플리카 샤드가 꼭 필요한 상황이 아니라면 프라이머리 샤드만을 이용해서 운영하는 것도 성능 향상에 도움이 된다.