Elastic Search

[Elasticsearch] 색인

꾸준함. 2024. 6. 28. 23:55

색인이 동작하는 과정

  • 여러 개의 Primary 샤드로 구성되어 있는 경우 hash(_id) % (샤드 개수)로 샤딩이 이루어짐
  • MurmurHash3 알고리즘 사용
    • 해시 테이블에서 키를 빠르고 균일하게 분산시키기 위해 사용되는 비암호화 해시 함수
    • Elasticsearch에서는 색인 시 문서의 필드를 고유한 키 값으로 변환하는 데 사용되며 해당 알고리즘은 매우 빠르고 충돌 가능성이 낮아 널리 사용

 

Apache Lucene 색인

  • 새 문서가 Apache Lucene에 색인되면 바로 디스크에 즉시 기록되는 대신 in-memory buffer에 analyzer에 의해 analyze 된 문서가 저장됨
    • 바로 디스크에 저장하지 않고 in-memory buffer를 거치는 이유는 I/O 횟수를 절약하기 위해 그리고 롤백에 용이하기 때문 (디스크에 쓰기 이전에 롤백해야 할 경우 단순히 in-memory buffer만 이전 상태로 돌리면 됨)
    • in-memory buffer는 노드가 가진 heap 메모리의 10% 정도를 사용
    • in-memory buffer 저장된 문서들은 refresh, flush, 혹은 버퍼가 가득 찬 경우 flush라는 과정을 통해 디스크에 저장됨

 

https://alibaba-cloud.medium.com/analysis-of-lucene-basic-concepts-5ff5d8b90a53

 

1. Lucene Flush

  • in-memory buffer로부터 새로운 세그먼트를 생성하는 과정이며 이때 시스템 캐시에 데이터를 씀
  • 디스크에 바로 쓰는 것보다 빠르며 세그먼트가 생성이 되었기 때문에 검색 가능한 상태
  • 하지만 메모리에 저장이 되어 있기 때문에 데이터 유실의 위험 존재
  • Elasticsearch API로 보면 refresh API

 

2. Lucene Commit

  • 디스크에 데이터를 쓰는 과정이며 물리 디스크에 세그먼트를 생성하고 저장
  • 디스크에 쓰는 만큼 I/O 리소스가 더 들지만 메모리에 저장하는 것보다 안전한 상태
  • Elasticsearch API로 보면 flush API

 

세그먼트

  • 검색 인덱스를 구성하는 단위
  • 문서들의 집합을 포함하고 있으며 각각의 세그먼트는 인덱스를 검색하는데 필요한 데이터 구조와 정보를 지님
  • 하나의 샤드는 하나의 Apache Lucene 인스턴스이며 N개의 세그먼트로 구성됨
  • Apache Lucene은 세그먼트 단위로 인덱스를 관리함으로써 검색 속도를 향상하고 색인 작업을 효율적으로 수행
  • 디스크에 단 한번만 저장되고 업데이트되지 않음(immutable)
    • 각 인덱스에 색인을 위해 생성한 데이터의 묶음이 한 번 세그먼트화되면 수정 X
    • 인덱스를 업데이트하는 경우 새로운 세그먼트를 생성하고 기존의 세그먼트는 유지
    • 삭제 시에는 삭제되었다는 flag로 관리함 (soft-delete)
    • 이로써 멀티 쓰레드 환경에서 안전성이 올라가고 동시성 문제를 해결할 수 있으며 빠른 색인에 도움이 됨

 

1. 세그먼트 머지

  • 각 세그먼트는 여러 개의 문서를 포함하고 있으며 여러 개의 파일로 구성됨
  • 쿼리는 모든 세그먼트를 순차적으로 돌기 때문에 파일이 많으면 부하가 심해짐
  • 따라서 세그먼트 머지를 통해 여러 개의 작은 세그먼트를 하나로 병합하여 불필요한 정보들을 제거하고 성능 향상 도모함에 따라 디스크 I/O 작업이 줄어들어 검색 및 색인 작업을 효율적으로 수행 가능
  • 샤드 레벨에서 자동적으로 주기적으로 수행되며 일반적으로 백그라운드에서 비동기적으로 진행
  • force merge를 통해 강제로 머지할 수 있지만 많은 양을 강제로 머지하게 되면 큰 사이즈의 세그먼트가 생기게 되고 이를 위한 작업에 디스크 I/O가 다량으로 발생 가능
    • 쓰기 작업이 없는 인덱스 혹은 읽기 전용의 인덱스에서 수행하는 것을 권장

 

2. 세그먼트가 사용하는 자료구조 및 알고리즘

  • Apache Lucene은 기본적으로 검색을 위해 만들어진 Inverted Index 기반의 LSM Tree 자료구조를 사용
    • RDB는 인덱스에 보통 B+ 트리를 사용하는 반면 NoSQL 진영은 대부분 LSM Tree 사용
    • LSM Tree는 Log-Structured Merge-Tree의 줄임말로 쓰기 집중적인 작업에 효율적
    • LSM Tree는 메모리에 데이터를 먼저 쓴 후 이후에 디스크에 비동기적으로 데이터를 쓰는 방식을 사용
    • 인덱싱을 할 때 term을 키로 해당 term이 포함된 문서를 value로 저장하는 방식을 위해 사용 가능하며 세그먼트 관리에도 마찬가지로 사용됨

 

3. 샤드, 인덱스, 세그먼트의 관계

  • 하나의 샤드는 하나의 Apache Lucene 인스턴스를 의미하며 하나의 샤드 자체가 검색 엔진으로써 동작할 수 있음
  • 샤드는 종류에 따라 Primary 샤드와 Replica 샤드로 구성됨
  • 여러 인덱스가 하나의 샤드에 저장되어 관리됨
  • 하나의 인덱스는 여러 세그먼트의 모음
  • 정리하자면 
    • 노드 : 샤드 = 1 : N
    • 샤드 : 인덱스 = 1 : N
    • 인덱스 : 세그먼트 = 1 : N

 

참고

  • 패스트 캠퍼스 -  고성능 검색 엔진 구축으로 한 번에 끝내는 Elasticsearch
반응형

'Elastic Search' 카테고리의 다른 글

[Elasticsearch] Elasticsearch 구성할 때 유의할 점  (0) 2024.07.19
[Elasticsearch] 최적화를 위한 시스템 설정  (0) 2024.07.13
[Elasticsearch] 검색  (0) 2024.06.28
[Elasticsearch] ILM  (0) 2024.06.27
[ELK] Beats 정리  (0) 2024.06.25