엘라스틱서치 알아보기 프로젝트는 엘라스틱서치 실무가이드의 목차와 내용을 참조하였습니다. 이 포스트를 읽는 분들이라면 엘라스틱서치 실무가이드 책을 한권 반드시 구매하는 것을 권장합니다.

엘라스틱서치 용어 및 개념 간단히 살펴보기

IT 관련 지식을 공부할 때, 초기에 가장 중요하게 잡고 가야 하는 것이 용어(Term) 라고 생각합니다. 용어의 정의가 제대로 정립되지 않은 채, 무작정 책을 읽기만 하면 모든 것들이 혼란스러워지기 마련입니다.

엘라스틱서치에서 어떠한 용어들이 사용되고 그것들이 의미하는 것이 무엇인지 제대로 파악해봅시다. 용어의 정의를 파악하면 전체적인 아키텍쳐의 파악에도 물론 도움이 됩니다.

엘라스틱서치에서 사용되는 주요 용어

인덱스(Index)

엘라스틱서치의 '인덱스(Index)' 는 관계형 데이터베이스에서 '데이터베이스(Database)' 에 상응하는 개념입니다. 즉, 인덱스는 데이터가 저장되는 공간입니다. 엘라스틱서치 버전 6.1 이후로 하나의 인덱스는 하나의 타입만 가질 수 있습니다. 참고로 '타입(Type)' 은 데이터베이스에서 '테이블(Table)' 에 상응하는 개념입니다.

인덱스 그리고 멀티테넌시

엘라스틱서치의 인덱스가 관계형 데이터베이스에서 데이터베이스에 상응하는 개념이지만, 몇가지 차이가 있는데 그 중 주목할만한 것은 여러 인덱스를 동시에 검색할 수 있다는 것입니다. 관계형 데이터베이스에서는 쿼리 하나만을 이용하여 각각 다른 데이터베이스에 있는 데이터를 동시에 조회하는 것은 불가능합니다. 하지만 엘라스틱서치는 여러 개의 인덱스를 동시에 조회 가능합니다.

이전 글에 배웠듯 앞서 설명한 기능을 '멀티 테넌시(Multi Tenancy)' 라고 합니다. 인덱스마다 별도의 커넥션을 생성할 필요가 없습니다.

인덱스 그리고 분산환경

엘라스틱서치를 분산 환경으로 구성했을 때, 인덱스는 여러 노드에 분산되어 저장, 관리됩니다. 이러한 특성은 분산 처리의 장점을 이용할 수 있게 해줍니다. 기본 설정은 5개의 프라이머리 샤드와 1개의 레플리카 샤드를 생성합니다. 샤드 수는 인덱스 생성 시에 옵션 값을 이용하여 변경 가능합니다.

인덱스 그리고 스키마리스

관계형 데이터베이스에서는 데이터베이스를 생성하지 않고 데이터를 넣는다는 것은 말도 안되지만, 엘라스틱서치에서는 인덱스가 존재하지 않는 상태에서 특정 인덱스에 데이터를 넣는 것이 가능합니다. 이러한 기능을 '스키마리스(Schemaless)' 라고 하는데, 스키아 없이 문서 분석 결과를 기반으로 문서가 색인될 수 있게 인덱스를 자동으로 생성하는 것을 말합니다. 하지만 이 방법은 권장되지 않습니다. 그 이유는 성능 때문인데, 굳이 이 기능을 이용해야 한다면, 데이터 구조 및 검색 방식을 확실히 이해해야 합니다.

그리고 스키마리스로 어떤 데이터를 색인한다고 가정하면, 'text' 타입을 색인할 때, Standard Analyzer라는 기본 분석기를 사용하게 됩니다. 이 분석기는 한글을 위한 분석기가 아니어서 띄어쓰기를 기준으로 형태소 분석을 하게 되는데, 그렇게 되면 우리가 전혀 의도하지 않은 분석 결과가 나올 수 있습니다. 그렇기에 스키마리스를 이용한 인덱스 생성은 항상 주의가 필요합니다.

엘라스틱서치 내부의 환경설정값 변경을 이용하여, 이러한 현상을 미연에 방지할 수 있습니다. 노드 설정 파일에서 action.auto_create_index 를 false로 설정하면 인덱스가 자동 생성되지 않습니다. 또한 인덱스 별로 제공되는 index.mapper.dynamic 설정을 false로 설정하면, 특정 칼럼의 자동 매핑 생성을 비활성화 할 수 있습니다.

