본문 바로가기

기초이론/DataBase

엘라스틱 서치(Elasticsearch)

엘라스틱 서치(Elasticsearch)

  • 아파치 루씬(Apache Lucene) 기반의 JAVA 오픈소스 분산 검색 엔진이다.
  •  엘라스틱 서치를 통해 루씬 라이브러리를 단독으로 사용할 수 있다.
  • 방대한 양의 데이터를 신속하게 거의 실시간(NRT : Near Real Time)으로 저장, 검색, 분석할 수 있다.
  • 즉, 루씬이라는 검색 라이브러리를 기반으로 검색 기능을 제공하는 오픈소스 검색엔진을 말한다.
  • 사용 사례는 다음과 같다.
    1. 어플리케이션, 웹사이트 등의 검색
    2. 로깅, 로그 분석
    3. 보안 및 비즈니스 분석
    4. 애플리케이션 성능 모니터링
    5. 위치기반 정보 데이터 분석 및 시각화
    6. 비즈니스 인텔리전스
      • Business-Intelligence(BI) : 조직이 더 나은 의사 결정을 내리고 보다 효율적인 비즈니스 프로세스를 구현할 수 있도록 지원하는 기능을 말한다.
  • 검색을 위해 단독으로 사용되기도 하고, ELK(Elasticsearch / Logstash / Kibana) 스택으로 사용되기도 한다.
    • ElasticSearch + Logstash + Kibana를 같이 묶어 ELK(ELK Stack)라는 서비스명으로 제공했다.
    • 5.0.0 버전부터 Beats가 포함되어 Elastic Stack이란 이름으로 서비스가 제공되고 있다.
    • 로드밸런싱 되어있는 WAS에서 흩어져 있는 로그를 한 곳으로 모으고 원하는 데이터를 빠르게 검색한 뒤 시각화하여 모니터링하기 위해 사용한다.

 

L : Logstash

  • 다양한 소스(DB, csv 파일 등)의 로그 또는 트랜잭션 데이터를 수집, 집계, 파싱하여 Elasticsearch로 전달한다.

E : Elasticsearch

  • Logstash 로부터 받은 데이터를 검색, 집계하여 필요한 정보만을 획득한다.

K : Kibana

  • Elasticsearch 을 통해 얻은 데이터를 시각화 및 모니터링 한다.

ELK(Elasticsearch / Logstash / Kibana)


B : Beats

  • 단일 목적의 데이터 수집기 무료 오픈 소스 플랫폼으로, 여러 장비와 시스템으로부터 Logstash 혹은 Elasticsearch  에 데이터를 전송한다.
  • 경량 데이터 수집기이다.

 

엘라스틱 서치(Elasticsearch)와 관계형 DB

  • 관계형 DB에서 사용하는 용어는 Elasticsearch 에서는 다음과 같이 사용한다.
RDB(Relational Database) Elasticsearch
Database Index
Table Type
Row Document
Column Field
Index Analyze
Primary Key _id
Schema Mapping
Physical Partition Shard
Logical Partition Route
Relational Parent / Child, Nested
SQL Query DSL
  • 엘라스틱 서치(Elasticsearch)는 데이터를 저장할 때에 역인덱스(Inverted Index) 구조로 저장하기에 데이터 검색에 한해서는 기존에 RDB보다 성능이 뛰어나다.
    • 역인덱스 구조의 예시는 다음과 같다.

역인덱스


  • 일반적으로 RDB는 행을 기반으로 데이터를 저장하지만, 엘라스틱 서치(Elasticsearch)는 단어를 기반으로(역인덱스 : Inverted Index) 데이터를 저장한다.

 

엘라스틱 서치(Elasticsearch)의 구조

  • 가장 큰 시스템 단위인 클러스터(Cluster)가 존재하며, 이는 하나 이상의 노드로 이루어진 노드들의 집합을 말한다.
  • 엘라스틱 서치(Elasticsearch)는 크게 논리적 / 물리적 구조로 나뉜다.
    • 논리적 구조는 다음과 같다.
      1. 도큐먼트(Document)
      2. 타입(Type)
      3. 필드(Field)
      4. 매핑(Mapping)
      5. 인덱스(Index)
    • 물리적 구조는 다음과 같다.
      1. 노드(Node)
      2. 샤드(Shard)
      3. 세그먼트(Segment)

