elasticsearch에는 warmer api가 있다. 1.4.0 beta1 부터 만들어진 기능이다.


https://www.elastic.co/guide/en/elasticsearch/reference/1.4/indices-warmers.html


elasticsearch가 java 애플리케이션이라 데이터를 메모리에 로딩해야 속도가 빠르기 때문에,

warming up 또는 preload를 통해서 파일 또는 세그먼트 데이터를 메모리에 올려 놓는 것을 의미한다.


특히 큰 데이터의 경우는 반드시 warming up을 시켜야 한다. 그래서 API로 보면, 색인/템플릿 메모리 로딩 또는 특정 색인 검색시를 위한 메모리 로딩을 지시한다. 


워밍업도 GET/PUT/DELETE 기능이 있다.

PUT _warmer/{warmer_name}

PUT /{index}/_warmer/{warmer_name}

PUT /{index}/{type}/_warmer/{warmer_name}


DELETE /{index}/_warmer/{name}


GET {index}/_warmer/{warmer_name}



elasticsearch 2.0 소스를 간단히 살펴보았다. 생각한 것과 비슷하게 메모리 로딩이다. 


https://github.com/elastic/elasticsearch/blob/2.0/core/src/main/java/org/elasticsearch/indices/IndicesWarmer.java

https://github.com/elastic/elasticsearch/blob/2.0/core/src/main/java/org/elasticsearch/index/warmer/ShardIndexWarmerService.java

https://github.com/elastic/elasticsearch/blob/2.0/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java

https://github.com/elastic/elasticsearch/blob/2.0/core/src/main/java/org/elasticsearch/search/SearchService.java

https://github.com/elastic/elasticsearch/blob/2.0/core/src/main/java/org/elasticsearch/index/cache/bitset/BitsetFilterCache.java


예를 들어, SearchService클래스 초기화시 indicesWarmer에 listener에 NormsWarmer, FieldDataWarmer, SearchWamer 클래스를 추가한다. 그리고 내부적으로 index.warmer.enabled 이 true이면 listener를 작동하도록 코드화 되어 있다. 


     this.indicesWarmer.addListener(new NormsWarmer());

        this.indicesWarmer.addListener(new FieldDataWarmer());

        this.indicesWarmer.addListener(new SearchWarmer());



FileldDataWamer의 경우, 메모리로 색인의 필드 매핑 정보를 로드한다. 


 warmUp.put(indexName, fieldMapper.fieldType());


  for (final MappedFieldType fieldType : warmUp.values()) {

                    executor.execute(new Runnable() {


                        @Override

                        public void run() {

                            try {

                                final long start = System.nanoTime();

                                indexFieldDataService.getForField(fieldType).load(ctx);

...

}



그리고 ShardIndexWarmerService 는 warm관련 간단한 통계 지표를 쌓는다. 


Posted by '김용환'
,