본문 바로가기
개발/ELK

Elasticsearch 기본

by parkkingcar 2023. 5. 17.

 

Elasticsearch란?

엘라스틱서치는 아파치 루씬(Apache Lucene) 기반의 오픈소스 검색 엔진으로 아파치 루씬이 가진 한계를 보완하기 위해 개발되었습니다. 엘라스틱서치는 루씬 엔진을 확장하고 관리하기 위해 Java 언어와 JVM을 활용합니다. 

 

엘라스틱서치는 NoSQL 데이터베이스 중 하나로서, 기존의 관계형 데이터베이스(RDBMS)와는 다르게 엘라스틱서치는 JSON 형식의 문서(document)를 저장하며, 각 문서는 고유한 식별자와 그에 따른 데이터를 가집니다. 이러한 문서들은 인덱스(index)내에 저장되어 있으며, 이를 통해 빠른 검색 및 분석을 수행할 수 있습니다. 대량의 데이터를 빠르게 저장, 검색 및 분석할 수 있기 때문에 주로 로그 및 이벤트 데이터 저장, 웹 사이트 검색, 모니터링 및 로그 분석 등에 활용됩니다. 

 

엘라스틱서치의 document는 SQL에서의 튜플 데이터와 비슷한 개념으로, 데이터 레코드를 나타냅니다. 또한 엘라스틱서치의 index는 SQL에서의 테이블과 유사한 역할을 하며, document들을 묶어서 저장하고 검색 가능하도록 합니다. (주의할 점은 SQL의 index와 엘라스틱서치의 index는 다른 의미를 가진다는 것 입니다.)

 

 

 

Elasticsearch 특징

항목 특징
준실시간 검색 엔진 실시간이라고 생각할 만큼 색인된 데이터가 매우 빠르게 검색됨
클러스터 구성 한 대 이상의 노드를 클러스터로 구성하여 높은 수준의 안정성을 이루고 부하를 분산할 수 있음
스키마리스 입력될 데이터에 대해 미리 정의하지 않아도 동적으로 스키마를 생성할 수 있음
Rest API Rest API 기반의 쉬운 인터페이스를 제공하여 비교적 진입장벽이 낮음

 

 

 

Elasticsearch 기본 개념

클러스터와 노드

 

클러스터란 여러 대의 컴퓨터 혹은 구성요소들을 논리적으로 결합하여  전체를 하나의 컴퓨터, 혹은 하나의 구성 요소처럼 사용할 수 있게 해주는 기술입니다. 엘라스틱서치의 클러스터도 여러 개의 엘라스틱서치 프로세스들을 논리적으로 결합하여 하나의 엘라스틱 프로세스처럼 사용할 수 있게 해줍니다. 이때 클러스터를 구성하는 하나하나의 엘라스틱서치 프로세스를 노드라고 합니다. 즉, 노드는 하나의 서버를 의미한다고 생각할 수 있고, 여러개의 노드를 하나의 엘라스틱서치처럼 동작하게 하는 것이 바로 이 클러스터입니다.

 

위 사진을 보면 총 3개의 노드가 하나의 클러스터를 구성하고 있습니다. 3개의 노드가 하나의 엘라스틱서치처럼 동작하기 때문에 클러스터를 구성하고 있는 노드 중 어느 노드에 API를 요청해도 동일한 응답과 동작을 보장받을 수 있습니다. 

 

엘라스틱서치 클러스터는 하나의 노드만 이용해도 단일노드로 구성된 클러스터로써 동작합니다. 단일노드 클러스터의 경우 테스트 및 개발 환경, 작은 규모의 데이터나 시스템에서는 성능상의 문제 없이 사용할 수 있습니다. 하지만 일반적으로 단일노드로 클러스터를 구성하지 않습니다.

 

예를들어 단일노드 구성에서 해당 노드에 장애가 발생하면 시스템이 완전히 중단될 수 있습니다. 대규모 데이터 처리나 고성능을 필요로 하는 경우, 여러 노드로 클러스터를 구성하면 데이터의 분산 처리 및 복제를 통해 데이터 손실 없이 확장성을 가질 수 있습니다. 따라서 실제 운영에는 다중 노드 클러스터 구성을 권장합니다.

 

 

노드 역할 설명
마스터 노드 클러스터 구성에서 중심이 되는 노드. 클러스터의 상태 등 메타데이터를 관리
데이터 노드 사용자의 문서를 실제로 저장하는 노드
인제스트 노드 사용자의 문서가 저장되기 전 문서 내용을 사전 처리하는 노드
코디네이트 노드 사용자의 요청을 데이터 노드로 전달하고, 다시 데이터 노드로부터 결과를 취합하는 노드

마스터 노드는 클러스터의 메타데이터를 관리하는 역할을 하며, 반드시 한 대 이상으로 구성해야 합니다. 클러스터 내의 모든 노드는 현재 노드의 상태, 성능 정보, 자신이 가지고 있는 샤드의 정보를 마스터 노드에 알립니다. 마스터노드는 이런 정보들을 수집하고 관리하면서 클러스터의 안정성을 확보하기 위해 필요한 작업들을 진행합니다. 

 

