BE 공부/검색엔진

[ElasticSearch] 메모리, 디스크, 캐시 접근 과정

꼬질꼬질두부 2024. 8. 29. 16:46

1. 메모리(Memory)

JVM 힙 메모리

  • 엘라스틱서치가 자바 가상 머신(JVM) 위에서 실행되기 때문에 JVM 힙 메모리를 사용
  • 주로 필드 데이터(Field Data), 집계(Aggregations), 필터 캐시(Filter Cache), 리퀘스트 캐시(Request Cache) 등을 저장
  • 각 용어 설명
    • 필드 데이터(Field Data):
      데이터를 메모리에 로드해 문자열 필드를 기준으로 하는 검색 및 집계 작업에서 주로 사용
    • 집계(Aggregations):
      엘라스틱서치가 복잡한 집계 쿼리를 처리할 때 데이터가 메모리에 로드됨
    • 필터 캐시(Filter Cache):
      반복적으로 사용되는 검색 필터의 결과를 캐싱하여 검색 성능을 향상
    • 리퀘스트 캐시(Request Cache):
      동일한 요청에 대해 반복적으로 발생하는 검색 결과를 캐싱하여 응답 속도를 개선

파일 시스템 캐시 (Filesystem Cache)

운영 체제(OS)의 파일 시스템 캐시

인덱스의 세그먼트를 디스크에서 메모리로 읽어와 캐싱

  • 작동 방식
    세그먼트 데이터를 파일 시스템 캐시에 저장. 운영 체제에 의해 관리되며, 자주 액세스되는 데이터가 메모리에 캐시됨 → 읽기 요청이 디스크 대신 메모리에서 직접 이루어질 수 있도록 하여

2. 디스크(Disk)

인덱스와 샤드를 디스크에 영구적으로 저장.

디스크 사용의 주요 요소

  • 인덱스(Index):
    • 세그먼트(Segments):각 세그먼트는 독립적인 루씬(Lucene) 인덱스로, 읽기 전용 파일의 집합
    • 데이터는 여러 개의 작은 세그먼트로 나누어 저장됨.
    • 역 인덱스(Inverted Index):각 단어와 해당 단어가 등장하는 문서 위치 정보를 저장
    • 텍스트 검색을 위한 주요 데이터 구조
    • 스토어드 필드(Stored Fields):검색 결과로 반환할 데이터
    • 원본 문서 데이터를 포함하여 디스크에 저장되는 필드
  • 디스크 I/O:
    • 인덱싱:특정 조건(예: 메모리 버퍼가 가득 찰 때)에서 디스크에 플러시(flush)하여 새로운 세그먼트를 생성.여러 개의 작은 세그먼트를 병합하여 디스크 공간을 최적화하고 검색 성능을 향상
    • 병합 과정에서 디스크 쓰기 작업이 활발히 발생
    • 세그먼트 병합(Merge):
    • 새로운 문서가 인덱싱될 때, 메모리 버퍼에 데이터가 기록됨.

3. 캐시(Cache)

자주 사용되는 데이터를 메모리에 저장하여 디스크 접근을 최소화하고, 전체 검색 속도를 향상시킴

캐시의 종류

  • 필터 캐시(Filter Cache):
    • 역할: 검색 필터의 결과를 캐싱하여 반복적인 필터링 작업의 성능을 향상시킴.
    • ex) 자주 사용되는 범위 쿼리나 용어 쿼리 결과를 캐싱
  • 리퀘스트 캐시(Request Cache):
    • 역할: 동일한 요청이 반복될 때 해당 요청의 결과를 캐싱하여 응답 속도를 빠르게 도움
    • ex) 동일한 검색 쿼리가 여러 번 발생할 경우, 이전의 검색 결과를 반환
  • 필드 데이터 캐시(Field Data Cache):
    • 역할: 집계 및 정렬 작업을 위해 필드 데이터를 메모리에 로드하여 사용하는 캐시
    • ex) 문자열 필드의 값에 따라 정렬하거나 집계를 수행할 때 사용.
    •  
엘라스틱서치에서 메모리, 디스크, 캐시 접근 과정 요약
  1. 메모리(Memory)
    JVM 힙 메모리와 파일 시스템 캐시로 나누어져 사용되며, 필드 데이터, 역 인덱스, 캐시된 결과 등을 저장
  2. 디스크(Disk)
    인덱싱과 병합 과정에서 주로 사용
    인덱스와 샤드 데이터를 영구적으로 저장하며, 세그먼트 파일과 역 인덱스 데이터 구조를 포함
  3. 캐시(Cache)
    필터 캐시, 리퀘스트 캐시, 필드 데이터 캐시 등을 통해 검색 성능을 최적화하며, 자주 사용되는 데이터를 메모리에 저장하여 디스크 접근을 줄임