ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • elasticsearch segments 2부
    elasticsearch 2021. 3. 27. 11:58
    반응형

    색인 작업 시 세그먼트의 기본 동작 방식

    루씬 인덱스는 내부적으로 다수의 세그먼트로 구성되어 있다

    루씬은 검색 요청을 받으면 다수의 세그먼트 조각들이 각각 검색 결과를 만들어 내고 이를 통합해서 하나의 결과로

    합쳐서 응답하도록 설계되어 있다 이러한 검색 방식을 세그먼트 단위 검색(Per-Segment Search)라고한다

    루씬은 위의 이미지와 같이 세그먼트들을 관리하기 위한 용도로 커밋 포인트(Commit Point)라는 자료구조를 제공한다 커밋 포인트는 여러 세그먼트의 목록 정보를 가지고 이고 검색시 이를 적극적으로 활용한다

    루씬의 IndexSearcher는 검색 요청시 커밋 포인트를 이용해 가장 오래된 세그먼트부터 차례대로 검색한 후 각 결과를 하나로 합쳐서 제공한다

     

    색인 요청이 루씬에 들어오면 IndexWriter에 의해 색인 작업이 이뤄지고 결과물로 하나의 세그먼트가 생성된다

    그 후 색인 요청이 들어올 때 마다 새로운 세그먼트가 만들어 지고 커밋 포인트에 기록된다

     

    검색 작업을 요청할 때는 IndexSearcher가 커밋 포인트를 이용해 모든 세그먼트를 읽어 검색 결과를 제공한다

    내부에 존재하는 모든 세그먼트를 읽어서 결과를 제공한다

     

    하지만 시간이 흐를 수록 세그먼트의 개수는 엄청 많아지고 읽기 성능은 저하된다 그래서 루씬은 백그라운드에서 주기적으로 파일을 머지하는 작업을 수행하고 이를통해 모든 세그먼트들은 물리적으로 하나의 파일로 병합된다

     

    정책에 따라서 몇개의 세그먼트가 하나로 합쳐지고 이런 과정을 반복해서 거치다보면 결국 하나의 세그먼트가 남게 된다

    루씬에 데이터 추가 작업이 요청되면 IndexWriter는 다음과 같이 동작을 한다

    1. 최초 색인이 요청된 경우
      1. IndexWriter가 세그먼트를 생성한다.
      2. IndexSearcher가 생성된 세그먼트를 읽어 검색을 제공한다
    2. 추가 색인이 요청된 경우
      1. IndexWriter가 세그먼트를 추가 생성한다
      2. 세그먼트가 추가 생성되는 동안 기존 세그먼트만 읽어 검색 결과를 제공한다
    3. 주기적으로 세그먼트 Merge 작업이 일어날 경우
      1. IndexWriter가 Merge 대상이 되는 세그먼트들을 복제한다.
      2. IndexWriter가 복제한 세그먼트들을 하나의 세그먼트로 합친다.
      3. 복제본 세그먼트들이 하나로 합쳐지는 동안 IndexSearcher는 원본 세그먼트를 읽어 검색 결과를 제공한다.
      4. 복제본 통합 작업이 완료되면 원본 세그먼트와 교체하고 교체된 원본 세그먼트들은 삭제한다
      5. IndexSearcher는 새로운 세그먼트를 읽어 검색 결과를 제공한다

     

    세그먼트의 불변성으로 인한 장점

    1. 세그먼트는 불변이기 때문에 lock이 필요 없다 다수의 쓰레드가 동작하는 복잡한 다중 스레드 환경에서 동시성 문제는 매우 심각한 결과를 만드는데 수정이 불가능하다면 동시성 문제를 피해갈 수 있고 row lock이 걸리지 않으니 준 실시간 검색(Near Real Time)으로 검색이 가능하다.
    2. os에서 제공하는 시스템 캐시에 한번 생성되면 일정 시간 동안 유지된다 불변성을 보장하지 않을 경우 데이터가 변경될 때마다 시스템 캐시를 삭제하고 다시 생성해야 하는데 성능 측면에서 비용이 드는 작업 이므로 지양해야한다. 불변성을 제공함으로써 적극적으로 시스템 캐시를 활용할 수 있다
    3. 높은 캐시 적중률을 유지할 수 있다 시스템 캐시에서 데이타를 읽어 올 수 있다는 의미로 매우 큰 성능 향상을 올릴 수 있다
    4. 역색인을 만드는 과정에서 많은 시스템 리소스(CPU, Memory, I/O)가 사용된다 수정을 허용하면 일부분이 변경되더라도 해당 역색인을 대상으로 작업해야 하기 때문에 많은 시스템 리소스가 소모된다 수정을 허용하지 않음으로써 리소스가 절감 된다

     

    세그먼트 불변성의 삭제와 업데이트

    모든 도큐먼트에는 삭제 여부를 표시하는 비트 배열이 내부적으로 존재하는데 삭제 요청이 들어오면 삭제 될 대상 데이터의 비트 배열을 찾아 삭제 여부만 표시하고 끝낸다

    수정 요청시에는 위와 같이 해당 도큐먼트에 삭제 표시를 하고 세그먼트를 새로 추가하는 방식으로 동작한다

    1. 세그먼트에서 데이터가 삭제 될 경우
      1. 루씬은 삭제될 데이터가 포함된 세그먼트의 삭제 여부 비트 배열을 확인한다
      2. 삭제 여부 비트 배열의 flag를 삭제로 표시한다
      3. 세그먼트에 직접적인 변경사항은 없으므로 세그먼트의 불변성을 해치지 않으며 캐시도 그대로 유지된다
      4. IndexSearcher는 검색 작업 시 삭제 여부 비트 배열을 항상 먼저 확인하고 삭제 여부가 체크된 데이터를 검색 결과에서 제외한다
    2. 세그먼트에서 일부 데이터가 수정 될 경우
      1. 앞의 작업(세그먼트에서 데이터가 삭제 될 경우)으로 삭제 처리를 먼저 수행한다
      2. 수정된 데이터를 새로운 세그먼트로 생성한다
      3. IndexSearcher는 모든 세그먼트를 읽어 검색 결과를 제공한다

     

    해당 내용은 "엘라스틱서치 실무 가이드"를 요약 정리하였습니다

    www.yes24.com/Product/Goods/71893929

     

    엘라스틱서치 실무 가이드

    『엘라스틱서치 실무 가이드』는 오픈소스 검색엔진의 대표 주자인 엘라스틱서치에 대한 전반적인 내용을 다룬다. 하지만 단순히 엘라스틱서치의 기능을 단편적으로만 설명하고 끝내는 것이

    www.yes24.com

     

    반응형

    댓글

Designed by Tistory.