ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • elasticsearch segments 병합 전략과 스케줄링
    elasticsearch 2021. 3. 23. 23:20
    반응형

    세그먼트 병합 전략과 스케줄링

    세그먼트의 병합은 성능 향상에 매우 중요하므로 병합 정책이 존재하는데 방식이 2가지가 있다

    LogMergePolicy와 tieredMergePolicy 총 두 가징이다

    LogMergeerPolicy

    용량이 급증하는 세그먼트 병합 방법 중 Merge Factor 기반으로 하는 병합 정책이다.

    Merge Factor(이하 mf)는 일종의 세그먼트 병합 기준 수치라고 할 수 있는데 세그먼트는 mf로 설정된 수보다 작은 수의 세그먼트를 가지며 이 수를 넘어서게 되면 병합이 발생하게 된다 mf가 자주 발생하면 검색 속도는 향상이 되겠지만 색인에는 많은 시간과 자원이 발생하게 된다 반대로 너무 길면 검색 속도는 느려지고 색인 시에 비용은 줄어들게 된다 mf의 기본 값은 10이고 다시 두 가지 상세 정책으로 나뉜다

     

    public class LogByteSizeMergePolicy extends LogMergePolicy { 
    	/** 기본 최􏰉 세그먼트 사이즈. */
    	public static final double DEFAULT_MIN_MERGE_MB = 1.6; 
    	/** 기본 최대 세그먼트 사이즈 최대사이즈보다크면더이상병합의대상이되지못한다.*/ public static final double DEFAULT_MAX_MERGE_MB = 2048;
    	
    	public LogByteSizeMergePolicy() {
    	minMergeSize = (long) (DEFAULT_MIN_MERGE_MB*1024*1024);
    	maxMergeSize = (long) (DEFAULT_MAX_MERGE_MB*1024*1024); }
    }

     

    LogByteSizeMergePolicy

    세그먼트 파일의 총 바이트 수를 기준으로 병합된다

    public class LogByteSizeMergePolicy extends LogMergePolicy { 
    	/** 기본 최􏰉 세그먼트 사이즈. */
    	public static final double DEFAULT_MIN_MERGE_MB = 1.6; 
    	/** 기본 최대 세그먼트 사이즈 최대사이즈보다크면더이상병합의대상이되지못한다.*/ public static final double DEFAULT_MAX_MERGE_MB = 2048;
    	
    	public LogByteSizeMergePolicy() {
    	minMergeSize = (long) (DEFAULT_MIN_MERGE_MB*1024*1024);
    	maxMergeSize = (long) (DEFAULT_MAX_MERGE_MB*1024*1024); }
    }

     

    LogDocMergePolicy

    세그먼트 크기를 계산하는 대신 도큐먼트 수를 기준으로 한다

    public class LogDocMergePolicy extends LogMergePolicy { 
    
    	/** 기본 최대 세그먼트 사이즈 */
    	public static final int DEFAULT_MIN_MERGE_DOCS = 1000; 
    
    	public LogDocMergePolicy() { 
    		minMergeSize = DEFAULT_MIN_MERGE_DOCS;
    		// 병합 대상이 되는 최대 세그먼트 사이즈 maxMergeSize = Long.MAX_VALUE;
    	} 
    
    }

     

    TieredMergePolicy

    루씬 초기 병합 정책은 LogByteSizeMergePolicy였는데 이 정책의 문제는 병합을 위해 인접한 세그먼트를 선택한다는 점이다 세그먼트의 크기와 상관없이 인접한 세그먼트끼리 병합하다 보니 큰 세그먼트와 작은 세그먼트간의 병합이 자주 발생하고 병합의 성과를 얻기도 전에 바로 다음 병합의 대상이 되기도 한다 이처럼 잦은 병합은 성능에 악영향을 미치기 때문에 이 문제를 보완하기 위해 새로운 병합 정책 TieredMergePolicy이 나오게 되었다

     

    해당 정책은 용량을 계층으로 구성하여 비슷한 용량 세그먼트끼리 병합을 한다

    이유는 이미 세그먼트가 거대해진 세그먼트는 작은 세그먼트의 비해 병합이 자주 발생 될 이유가 없으므로 그 횟수를 줄여 커다란 성능 향상을 가져왔다

     

     

    루씬 7의 세그먼트 병합 스케줄러는 크게 2가지가 있다

    병렬 병합 스케줄러(ConcurrentMergeScheduler): 기본 병합 스케줄러로 독자적인 스레드로 동작한다 지정된 스레드 수만큼 동시에 병합을 한다

    직렬 병합 스케줄러(SerialMergeScheduler): 현재 스레드를 사용해 순차적으로 병합한다

     

     

    참조

    http://blog.mikemccandless.com/2011/02/visualizing-lucenes-segment-merges.html

     

    Visualizing Lucene's segment merges

    If you've ever wondered how Lucene picks segments to merge during indexing, it looks something like this: That video displays segment merges...

    blog.mikemccandless.com

    실전 비급 아파치 루씬

    반응형

    댓글

Designed by Tistory.