클러스터 내에서 노드는 마스터 역할이 가능한 노드와 실제 마스터 역할을 하는 노드로 구분됩니다. 예를들어 클러스터를 구축할 때 3대의 마스터 역할 노드를 구성한다면 그중 한 대만 실제 메타데이터를 관리하는 역할을 수행하고 나머지 두 대는 현재 동작하고 있는 마스터 노드에 장애가 발생했을 때 새로운 마스터가 될 수 있는 마스터 후보 노드가 됩니다. 

 

주의할 점은 3개 이상의 노드로 구성해야 고가용성을 보장받을 수 있습니다. 그리고 노드를 홀수로 구성해야 split brain 문제를 방지할 수 있습니다. split brain은 마스터 후보 노드 사이의 네트워크가 단절되었을 때 각 마스터 후보 노드가 마스터 노드로 승격하여 두 개의 클러스터로 나뉘어 독립적으로 동작하는 현상입니다. 

 

또한 각각의 노드는  하나의 역할만 하는 것이 아니라 동시에 다양한 역할을 할 수 있습니다.

 

아래는 노드에 관련한 자세한 내용을 다루고 있습니다.

 

Node | Elasticsearch Guide [8.9] | Elastic

Master nodes must have a path.data directory whose contents persist across restarts, just like data nodes, because this is where the cluster metadata is stored. The cluster metadata describes how to read the data stored on the data nodes, so if it is lost

www.elastic.co

 

 

 

인덱스(Index)

인덱스는 사용자의 데이터가 저장되는 논리적인 공간을 의미하며 타입은 인덱스 안의 데이터를 유형별로 논리적으로 나눠 놓은 공간을 의미합니다. 앞서 언급한 부분과 같이 엘라스틱서치에서 하나의 데이터 (RDBMS에서의 하나의 튜플(row))는 도큐먼트라고 불리는데 이러한 도큐먼트의 집합이 인덱스입니다. 인덱스의 이름은 클러스터 내에서 유일해야 하며, 동일한 이름의 다른 인덱스를 만들 수는 없습니다. 인덱스에 저장된 도큐먼트는 위 사진과 같이 데이터 노드들에 분산 저장됩니다.

 

 

 

 

샤드와 세그먼트

샤드는 인덱스에 색인되는 문서들이 저장되는 논리적인 공간을 의미하며, 세그먼트는 샤드의 데이터들을 가지고 있는 물리적인 파일을 의미합니다. 엘라스틱서치는 인덱스를 샤드로 나누고 나뉘어진 샤드에 세그먼트 단위로 문서를 저장합니다. 

 

또한 엘라스틱서치는 샤드의 상태를 정상적으로 유지하고 장애 상황에서도 데이터를 유실되지 않도록 관리하기 위해 샤드를 프라이머리 샤드 레플리카 샤드로 나누어 관리합니다. 레플리카 샤드 프라이머리 샤드와 동일한 문서를 가지고 있기 때문에 사용자의 검색 요청에도 응답할 수 있습니다. 따라서 레플리카 샤드를 늘리면 검색 요청에 대한 응답속도를 높일 수 있다는 점도 알 수 있습니다.

 

예를들어, 위 사진에서 node 1의  0 도큐먼트가 프라이머리 샤드이면, node 2의  0 도큐먼트는 레플리카 샤드가 됩니다.

 

 

 

매핑(mapping)

 

매핑은 RDBMS의 스키마와 유사합니다. 엘라스틱서치에 저장될 JSON 문서들이 어떤 키와 어떤 형태의 값을 가지고 있는지 정의합니다. 인덱스를 생성할 때 데이터 입력에 따라 자동으로 매핑이 생성되는데, 이때 아래와 같이 인덱스의 매핑을 정할 수 있고, 그에 맞춰 데이터가 입력됩니다.

PUT <인덱스명>
{
  "mappings": {
    "properties": {
      "<필드명>":{
        "type": "<필드 타입>"
        … <필드 설정>
      }
      …
    }
  }
}

 

 

 

 

 

 

참고자료

 

What is Elasticsearch? | Elasticsearch Guide [8.9] | Elastic

What is Elasticsearch?edit You know, for search (and analysis) Elasticsearch is the distributed search and analytics engine at the heart of the Elastic Stack. Logstash and Beats facilitate collecting, aggregating, and enriching your data and storing it in

www.elastic.co

 

ElasticSearch 노드, 인덱스, 샤드

엘라스틱 서치의 기본 개념에 대해 기재하려고 한다. 공식 문서를 보면서 다시 개념을 짚어가는 중이다. 오늘도 한번 깨닫지만, 널리 알려지지 않은 기술의 경우에는 공식 문서를 보는게 가장

velog.io

 

Elastic 가이드 북 - Elastic 가이드북

7. 인덱스 설정과 매핑 - Settings & Mappings

esbook.kimjmin.net

 

 

이 글은 '기초부터 다지는 ElasticSearch 운영 노하우 - 박상헌, 강진우'를 기반으로 작성하였습니다.

 

 

 

댓글