클러스터(Cluster)

  • 엘라스틱 서치(Elasticsearch)에서 가장 큰 시스템 단위를 의미한다.
  • 최소 하나 이상의 노드로 이루어진 노드들의 집합이다.
  • 서로 다른 클러스터는 데이터의 접근, 교환을 할 수 없는 독립적인 시스템으로 유지된다.
  • 여러 대의 서버가 하나의 클러스터를 구성할 수 있고, 한 서버에 여러 개의 클러스터가 존재할 수도 있다.

 

논리적 구조

도큐먼트(Document)

  • 엘라스틱 서치(Elasticsearch)에서 데이터의 최소 단위를 의미한다.
  • JSON 객체이다.
  • 테이블의 ROW와 동일하다.
  • 키와 값으로 정의된 필드로 구성되어 있다.
    • 키는 필드의 이름이고 값은 데이터 타입(String, Number, Boolean, Object, Array..)이다.
  • 도큐먼트(Document)에는 문서를 구성하기 위한 예약된 필드가 포함되어 있다.
    • _index : 도큐먼트가 저장되어있는 index 정보이다.
    • _type : 도큐먼트의 유형을 나타내는 정보이다.
    • _id : 도큐먼트의 유니크한 고유값이다.

 

타입(Type)

  • 도큐먼트(Document)를 유형별로 모아놓은 집합이다.
  • 여러 개의 도큐먼트가 모여서 한 개의 Type을 이룬다.
    • RDBMS의 Table과 비슷하다.
  • 엘라스틱 서치(Elasticsearch) 7.0 미만에서는 하나의 Index에 여러 개의 Type을 가질 수 있었는데, 7.0 부터는 Type이 사라졌다.

 

필드(Field)

  • 도큐먼트(Document)에 들어가는 데이터 타입으로 RDBMS의 Column과 비슷지만 그보다 동적이다.
  • RDBMS에서는 하나의 Column이 하나의 데이터 타입만 가질 수 있지만 엘라스틱 서치(Elasticsearch)에서는 하나의 필드가 여러 개의 데이터 타입을 가질 수 있다.

 

 매핑(Mapping)

  • 필드와 필드의 속성을 정의하고 색인 방법을 정의한다.
  • 매핑 정보에 여러 가지 데이터 타입 지정이 가능하지만 필드명은 중복이 불가능하다.

 

인덱스(Index)

  • 여러개의 Type이 모여 하나의 Index를 이룬다.
  • 엘라스틱 서치(Elasticsearch)가 7.0 부터는 인덱스가 타입의 역할을 대신하므로 Database에 Table 역할을 한다.
  • 인덱스는 두 가지의 유형으로 구분할 수 있다.
    1. 샤드(Shard) 
      • 단일 루씬 index 이다.
      • 엘라스틱 서치에 확장성을 용이하게 하기 위해 필요하다.
      • index는 저장할 수 있는 Document 의 제한이 없어서 호스팅 서버의 제한을 초과하는 디스크 공간을 차지할 수 있다. 이 경우에 발생하는 문제에 대응하기 위해 index 의 데이터를 분산해서 저장하고, 이렇게 나뉜 조각들을 샤드라 한다.
    2. 레플리카셋(Replicas)
      • index에서 분산된 샤드들을 복사한 것이다.
      • 노드에 문제가 생길 시에 백업시스템으로 사용된다.
      • 읽기 요청을 처리할 수 있어 검색 성능을 높이는데에 도움을 준다.
      • 가용성을 보장하기 위해 원본 샤드와 복제셋을 같은 노드에 놓을 수 없다.
        • 가용성 : 서버와 네트워크, 프로그램 등의 정보 시스템이 정상적으로 사용 가능한 정도를 말한다

 

물리적 구조

