Elastic Search

Ch09. 엘라스틱서치와 루씬 이야기 - 샤드 VS 루씬 인덱스

webmaster 2025. 10. 7. 00:15
728x90

엘라서틱서치는 루씬 라이브러리를 샤드 내부에 가지고 있으며, 이 루씬 라이브러리가 핵심 모듈이다. 루씬은 다수의 클래스로 구성돼있는 검색 라이브러리고, 이 중 핵심은 indexwriter와 indexSearcher이다.

  • indexwriter: 데이터를 색인하는 클래스
  • indexSearcher: 색인된 데이터를 검색 결과로 제공하는 클래스

indexwriter와 indexSearcher를 가지고 색인과 검색을 동시에 제공하는 루씬 인스턴스를 루씬 인덱스라고 하며, 하나의 샤드는 하나의 인덱스라고 보면 된다. 즉, 엘라스틱서치 인덱스는 물리적으로 분산된 엘라스틱서치 샤드를 논리적인 관점에서 하나의 거대한 데이터로 바라보는 것이다.

 

루씬 인덱스 상세

  • 루씬 인덱스 내부에는 세그먼트라는 특수한 자료구조가 다수 존재한다.
  • 루씬 인덱스는 세그먼트를 통해 검색을 수행하며, 세그먼트는 내부적으로 역색인 구조라, 빠른 검색 결과를 얻을 수 있다.

단, 샤드가 루씬 인덱스 그 자체는 아니지만,(엘라스틱서치에서 추가한 다양한 기능이 포함이 되어있다.) 그 본질은 루씬 인덱스라는 것을 명심하자.

 

샤드

  • 엘라스틱서치는 독립적인 루씬 인덱스를 엘라스틱서치 샤드라는 형태로 확장해서 제공한다.
  • 샤드는 모든 샤드가 가지고 있는 세그먼트들을 논리적으로 통합해서 검색할 수 있다.
  • 다수의 인스턴스 간에 데이터를 분산 저장할 수 있는 근간이 되며, 이를 통해 분산 클러스터 구축이 가능해진다.
  • 다수의 샤드와 레플리카를 하나로 묶어서 클러스터를 구성하고, 이러한 과정은 사용자에게 블랙박스로 숨겨진다.
종류 개념 특징
세그먼트 루씬 내부에 존재하는 자료 구조 - 역색인 구조로 생성되어 읽기에 최적화
- 하나의 루씬 내부에서만 존재할 수 있고 확장이 불가능
루씬 인덱스 검색과 색인 기능을 가진 최소한의 검색엔진 - IndexWriter로 색인 과정을 통해 세그먼트 생성
- IndexSearcher로 세그먼트를 검색
- 자신이 가진 세그먼트 내에서만 검색 가능
엘라스틱서치 샤드 엘라스틱서치에서 제공하는 가장 작은 단위의 검색엔진 - 내부적으로 루씬을 확장해서 검색엔진 역할 수행
- 다수의 샤드가 협력해서 존재하는 모든 세그먼트 검색 가능

 

 

루씬 인덱스의 경우 데이터를 저장할 떄 물리 머신이 제공하는 리소스의 한계를 뛰어넘을 수 없는 단점을 엘라스틱 서치는 샤드를 바탕으로 클러스터를 구축 대용량 데이터를 색인/검색 을 할 수 있게 되었다. 엘라스틱서치는 기본적으로 분산 처리되도록 설계되었기 때문에 대용량 데이터를 손쉽게 다루고 서비스할 수 있다.
서비스를 운영하다 보면 데이터가 커지고 그에 따라 성능 문제가 발생할 가능성이 커지고 문제를 해결하기도 어려워진다. 클러스터에 성능 문제가 발생하면 샤드 수에 대한 고민을 다시 하게 되는데, 샤드는 운영 중에 변경이 불가능하므로 처음 인덱스를 설계할 떄 데이터 크기에 대한 고민이 필요하며 그에 따른 샤드 수를 신중하게 결정해야 한다.

728x90