업무상 가장 많이 사용하는 Elasticsearch가 어떻게 작동하는지 자세히 알고 싶어 하나씩 공부하며 정리해보려 합니다.
피드백은 언제나 감사합니다. (🙆♀️)
Elasticsearch는 빈번하게 요청되는 filter query
의 응답 속도를 개선하기 위해서 cache
를 사용하며 이때 Node Query Cache
가 적용됩니다.
Node Query Cache
는 문서 자체를 캐시하는 것이 아니라 응답값 (true
, false
)만 bitset
형태로 캐시합니다.
반면, 스코어 계산이 필요한 query
나 aggregation
등은 Node Query Cache
가 적용되지 않습니다.
filter query
만 캐시 된다. filter query
와 각 문서의 매칭이 true
, false
인지에 대한 응답값만 저장한다. ⚒ 활성화 및 설정 방법
- 활성화 및 캐시 사이즈 설정은 Elasticsearch Cluster내의 모든 데이터 노드에 적용해야 하며
elasticsearch.yml
에서 설정할 수 있다.
index.queries.cache.enabled
: 활성화 유무 (default: true)indices.queries.cache.size
: JVM Heap의 몇 %를 캐시 공간으로 사용할지 설정 (default: 10%)
검색 요청이 인덱스 또는 여러 인덱스에 대해 실행될 때,
관련된 각 샤드는 검색을 로컬환경에서 실행하고 난 뒤 결과를 coordinating node로 반환하고, coordinating node는 각각의 결과를 수집하여 global 결과 집합으로 만얼어 내는 과정으로 검색이 이루어지게 됩니다.
해당 과정 속에서 샤드 레벨 요청에 대한 로컬 응답값은 각 샤드의 local cache로 저장됩니다.
이때 만들어진 샤드의 로컬 캐시는 샤드내 문서 변화가 생기는 순간 무효화되기 때문에 Shard Request Cache는 변화가 거의 없는 정적인 데이터의 캐시환경에서 사용하는 것이 좋습니다.
"size": 0
일 때 캐시된다. aggregations
과 suggestions
사용할 때를 의미한다. shard
단위로 캐싱한다. hits
결과는 캐싱하지 않지만 hits.total
은 캐싱한다. Date Range
또는 Histogram
질의 시 now
를 사용하게 되면 캐시하지 않는다.⚒ 활성화 및 설정 방법
- index 단위 캐시 활성화
PUT index_01/_settings { "index.requests.cache.enable": "true" }
- query 단위 캐시 활성화
PUT index_01/_search?request_cache=true { "size": 0, "aggs": { "animal": { "terms": { "field": "species" } } } }
- 캐시 사이즈 설정은
elasticsearch.yml
에서 설정할 수 있다.
indices.requests.cache.size
: JVM Heap의 몇 %를 캐시 공간으로 사용할지 설정 (default: 1%)
검색 결과에 포함된 문서를 빠르게 접근하기 위한 캐시이며 주로 필드에서 aggregation
연산을 수행할 때 사용됩니다.
Field data Cache
는 집계 연산 동안 모든 필드의 값을 메모리에 로드하기 때문에 성능적인 측면에서 비용이 많이 듭니다. 때문에 사전에 충분한 메모리를 확보하는 것이 좋습니다.
Field Data Cache
는 할당량을 제한하더라도 작동 방식이 먼저 메모리에 데이터를 올리고 제한을 넘으면 사용되지 않는 데이터를 제거하는 방식이기 때문에 OOM에러가 발생할 수 있습니다. ⚒ 캐시 설정 방법
캐시 설정은elasticsearch.yml
에서 설정할 수 있다.
indices.fielddata.cache.size
: JVM Heap의 % 혹은 GB 최대값 설정 (default: 무제한)
⚒ Circuit breaker 설정 방법
Field Data Cache
에 로드하기 위해 필요한 힙 메모리를 측정하며, 설정된 사이즈를 초과할 경우 circuit breaker가 연산을 중지하고 에러를 반환하여 OOM을 방지할 수 있다.
Circuit breaker 설정은elasticsearch.yml
에서 설정할 수 있다.
indices.breaker.fielddata.limit
: 캐시 공간 제한 설정 (default: 40%)indices.breaker.fielddata.overhead
: 메모리 오버헤드를 허용 (default: 1.03)
[Elasticsearch] Cache 에 대해 알아 봅시다. - https://jjeong.tistory.com/1392
Elasticsearch 캐쉬 - https://jinhokwon.github.io/devops/elasticsearch-cache/
Elasticsearch cache(캐시 )- 상구리의 기술 블로그 https://www.skyer9.pe.kr/wordpress/?p=1070
Elasticsearch Cache - https://opster.com/guides/elasticsearch/glossary/elasticsearch-cache/