본문 바로가기

프로젝트/고민

Elasticsearch 도입 이야기: Elasticsearch란?

ES를 적용하게 된 계기

위의 기사만 봐도 알 수 있듯이 우리는 조회하는 작업과 생성하는 작업 중 조회하는 작업을 압도적으로 많이 한다. 예를 들어 뉴스 기사, 블로그 글을 보더라도 1개의 생성물에 수많은 조회를 한다. 이에 나는 프로젝트에서 조회가 많이 발생하는 도메인에 조회 전용의 리포지토리가 있으면 좋겠다는 생각을 하게 됐다.

따라서 검색에 특화되어 있는 검색엔진인 elasticsearch를 적용하게 됐다.

 

elasticsearch란

  • Elasticsearch는 Apache Lucene 기반의 Java 오픈소스 분산형 RESTful 검색 및 분석 엔진이다.
  • JSON 문서(Document)로 데이터를 저장하기 때문에 정형 데이터, 비정형 데이터, 지리 데이터 등 모든 타입의 데이터를 처리할 수 있다.
  •  방대한 양의 데이터에 대해 실시간으로 저장과 검색 및 분석 등의 작업을 수행할 수 있다.

 

용어 정리 및 RDB와 비교

ES는 RDB와 다른 구조를 갖고 있기 때문에 다른 용어를 사용한다. 따라서 각 용어에 대한 이해를 할 필요가 있다.

 

ES가 데이터를 저장하고 조회하는 과정

  • 색인 (Indexing): 데이터가 검색될 수 있는 구조로 변경하기 위해 원본 문서를 검색어 토큰들로 변환 & 저장하는 과정
  • 인덱스 (Index): 색인 과정을 거친 결과물인 색인된 데이터가 저장되는 저장소
  • 검색 (Search): 인덱스에 들어있는 검색어 토큰들을 포함하고 있는 문서를 찾아가는 과정
  • 질의 (Query): 사용자가 원하는 문서를 찾거나 집계 결과를 출력하기 위해 검색 시 입력하는 검색어 또는 검색 조건

시스템 구조

 

 

  • Index
    • ElasticSearch의 가장 큰 데이터 단위 (Database)
    • Document를 모아둔 집합
  • Type
    • Document를 유형별로 모아놓은 집합 (Table)
  • Document
    • ElasticSearch의 단일 데이터 단위 (Row)
    • json 개체

 

아키텍처

  • Cluster
    • 최소 하나 이상의 노드로 이루어진 노드들의 집합을 의미한다.
    • 서로 다른 클러스터는 데이터의 접근 및 교환을 할 수 없는 독립적인 시스템으로 유지된다.
    • 여러 대의 서버가 하나의 클러스터를 구성하거나, 하나의 서버에 여러 개의 클러스터가 존재할 수 있다.
  • Node
    • Elasticsearch를 구성하는 하나의 단위 프로세스를 의미합니다.
  • Shard
    • 데이터를 분산해서 저장하는 방법을 의미한다.
    • Scale-Out을 위해 RDB의 Database에 해당하는 Index를 여러 Shard로 쪼갠다.
    • 기본적으로 1개가 존재하며, 검색 성능 향상을 위해 클러스터의 Shard 개수를 조정할 수 있습니다.
  • Replica
    • 또 다른 형태의 Shard를 의미한다.
    • 노드를 손실했을 경우, 데이터의 신뢰성을 위해 Shard를 복제하는 것이다.
    • 따라서 Replica는 서로 다른 노드에 위치시킬 것을 권장하고 있습니다.

 

  •  

단일 노드로 Elasticsearch를 구동할 수 있지만, 트래픽이 많아진다면 노드별로 서버를 분리하거나 작업 노드에 대해 Scale-Out 및 로드 밸런싱을 함으로써 성능을 향상시킬 수 있다.

 

역색인

ES가 RDB보다 빠른 핵심 이유인 역색인에 대해서 알아보자(ES의 언어를 사용하니 RDB의 언어와 헷갈리지 말자)

 

 

일반적으로 오라클이나 MySQL 같은 관계형 DB에서는 위 내용을 보이는 대로 테이블 구조로 저장을 한다. 만약에 위 테이블에서 Text 에 fox가 포함된 행들을 가져온다고 하면 다음과 같이 Text 열을 한 줄씩 찾아 내려가면서 fox가 있으면 가져오고 없으면 넘어가는 식으로 데이터를 가져 올 것이다.

 

 

전통적인 RDBMS 에서는 위와 같이 like 검색을 사용하기 때문에 데이터가 늘어날수록 검색해야 할 대상이 늘어나 시간도 오래 걸리고, row 안의 내용을 모두 읽어야 하기 때문에 기본적으로 속도가 느리다. Elasticsearch는 데이터를 저장할 때 다음과 같이 역 인덱스(inverted index)라는 구조를 만들어 저장한다.

 

 

이렇게 역 인덱스가 있으면 fox를 포함하고 있는 도큐먼트들의 id를 바로 얻어올 수 있다.

 

 

Elasticsearch는 데이터가 늘어나도 찾아가야 할 행이 늘어나는 것이 아니라 역 인덱스가 가리키는 id의 배열값이 추가되는 것 뿐이기 때문에 큰 속도의 저하 없이 빠른 속도로 검색이 가능하다. 이런 역 인덱스를 데이터가 저장되는 과정에서 만들기 때문에 Elasticsearch는 데이터를 입력할 때 저장이 아닌 색인을 한다고 표현한다.

 

마치며

Elasticsearch을 사용하기에 앞서 ES의 기본적인 구조와 용어를 공부했다. 깊은 내용은 다음의 링크를 참고하자 https://esbook.kimjmin.net/ 

다음 글에서는 현재 진행중인 프로젝트에 ES를 적용하는 과정을 설명하도록 하겠다. 

 

참고 https://esbook.kimjmin.net/06-text-analysis/6.1-indexing-data