기타 알아두면 좋은 것

인덱스의 이름은 모두 소문자여야 합니다.
CRUD 명령은 'RESTful API' 로 가능합니다.

샤드(Shard)

인덱스 내부에는 색인된 데이터들이 있습니다. 이 색인된 데이터들은 하나의 뭉치로 존재하는 것이 아니라, 물리적 공간에 여러개의 부분들로 존재합니다. 이 부분들을 엘라스틱서치에서 샤드(Shard) 라고 부릅니다. 이 샤드는 프라이머리 샤드와 레플리카 샤드로 구분되는데, 프라이머리 샤드는 말 그대로 데이터의 원본과 같이 보면 되고, 레플리카 샤드는 프라이머리 샤드의 복제본으로 보면 됩니다. 레플리카 샤드는 복제본인만큼 기존 원본 데이터가 무너졌을 때, 그 대신 쓰이면서 장애극복(fail-over) 역할을 수행해냅니다.

타입(Type)

인덱스 하나 당 하나의 타입을 갖게 된 지금, 타입은 현재 커다란 의미는 없습니다. 엘라스틱서치 7.0에서는 타입은 완전히 사라졌습니다. 인덱스가 관계형 데이터베이스의 테이블과 데이터베이스의 역할 두개를 동시에 하게 된다고 생각하시면 편할 것 같습니다.

문서(Document)

문서는 엘라스틱서치 데이터의 최소 단위이며, JSON Object 하나 입니다. 관계형 데이터베이스에서 테이블의 행에 해당하는 것입니다. 또한 하나의 문서는 다양한 필드로 구성되어 있는데, 이 필드에서는 데이터의 형태에 해당하는 데이터 타입이 들어갑니다. 중첩 구조를 지원하여 문서(Document) 내부에 문서(Document) 가 들어가는 것도 가능합니다.

// 간단한 JSON 데이터의 예제입니다.
{
    "name": "Jake Seo",
    "job": "Programmer",
    "personality": "good",
    "schools": {
        "elementary_school": "one in ansan",
        "middle_school": ["one in chungju", "one in ansan"]
        "high_school": "one in ansan",
    }
}

필드(Field)

필드는 위의 문서의 설명 내용에서 잠시 언급했듯, 어떤 문서(Document)에 들어가는 데이터의 타입을 정의합니다. 관계형 데이터베이스의 열(Column)과 비슷하지만 관계형 데이터베이스의 열은 좀 더 정적인 반면 엘라스틱서치의 필드는 조금 더 동적입니다.

특이한 것은 관계형 데이터베이스에서는 절대 불가능합니다만 하나의 필드가 여러 개의 데이터 타입을 가질 수도 있다는 것입니다. 이를테면 어떤 한글 데이터가 들어가는 필드에 초성 검색을 지원해야 한다면 초성이 데이터타입으로 들어가는 필드를 하나 더 구성하여 총 2개의 필드를 구성할 수 있습니다.

매핑(Mapping)

매핑은 문서와 데이터를 가지고 있는 필드가 어떻게 저장되고 색인될지에 대한 프로세스입니다. 필드와 필드의 속성을 정의하고 색인 방법을 정의합니다. 매핑 정보에 여러가지 데이터 타입 지정이 가능하지만, 필드명 자체는 중복이 불가능합니다.

노드와 노드의 종류

노드는 더욱 커다란 개념인 클러스터를 이루는 요소입니다. 클러스터는 모든 노드의 검색 및 색인 작업을 관리합니다. 노드는 엘라스틱서치를 관계형 데이터베이스와는 다르게 만듭니다. 관계형 데이터베이스는 하나의 서버에서 수직적으로 데이터가 커지는 반면(하나의 서버의 부담이 매우 막중함), 여러개의 노드로 구성된 엘라스틱서치 서버는 어느정도 수평적으로 데이터가 커질 수 있습니다(여러 개의 서버가 같이 부담함). 이렇게 수평적으로 데이터가 커지는 특성은 엘라스틱서치가 대용량 데이터 처리를 할 수 있게 해줍니다.

