본문 바로가기
ElasticSearch

ElasticSearch 기본 개념

by Box 2022. 8. 15.
728x90

Elasticsearch

Apache Lucene( 아파치 루씬 ) 기반의 Java 오픈소스 분산 검색 엔진입니다.

Elasticsearch를 통해 루씬 라이브러리(Java에서 개발한 정보 검색용 라이브러리)를 단독으로 사용할 수 있게 되었으며, 방대한 양의 데이터를 신속하게, 거의 실시간( NRT, Near Real Time )으로 저장, 검색, 분석할 수 있습니다.

 

Elasticsearch와 관계형 DB 비교

흔히 사용하고 있는 관계형 DB는 Elasticsearch에서 각각 다음과 같이 대응시킬 수 있습니다.

보통 RDB와는 다르게 한 스키마안에 멀티 테이블 생성이 안된다

위에서 인덱스는 RDB의 스키마이고, 타입은 RDB의 테이블이라고 하였다.

하나의 스키마에 여러 테이블을 가지듯이, Elasticsearch도 하나의 인덱스에 여러 타입을 가질 수 있다.

하지만 Elasticsearch 7.0 이상부터는 하나의 인덱스에는 하나의 타입만 가질 수 있도록 바뀌었다.

RDB의 테이블은 완전 개별적인 관계이기 때문에 각 테이블에 이름이 같은 컬럼이 있어도 문제가 없다.

가령 Twitter DB 안의 User Table, Tweet Table이 있고 각각의 테이블 안에 user_name이 있어도 상관 없다.

그런데, Elasticsearch에서 한 인덱스 내의 타입들은 내부적으로 같은 Lucene 필드를 사용한다.

쉽게 이야기하면, 위에서 예로 들었던 User 타입의 user_name 필드와 Tweet 타입의 user_name 필드는 동일한 필드에 저장되며 두 user_name 필드는 동일한 매핑(정의)을 가져야 한다.

따라서 타입이 다를지라도 동일한 이름을 가진 필드는 독립적이지 않으므로 여러 가지 문제가 발생할 수 있으므로 하나의 인덱스에는 하나의 타입만을 갖도록 수정되었다.

 

아키텍쳐

클러스터

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

 

노드

- Elasticsearch를 구성하는 하나의 단위 프로세스를 의미한다.

그 역할에 따라 Master-eligible, Data, Ingest, Tribe 노드로 구분할 수 있다.

master-eligible node ( 링크 )
클러스터를 제어하는 마스터로 선택할 수 있는 노드를 말합니다.
여기서 master 노드가 하는 역할은 다음과 같습니다.
인덱스 생성 및 삭제, 클러스터 노드의 추적 및 관리, 데이터 입력 시 할당할 샤드 선택

Data node ( 링크 )
데이터와 관련된 CRUD 작업과 관련있는 노드입니다.
이 노드는 CPU, 메모리 등 자원을 많이 소모하므로 모니터링이 필요하며, master 노드와 분리되는 것이 좋습니다.

Ingest node ( 링크 )
데이터를 변환하는 등 사전 처리 파이프라인을 실행하는 역할을 합니다.

Coordination only node ( 링크 )
사용자의 요청을 받고 라운드 로빈 방식으로 분산을 하는 노드이다. 클러스터에 관련된 것은 마스터 노드로 넘기고, 데이터와 관련된 것은 데이터 노드로 넘긴다. 로드밸런싱 역할을 하는 노드라고 생각하면 된다.

 

인덱스 (Index)

- RDBMS에서 스키마와 대응하는 개념입니다.

 

샤드( Shard )

-  index를 여러 shard로 쪼갠 것입니다.

기본적으로 1개가 존재하며, 검색 성능 향상을 위해 클러스터의 샤드 갯수를 조정하는 튜닝을 하기도 합니다.

https://brunch.co.kr/@alden/39

 

클러스터 설계하기 - #1 검색 성능과 샤드 개수

ElasticSearch | 이번 글에서는 ElasticSearch (이하 ES)의 클러스터를 설계하기 위해 필요한 요소들 중 샤드의 개수가 검색 성능에 미치는 영향을 바탕으로 적정한 샤드의 개수와 데이터 노드의 개수를

brunch.co.kr

 

복제( Replica )