노드(Node)

  • 데이터를 저장하고 색인(indexing)하는 등의 중요한 역할을 한다.
  • 다음과 같은 유형으로 나뉜다.
    1. Master Node
      • 클러스터를 관리하는 노드이다.
      • 노드의 추가, 제거 / 인덱스의 생성, 삭제 등 클러스터의 관리 및 구성 작업을 담당한다.
      • 데이터 입력 시 어느 샤드에 할당할 것인지 정하는 역할을 한다.
    2. Data Node
      • 데이터를 저장하거나 검색과 집계 등 기본적인 CRUD 작업을 하며 데이터와 연관된 작업을 한다.
      • 실질적인 데이터가 저장되는 노드로 데이터가 실제로 분산 저장되는 물리공간인 샤드가 배치되어 있다.
      • 많은 리소스를 필요로 하며 모니터링 작업이 필요하기에 마스터 노드와 분리해야 한다.
      • Elasticsearch 버전이 업그레이드 되면서 다양화가 되었다.
        1. Content Data
          • 유저가 만든 콘텐츠를 수용하는 노드이다.
          • CRUD, 검색, 집계 등의 작업을 가능하게 한다.
        2. Hot Data
          • 시계열 데이터를 저장한다.
            • 시계열 데이터 :  시간 순서로 배열된 데이터의 한 종류로 시간에 걸쳐 순차적으로 기록된다.
          • read / write가 빠르며 이로 인해 더 많은 하드웨어 리소스(SSD)가 필요하기에 고사양의 서버에 적합하다.
        3. Warm Data
          • 쿼리를 실행하는 인덱스를 저장한다.
          • 성능이 낮은 하드웨어를 사용할 수 있다.
          • 오래된 데이터지만 활용하고 있는 데이터를 보관한다.
          • 더 이상 업데이트가 되지 않는 노드이다.
        4. Cold Data
          • 읽기 전용 인덱스를 저장한다.
          • 클러스터 공간을 최대 50% 절약할 수 있다.
          • 레플리카를 스냅샷으로 저장하고 스냅샷 저장소에 저장한다.
            • 스냅샷 : 특정 시점에 스토리지의 파일 시스템을 포착해 보관하는 기술을 의미하며 백업 등에 사용된다.
          • 검색이 가능한 스냅샷을 이용해서 데이터 복원성을 강화하였다.
        5. Frozen Data
          • 스냅샷 데이터를 해당 노드에 저장하고 데이터를 검색 가능하도록 하는 노드이다.
    3. Ingestion Node
      • 색인 전에 Document를 사전처리하는 용도로 사용한다.
      • 데이터 변환, 사전 처리 파이프라인 실행 등의 역할을 한다.
    4. Coordination only node
      • 사용자의 요청을 받아서 라운드로빈 방식으로 분산시켜주는 노드이다.
      • 로드밸런서와 비슷한 역할을 한다.
      • 클러스터에 관련된 것은 Master Node, 데이터와 관련된 것은 Data Node로 넘긴다,
    5. Machine Learning Node
      • 머신러닝 작업을 가능하게 하는 용도로 사용한다.

 

샤드(Shard)

  • Index 내부에는  색인된 데이터들이 존재하는데 이 데이터들은 하나로 뭉치지 않고 물리적 공간에 여러개의 부분들로 나뉘어서 존재한다. 이러한 부분들을 Shard 라고 한다.
  • Elasticsearch는 별도의 설정이 없으면 기본적으로 인덱스를 5개의 샤드로 나누어서 저장한다.
    • 7.0 버전부터는 1개의 샤드로 인덱스가 구성된다.
  • 처음 생성된 샤드를 프라이머리 샤드(Primary Shard), 복제본을 레플리카 샤드(Replica Shard)라고 한다.
    1. 프라이머리 샤드(Primary Shard)
      • 데이터의 원본이다.
      • Elasticsearch에서 업데이트 요청을 하면 반드시 Primary Shard 에 요청을 하게 되고 해당 내용은 레플리카에 복제된다. 
      • 검색 성능 향상을 위해 클러스터의 샤드 개수를 조정하는 튜닝을 한다.
    2. 레플리카 샤드(Replica Shard)
      • Primary Shard의 복제본이다.
      • 기존 원본 데이터가 망가졌을 때 그 대신 사용하기에 장애 극복 역할을 수행한다.
      • 기본적으로 Primary Shard와 동일한 노드에 배정되지 않는다.

 