분산 처리를 위해 우리는 노드 중 마스터 노드는 클러스터를 관리합니다. 그리고 데이터 노드는 실제로 데이터 관리를 합니다. 다양한 노드의 형태를 조합하여 클러스터를 구성해야 후에 분산처리에 문제가 없습니다.

엘라스틱서치가 제공하는 노드의 종류는 다음과 같습니다.

  1. 마스터 노드(Master Node)
    • 클러스터를 관리합니다.
    • 노드 추가/제거 등 클러스터의 전반적 관리를 담당합니다.
  2. 데이터 노드(Data Node)
    • 데이터를 저장합니다.
    • 검색, 통계 등 데이터 작업을 수행합니다.
  3. 코디네이팅 노드(Coordinating Node)
    • 사용자의 요청만 받습니다.
    • 클러스터에 관련된 것은 마스터 노드 쪽으로 넘기고 데이터에 관련된 것은 데이터 노드에 넘깁니다.
  4. 인제스트 노드(Ingest Node)
    • 문서 전처리 작업을 합니다.
    • 인덱스 생성 전 문서의 형식 변경을 다양하게 할 수 있습니다.

알아둬야 할 것은 각 노드가 한 가지 유형으로 동작할 수도 있지만, 여러 가지 유형으로 동작하는 것도 가능하다는 것입니다.

마스터 노드

  • 인덱스 생성/삭제 등 클러스터와 관련된 전반적 작업
  • 네트워크 속도가 빠른 노드를 마스터 노드로 설정하는 것이 권장
  • 여러 개의 마스터 노드를 설정하면 하나만 마스터 노드로 작동
  • 설정하고 싶다면 elasticsearch.yml 내부에서 node.master: true로 설정

데이터 노드

  • 데이터(문서)가 저장되는 노드
  • 데이터가 분산 저장되는 물리적 공간인 샤드가 배치되는 노드
  • 색인 작업도 함
    • 리소스가 많이 필요한 작업이므로 모니터링 요구
  • 마스터와는 분리하여 구성하는 것이 좋음
  • 설정하고 싶다면 elasticsearch.yml 내부에서 node.data: true로 설정

인제스트 노드

  • 데이터 전처리를 위한 노드
  • 스크립트로 전처리 파이프라인 구성, 실행하여 데이터 포맷 변경 가능
  • 설정하고 싶다면 elasticsearch.yml 내부에서 node.ingest: true로 설정

코디네이팅 노드

  • 단순히 요청을 라운드로빈 방식으로 분산시켜주는 노드
  • 설정하고 싶다면 elasticsearch.yml 내부에서 노드 종류 관련 옵션 전부 false로 설정

간단 정리

엘라스틱서치에는 다양한 용어와 개념이 있다. 그 중 대표적인 것은 클러스터, 노드, 인덱스, 샤드로 볼 수 있는데, 클러스터는 일반적으로 여러 개의 노드로 구성되어 있고, 노드 내부에는 일반적으로 인덱스가 들어있다. 인덱스 내부에는 여러 개의 샤드로 쪼개진 데이터들이 들어있다. 그리고 샤드 내부에는 문서가 있을 것이고, 그 문서는 필드와 매핑(Mapping)을 갖고 있을 것이다.

  • 클러스터 (Cluster) : 엘라스틱서치 서버 그 자체, 노드의 모음.
    • 노드 (Node) : 클러스터의 구성요소. 다양한 형태 존재 (마스터, 데이터, 인제스트, 코디네이팅)
      • 인덱스 (Index) : 관계형 데이터베이스의 데이터베이스이자 테이블(타입)
        • 샤드 (Shard) : 쪼개진 인덱스
          • 문서 (Document) : 엘라스틱서치 데이터의 최소 단위
            • 필드 (Field) : 문서를 구성하기 위한 속성
            • 매핑 (Mapping) : 필드와 필드속성, 색인 방법 정의하는 프로세스

이렇게 관계가 성립한다고 이해하면 간단할 것입니다.

참고 사항

  • 엘라스틱서치의 노드는 실시간으로 추가, 제거가 가능합니다. 그래서 확장성, 가용성에서 용이합니다.
  • 인덱스 구성 시에 레플리카 샤드 수를 결정할 수 있는데, 이는 장애 극복에 중요한 역할을 하니 신중하여야 합니다.