- 프라이머리 샤드의 복제본이다.

기존 원본 데이터가 무너졌을 때 그 대신 사용하면서 장애를 극복하는 역할을 수행한다.

기본적으로 원본인 프라이머리 샤드와 동일한 노드에 배정되지 않는다.

세그먼트

- 세그먼트(Segment)란 엘라스틱서치에서 문서의 빠른 검색을 위해 설계된 자료구조이다.

각 샤드는 다수의 세그먼트로 구성되어 있다.
엘라스틱서치에서 데이터(Document)를 저장하면, 엘라스틱서치는 이것을 메모리에 모아두고 새로운 세그먼트를 디스크에 기록하여 검색을 리프레쉬(refresh)한다.

이로 인해 새로운 검색 가능한 세그먼트가 만들어지게 된다.

샤드에서 검색 시, 먼저 각 세그먼트를 검색하여 결과를 조합한 후 최종 결과를 해당 샤드의 결과로 리턴하게 된다. 

세그먼트는 불변의 성질을 가지고 있기 때문에 데이터가 업데이트되면 실제로는 삭제되었다고 마크만 하고 새로운 데이터를 가르킨다.

그리고 삭제되었다고 마크된 데이터는 디스크에 남아있다가 백그라운드에서 주기적으로 또는 특정 임계치를 넘기면 더이상 필요없어진 데이터들을 정리하고 새로운 세그먼트로 병합 한 후 세그먼트를 삭제하며 이때 비로소 디스크에서 완전히 삭제되는데 이를 세그먼트 병합(Segment Merge)라고 한다.

세그먼트 병합 시에는 새로운 세그먼트를 만들 공간이 있어야 하기 때문에 디스크가 꽉 찬 상태에서는 수행할 수 없으며, 세그먼트 병합은 시스템 자원을 많이 쓰는 부담스러운 작업이므로 시스템 자원이 여유로울 때 시스템에 영향을 주지 않는 선에서 진행한다. 

 

역색인

키워드를 통해 문서를 찾아내는 방식이다.
책에서 맨 뒤에 나와 있는 찾아 보기를 떠올리면 된다.
검색 성능이 매우 빠르다.

https://steady-coding.tistory.com/581

 

[데이터베이스] 역색인이란?

cs-study에서 스터디를 진행하고 있습니다. 색인과 역색인 색인 (Index) 문서에서 키워드를 찾아 보기 쉽도록 정렬 및 나열한 목록이다. 책에서 맨 앞에 나와 있는 목차를 떠올리면 된다. (좌측 사진)

steady-coding.tistory.com

 

특징

  • Scale out
    • 샤드를 통해 규모가 수평적으로 늘어날 수 있음
  • 고가용성
    • Replica를 통해 데이터의 안전성을 보장
  • Schema Free
    • Json 문서를 통해 데이터 검색을 수행하므로 스키마 개념이 없음
  • Restful
    • 데이터 CRUD 작업은 HTTP Restful API를 통해 수행한다.
      • SELECT = GET
      • INSERT = PUT
      • UPDATE = POST
      • DELETE = DELETE
    • Restful API를 사용한다는 것은 다양한 플랫폼에서 응용이 가능하다는 장점이 있다.
  • 역색인

단점

  • 실시간 처리가 불가능하다.
    • elasticsearch는 인메모리 버퍼를 사용하므로 쓰기와 동시에 읽기 작업을 할 경우, 세그먼트가 생성되기 전까지는 해당 데이터를 검색할 수 없다.
  • 트랜잭션을 지원하지 않는다.
    • 분산 시스템 구성의 특징 때문에 시스템적으로 비용 소모가 큰 트랜잭션 및 롤백을 지원하지 않는다.
  • 진정한 의미의 업데이트를 지원하지 않는다.
    • 세그먼트에서 데이터가 삭제될 경우 Soft-Delete를 한다. (삭제 flag = true)
    • 세그먼트에서 데이터가 수정될 경우 Soft-Delete를 하고, 수정된 데이터를 새로운 세그먼트로 생성한다.
    • RDBMS의 Index와 유사한 동작.

'ElasticSearch' 카테고리의 다른 글

Opensearch Alert 설정하기  (0) 2024.10.30
Opensearch에 Latency API 대쉬보드 설정하기  (0) 2024.10.30