본문 바로가기
서버

[Elasticsearch] 최적화

by 탁구치는 개발자 2017. 12. 20.

데이터 검색


Query대신 Filter 사용

filter는 _score를 사용하지 않기 때문에 query에 비해 속도가 빠르다.

필터는 오직 결과가 검색과 일치하는지만 관심을 가진다는 것이다. 결과적으로 다른 쿼리보다 빠르고 쉽게 캐시에 저장할 수 있다.

필터 결과는 점수에 의해 정렬되지 않는다. (모든 결과에 대한 점수가 1.0이기 때문)

_score : 문서가 지정한 조건과 얼마나 유사한지 평가 


실시간 VS 준 실시간


ID로 문서를 조회하는 것은 쿼리 검색보다 훨씬 빠르다. 실시간에 준하는 검색 속도를 보장한다.

그에 반해 쿼리 검색은 준 실시간이다. 기본값으로 매초 발생하는 리프레시를 기다려야 하기 때문이다.


[리프레시 설정 값]

"index.refresh_interval": "5s"


ulimit


데이터가 많아지면 인덱스 파일 개수 또한 증가 

elasticsearch가 사용하고 있는 Lucene에서 인덱스를 세그먼트 단위로 관리하기 때문이다. 경우에 따라 MAX_OPEN 파일 개수를 넘어서는 일도 발생한다. 

ulimit 명령으로 최대 오픈 파일 제한을 변경해야 한다. (권장 값은 32,000~64,000)

참고 : https://www.elastic.co/guide/en/elasticsearch/reference/current/file-descriptors.html



Java Heap 사이즈


ES 전용 서버 운영 시 메모리 용량의 절반만 ES에 할당, 나머지 메모리 용량은 운영체제가 시스템 캐시 목적으로 사용할 수 있도록 하자.

운영체제가 시스템 캐시 목적으로 많은 양의 메모리가 필요한 이유는 디스크에 저장한 데이터를 빠르게 접근하기 위함이다. (디스크에 저장되는 lucene 세그먼트에서 데이터를 읽음)


elasticsearch.in.sh 파일 변경

1
2
#!/bin/sh 이후에 다음을 추가
ES_HEAP_SIZE=500m
cs



include_in_all 옵션


_all 필드에 저장할 것인지를 지정

언더바(_)로 시작하는 필드는 엘라스틱에서 관리하는 필드이다.

_all 필드는 검색할 때 유용한데 검색할 문자열이 어떤 필드에 매치되는지 알 필요 없을 때 사용되어 진다.

만약 개발하는 비즈니스에서 필드를 항상 지정하여 검색하는 경우 include_in_all 옵션을 false로 하도록 하자.

이와 같은 옵션 변경은 색인 전체 크기를 줄이고 더 빠르게 색인을 만든다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
  "properties": {
    "guid": {
      "index": "not_analyzed",
      "type": "string",
      "include_in_all": false
    },
    "goodsId": {
      "index": "not_analyzed",
      "type": "integer",
      "include_in_all": false
    },
    "registered": {
      "index": "not_analyzed",
      "format": "yyyy.MM.dd hh:mm:ss",
      "type": "date",
      "include_in_all": false
    }
  }
}
cs



index 매핑의 기본값은 analyzed


다음과 같이 3가지 기본 index 매핑이 있다.

guid 라는 속성을 검색할 때 정확한 값 일치를 사용한다면 not_analyzed를 지정하자.

"guid": {

      "index": "not_analyzed",

      "type": "string",

      "include_in_all": false

    },


analyzed

analyzer를 이용한 tokenized 수행 --> 색인 진행

ex) "this is my test a sentence" 라는 string이 주어졌을 때 analyzer를 통과하면 단어들이 다 쪼개져서 색인된다.


not_analyzed

검색 가능하도록 색인 (정확한 값 일치)

analyzer를 이용하지 않기 때문에 색인 속도가 빠르다.


no

색인하지 않음

검색 불가능

검색 결과에 포함되어 출력만 가능



모든 인덱스 삭제 방지


다음과 같이 한번에 모든 인덱스를 날려버릴 수 있다.

1
curl -XDELETE localhost:9200/_all
cs

이를 방지하기 위해서 다음의 옵션은 elasticsearch.yaml 에 추가해 준다. _all뿐만 아니라 색인 이름으로 와일드카드까지도 거부한다.

1
action.destructive_requires_name=true
cs



Dynamic Index 처리 방안


인덱스에 데이터가 많아지면 검색 요청에 많은 시간이 소요될 수 있다.

이를 위해 Dynamic Index를 이용하여 검색 요청 범위를 제한하고 최소화하자.

ex)

web-log_201710

web-log_201711

web-log_201712



data node 라이브 장비 스펙


메모리 : 64GB

CPU : 2~8코어

저장디스크 : SSD