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):
동일한 요청에 대해 반복적으로 발생하는 검색 결과를 캐싱하여 응답 속도를 개선
- 필드 데이터(Field Data):
파일 시스템 캐시 (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) 문자열 필드의 값에 따라 정렬하거나 집계를 수행할 때 사용.
엘라스틱서치에서 메모리, 디스크, 캐시 접근 과정 요약
- 메모리(Memory)
JVM 힙 메모리와 파일 시스템 캐시로 나누어져 사용되며, 필드 데이터, 역 인덱스, 캐시된 결과 등을 저장 - 디스크(Disk)
인덱싱과 병합 과정에서 주로 사용
인덱스와 샤드 데이터를 영구적으로 저장하며, 세그먼트 파일과 역 인덱스 데이터 구조를 포함 - 캐시(Cache)
필터 캐시, 리퀘스트 캐시, 필드 데이터 캐시 등을 통해 검색 성능을 최적화하며, 자주 사용되는 데이터를 메모리에 저장하여 디스크 접근을 줄임