엘라스틱서치:: 내부구조와 루씬
🙈

엘라스틱서치:: 내부구조와 루씬

Created
Jun 4, 2024 07:06 AM
Last edited time
Last updated June 7, 2024
Tags
ElasticSearch
Language
URL

Intro::

문서를 색인하고 검색하는 라이브러리인 루씬의 동작 특성과 엘라스틱서치에서의 활용에 대해 알아봅시다.

루씬 flush

문서 색인 요청이 들어오면 루씬은 문서를 분석해서 역색인을 생성한다. 최초 생성 자체는 메모리 버퍼에 들어간다. 문서 색인, 업데이트, 삭제 등의 작업이 수행되면 루씬은 이러한 변경들을 메모리에 들고 있다가 주기적으로 디스크에 flush한다.
 
루씬은 색인한 정보를 파일로 저장하기 때문에 루씬에서 검색을 하려면 먼저 파일을 열어야 한다. 루씬은 파일을 연 시점에 색인이 완료된 문서만 검색할 수 있습니다. 이후 색인에 변경사항이 발생했고, 그 내용을 검색 결과에 반영하고 싶다면 파일을 새로 열어야 합니다.
 
엘라스틱서치 내부적으로 루씬을 사용해 파일을 열고, 색인을 위해 변경 사항을 적용한 뒤 기존 인덱스를 안전하게 닫아주는 작업을 종합해서 refresh 라고 합니다.

루씬 commit

루씬의 flush는 시스템의 페이지 캐시에 데이터를 넘겨주는 것까지만 보장할 뿐 디스크에 파일이 실제로 안전하게 기록되는 것까지 보장하지 않는다. 따라서 루씬은 fsync 시스템 콜을 통해 주기적으로 커널 시스템의 페이지 캐시의 내용과 실제로 디스크에 기록된 내용의 싱크를 맞추는 작업을 수행하고, 이를 루씬 commit이라고 합니다.
 
엘라스틱서치의 flush 작업은 내부적으로 이 루씬 commit을 거칩니다. 루씬의 flush와 엘라스틱서치의 flush는 다른 개념이기 때문에 혼동하면 안됩니다. 엘라스틱서치 flush는 엘라스틱서치 refresh보다도 훨씬 비용이 드는 작업입니다. 그렇기 때문에 refresh와 마찬가지로 적절한 주기로 수행됩니다.
 
간혹 fsync 중에도 하드웨어 캐시를 사용하는 일부 저장장치가 있는데, 루씬은 그러한 장비를 사용하는 환경에서 하드웨어 실패가 나는 상황까지 데이터 정합성을 보장하지 않습니다.
 

세그먼트

앞의 작업을 거쳐 디스크에 기록된 파일들이 모이면 세그먼트라는 단위가 됩니다. 세그먼트가 루씬의 검색 대상으로 세그먼트 자체는 불변인 데이터로 구성돼 있습니다. 새로운 문서가 들어오면 새 세그먼트가 생성됩니다. 기존 문서를 삭제하는 경우 삭제 플래그만 표시해 둡니다. 기존 문서에 업데이트가 발생한 경우에는 삭제 플래그를 표시하고 새 세그먼트를 생성합니다.
루씬의 검색은 모든 세그먼트를 대상으로 수행됩니다. 불변인 세그먼트의 개수를 무작정 늘려갈 수는 없기 때문에 루씬은 중간중간 적당히 세그먼트의 병합을 수행합니다. 세그먼트 병합이 수행될 때 삭제 플래그가 표시된 데이터를 실제로 삭제하는 작업도 수행합니다.
세그먼트 병합은 비싼 작업이지만 병합을 하고 난다면 검색 성능의 향상을 기대할 수 있습니다.
 

루씬 인덱스와 엘라스틱서치 인덱스

여러 세그먼트가 모이면 하나의 루씬 인덱스가 되며, 이 인덱스 내에서만 검색이 가능합니다. 엘라스틱서치 샤드는 이 루씬 인덱스 하나를 래핑한 단위입니다. 엘라스틱서치 샤드 여러 개가 모이면 엘라스틱서치 인덱스가 됩니다. 새 문서가 들어오면 해당 내용을 라우팅하여 여러 샤드에 분산시켜 저장, 색인합니다. 이후 클라이언트가 엘라스틱서치에 검색 요청을 보내면 엘라스틱서치는 해당하는 각 샤드를 대상으로 검색을 한 뒤 그 결과를 모아 병합하여 최종 응답을 만듭니다. 이런 구조를 통해 루씬 레벨에서 불가능한 분산 검색을 엘라스틱서치 레벨에서는 가능하게 만들었습니다.

translog

엘라스틱서치에 색인된 문서들은 루씬 commit까지 완료되어야 디스크에 안전하게 기록됩니다. 그렇다고 문서에 변경사항이 있을 때마다 루씬 commit을 수행하기에는 commit은 큰 비용이 드는 작업입니다. 하지만 변경사항을 모아서 commit한다면 장애가 발생할 때 미처 commit되지 않은 데이터가 유실될 우려가 있습니다. 이러한 문제를 해결하기 위해 엘라스틱서치 샤드는 모든 작업마다 translog라는 이름의 작업 로그를 남깁니다.
translog는 색인, 삭제 작업이 루씬 인덱스에 수행된 직후에 기록됩니다. translog 기록까지 끝난 이후에야 작업 요청이 성공으로 승인됩니다. 엘라스틱서치에 장애가 발생한 경우 엘라스틱서치는 샤드 복구 단계에서 translog를 읽습니다. translog 기록은 성공했지만 루씬 commit에 포함되지 못했던 작업 내용이 있다면 샤드 복구 단계에서 복구됩니다.
 

References::

엘라스틱 서치 바이블 - 여동현 지음

Loading Comments...