세그먼트(Segment)

  • 문서의 빠른 검색을 위해 설계된 자료구조이다.
  • 샤드의 데이터를 가지고 있는 물리적인 파일이다.
  • 각 샤드는 다수의 세그먼트로 구성되어 있다.
  • 샤드에서 검색 시 먼저 각 세그먼트를 검색하여 결과를 조합한 후에 최종 결과를 해당 샤드의 결과로 리턴한다.
  • 불변의 성질을 가지고 있어 데이터가 업데이트되면 삭제된 데이터는 디스크에 남아있고 새로운 데이터를 가리키며 삭제되었다고 표시한 해준다.
  • 삭제되었다고 표시된 데이터는 디스크에 남아있다가 백그라운드에서 주기적으로 또는 특정 임계치를 넘기면 더 이상 필요없어진 데이터들을 정리하고 새로운 세그먼트로 병합한 후에 해당 세그먼트를 삭제한다. 이떄 비로소 디스크에서 완전히 데이터가 삭제되며 이를 세그먼트 병합(Segment Merge)이라고 한다.
    • 세그먼트 병합 시에는 새로운 세그먼트를 만들 공간이 있어야 하기 때문에 디스크가 꽉 찬 상태에서는 수행할 수 없다.
    • 세그먼트 병합은 시스템 자원을 많이 쓰는 부담스러운 작업이므로 시스템 자원이 여유로울 때 시스템에 영향을 주지 않는 선에서 진행한다.


Elasticsearch의 장단점

장점

  •  Scale-Out
    • 샤드를 통해 규모가 수평적으로 늘어날 수 있다.
  • 고가용성
    • 레플리카를 통해 데이터의 안전성을 보장한다.
  • Schema Freeo
    • Json 문서를 통해 데이터 검색을 수행하므로 스키마 개념이 없다.
  • Restful
    • 다양한 플랫폼에서 응용이 가능하다.
    • 데이터 CRUD 작업은 HTTP Restful API를 통해 수행하며 다음과 같이 대응한다.
Data CRUD Elasticsearch Restful
SELECT GET
INSERT PUT
UPDATE POST
DELETE DELETE

 

단점

  • 실시간 처리가 불가능하다
    • 인메모리 버퍼를 사용하므로 read/write 작업을 동시에 할 경우에 세그먼트가 생성되기 전까지는 해당 데이터를 검색할 수 없다.
      • 루씬은 효율적인 색인 작업을 위해 내부적으로 일정 크기의 버퍼를 가지고 있으며 이를 인메모리 버퍼라고 한다.
      • 루씬에 색인 작업이 요청되면 전달된 데이터는 인메모리 버퍼에 순서대로 쌓이고, 정책에 따라 내부 버퍼에 일정 크기 이상의 데이터가 쌓이거나 일정 시간이 흐를 경우 버퍼에 쌓은 데이터를 한꺼번에 모아 처리한다. 즉, 버퍼를 일종의 큐(Queue)로 활용한다.
  • 트랜잭션을 지원하지 않는다.
    • 분산 시스템 구성의 특징으로 인해 시스템적으로 비용 소모가 커서 트랜잭션 및 롤백을 지원하지 않는다.

 

출처

https://victorydntmd.tistory.com/308

https://idea-sketch.tistory.com/59

https://twofootdog.tistory.com/53

https://victorydntmd.tistory.com/308?category=742451

https://esbook.kimjmin.net/

https://icarus8050.tistory.com/52

 

'기초이론 > DataBase' 카테고리의 다른 글

인덱스(Index)와 힌트(Hint)  (0) 2022.07.02
JOIN 이란  (0) 2022.04.02
UNION 과 UNION ALL 이란  (0) 2022.03.14