Elasticsearch Cache

May Han·2022년 1월 27일
5

Elasticsearch

목록 보기
1/4
post-thumbnail
post-custom-banner

업무상 가장 많이 사용하는 Elasticsearch가 어떻게 작동하는지 자세히 알고 싶어 하나씩 공부하며 정리해보려 합니다.
피드백은 언제나 감사합니다.
(🙆‍♀️)


1. Node Query Cache

Elasticsearch는 빈번하게 요청되는 filter query의 응답 속도를 개선하기 위해서 cache를 사용하며 이때 Node Query Cache가 적용됩니다.
Node Query Cache는 문서 자체를 캐시하는 것이 아니라 응답값 (true, false)만 bitset 형태로 캐시합니다.

반면, 스코어 계산이 필요한 queryaggregation등은 Node Query Cache가 적용되지 않습니다.

  • Query 중 filter query만 캐시 된다.
  • filter query와 각 문서의 매칭이 true, false인지에 대한 응답값만 저장한다.
  • 캐시는 현재 쿼리 뿐만 아니라 다른 쿼리에서도 재사용되기 때문에 응답속도를 개선할 수 있다.
  • LRU 정책으로 동작한다. (가장 오랫동안 참조되지 않은 페이지를 교체)
  • Elasticsearch 공식 문서 - Node Query Cache

활성화 및 설정 방법

  • 활성화 및 캐시 사이즈 설정은 Elasticsearch Cluster내의 모든 데이터 노드에 적용해야 하며 elasticsearch.yml에서 설정할 수 있다.
    • index.queries.cache.enabled: 활성화 유무 (default: true)
    • indices.queries.cache.size: JVM Heap의 몇 %를 캐시 공간으로 사용할지 설정 (default: 10%)



2. Shard Request Cache

검색 요청이 인덱스 또는 여러 인덱스에 대해 실행될 때,
관련된 각 샤드는 검색을 로컬환경에서 실행하고 난 뒤 결과를 coordinating node로 반환하고, coordinating node는 각각의 결과를 수집하여 global 결과 집합으로 만얼어 내는 과정으로 검색이 이루어지게 됩니다.
해당 과정 속에서 샤드 레벨 요청에 대한 로컬 응답값은 각 샤드의 local cache로 저장됩니다.
이때 만들어진 샤드의 로컬 캐시는 샤드내 문서 변화가 생기는 순간 무효화되기 때문에 Shard Request Cache는 변화가 거의 없는 정적인 데이터의 캐시환경에서 사용하는 것이 좋습니다.

  • "size": 0일 때 캐시된다.
  • 즉, aggregationssuggestions 사용할 때를 의미한다.
  • shard 단위로 캐싱한다.
  • hits 결과는 캐싱하지 않지만 hits.total은 캐싱한다.
  • Date Range 또는 Histogram 질의 시 now를 사용하게 되면 캐시하지 않는다.
  • Elasticsearch 공식 문서 - Shard request cache

활성화 및 설정 방법

  • 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%)



3. Field Data Cache

검색 결과에 포함된 문서를 빠르게 접근하기 위한 캐시이며 주로 필드에서 aggregation 연산을 수행할 때 사용됩니다.
Field data Cache는 집계 연산 동안 모든 필드의 값을 메모리에 로드하기 때문에 성능적인 측면에서 비용이 많이 듭니다. 때문에 사전에 충분한 메모리를 확보하는 것이 좋습니다.

  • 캐시 사용의 모니터링이 중요하다.
  • 필드데이터의 캐시에는 특정 필드 유형에 대한 집계 및 중요 변수들이 존재한다.
  • 설정 사이즈 부터 캐시가 자동 정리를 시작해서 circuit braker exception을 방지한다.
  • 통계 데이터 생성에 모든 문서를 메모리에 올린다.
  • Field Data Cache는 할당량을 제한하더라도 작동 방식이 먼저 메모리에 데이터를 올리고 제한을 넘으면 사용되지 않는 데이터를 제거하는 방식이기 때문에 OOM에러가 발생할 수 있습니다.
  • Elasticsearch 공식 문서 - Field data cache

캐시 설정 방법
캐시 설정은 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)




Reference

[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/

LRU 알고리즘 (Least Recently Used Algorithm)

Elasticsearch 공식 문서 - Circuit breaker settings

profile
🚢 크루즈승무원 출신 백엔드 개발자, 기록하는 것을 좋아합니다.
post-custom-banner

0개의 댓글