본문 바로가기
데이터 엔지니어링

ElasticSearch 구성 요소 - Shard, Replicas, Analyzer

by 내기록 2022. 8. 4.
반응형

ElasticSearch

분산형 Restful 검색 및 분석 엔진이다.

 

주요 특징

  • 역색인을 통한 빠른 검색 지원
  • 클러스터 구성을 통한 분산처리 및 고가용성
  • Replica를 활용한 데이터 안정성 증대
  • Shard 분배를 통한 scale-out
  • RESTful API 지원
  • Schemaless
  • Index 기반의 타입 및 색인 방식 설정 지원

 

ElasticSearch Architecture : Key Components

https://nidhig631.medium.com/primary-shards-replica-shards-in-elasticsearch-269343324f86

Elasticsearch 아키텍처는 확장성과 유연성을 위해 구축되었다.

 

 

Elasticsearch Cluster

Elasticsearch 클러스터는 데이터를 저장하는 노드 그룹으로 구성된다.

클러스터와 함께 실행되는 노드 수와 가상 또는 물리 서버의 IP 주소를 지정할 수 있으며, 모든 구성설정은 config/elasticsearch.yml 파일에 포함되어 있다.

Elasticsearch 클러스터의 노드는 서로 연결되어 있으며 각 노드에는 작은 클러스터 데이터 chunk가 포함되어 있다. 

시스템은 새 노드가 시작될 때 자동으로 클러스터를 생성한다. 노드는 검색 및 인덱싱을 담당하는 전체 클러스터 프로세서에 포함된다.

 

Node

일반적으로 노드라는 용어는 클러스터의 일부로 작동하는 서버를 나타낸다. Elasticsearch에서 노드는 머신이 아닌 인스턴스이다. 즉, 단일 시스템에서 여러 노드를 실행할 수 있다. Elasticsearch 인스턴스는 하나 이상의 클러스터 기반 노드로 구성된다. 기본적으로 Elasticsearch 인스턴스가 시작되면 노드도 실행되기 시작한다.

 

Elasticsearch 노드를 구성하는 세 가지 주요 옵션

  • master node - Elasticsearch 클러스터를 제어하여 한 번에 하나의 클러스터 상태를 처리하고 상태를 다른 모든 노드에 브로드캐스팅한다. 마스터 노드는 인덱스 생성 및 삭제를 포함하여 클러스터 전체의 모든 작업을 담당한다.
    인덱스의 메타데이터, 샤드의 위치와 같은 클러스터 상태 정보를 관리한다.
  • data node - 데이터와 역 인덱스를 포함한다. 노드의 기본 구성이다.
    실제로 색인된 데이터를 저장하는 노드이다.
  • client node - 수신 요청을 다양한 클러스터 노드로 라우팅하는 로드 밸런서 역할을 한다.

 

Split Brain

- master node 후보는 최소 3개 이상의 홀수개로 설정해야 한다.

만약 master node 후보를 2개 혹은 짝수로 운영하는 경우 네트워크 유실로 다음과 같은 상황을 겪을 수 있다.

https://speakerdeck.com/elastic/elastic-on-2018-elasticsearch-consensus-the-past-the-present-and-the-future?slide=8

위와 같이 네트워크 단절로 마스터 후보 노드가 분리되면 각각 서로 다른 클러스터로 구성되어 계속 동작하는 경우가 있다.

이 상태에서 클러스터 데이터가 추가/변경되고 네트워크가 북구된 후 다시 하나의 클러스터로 합치면 데이터 정합성에 문제가 생기고 데이터 무결성을 유지하기 힘들어진다. 이런 문제를 Split brain 이라고 한다.

 

이 문제를 방지하기 위해 마스터 후보 노드를 3개로 두고 마스터 후보 노드가 최소 2개 이상 존재하고 있을 때만 클러스터가 동작하고 그렇지 않으면 동작을 멈추도록 해야한다.

minumum_master_nodes = (전체 마스터 후보 노드 / 2) + 1 개로 설정해야 한다.

 

- 실제 업무 중 경험한 사례
Elasticsearch rolling upgrade를 하는 과정에서 클러스터 전체가 멈춘 적이 있었다.
알고 보니 처음 Elasticsearch를 구축할 때 master node를 2개로 설정하고 올린 것.
그래서 rolling update를 진행하며 한 대가 내려가니까 minimum_master_nodes = 2 보다 작은 수인 1대만 존재하게 되었고
위 내용에 따라 클러스터가 동작을 멈춘 것이었다.

 

역 인덱스(Inverted Index)

https://viblo.asia/p/cach-tao-index-va-mot-so-truy-van-pho-bien-trong-elasticsearch-1VgZvO39lAw

Elasticsearch에서는 추출된 각 키워드를 term 이라고 한다. 이렇게 역 인덱스가 있으면 term을 포함하고 있는 document들을 빠륵게 알 수 있다.

데이터가 늘어나면 역 인덱스가 가리키는 배열 값이 추가되는 것 뿐이기 때문에 빠른 속도로 검색이 가능하다.

역 인덱스는 데이터가 저장되는 과정에서 생성되기 때문에 Elasticsearch에서는 데이터를 입력할 때 저장이 아닌 색인을 한다고 표현한다.

 

 

9200 vs 9300

Elasticsearch 아키텍처는 통신을 위해 두 개의 기본 포트를 사용한다.

 

Port 9200 - 클러스터 외부에서 들어오는 요청을 필터링하는데 사용된다.

이 프로세스는 쿼리, 인덱싱 등에 사용되는 REST API를 통해 들어오는 요청을 처리한다.

 

Port 9300 - 노드 간 통신에 사용된다. 전송 계층에서 발생한다.

 

Elasticsearch Shards

각 index에 저장할 수 있는 document수는 제한이 없다. 그러나 index가 호스팅 서버의 스토리지 제한을 초과하면 Elasticsearch 사용에 문제가 발생한다. 이 문제를 방지하기 위해 인덱스는 샤드라고 하는 작은 조각으로 분할된다.

 

샤드는 Elasticsearch 아키텍처의 빌딩 블록 역할(base unit)을 하는 작고 확장 가능한 단위이다. 샤드를 사용하면 작업을 분산하고 전반적인 성능을 향상할 수 있다. index를 생성한 후 필요한 만큼 샤드를 생성할 수 있다. 각 샤드는 클러스터 어디에서나 호스팅할 수 있는 독립적인 Lucene index로 작동한다.

 

Elasticsearch 7 버전 부터는 default shard count = 1 이고(current = 8.3), 이전에는 default count = 5 로 구성된다.

처음 생성된 샤드는 Primary shard, 복제본은 Replica라고 한다.

 

https://blog.arcanna.ai/elasticsearch-shard-optimization

위 그림으로 예를 들면 한 인덱스가 3개의 샤드로 구성되고 replica가 3이라면, 노드 3개에 위처럼 분배될 수 있다.

3(shard)*3(replica)=9개의 shard

 

참고) Node가 1개만 있는 경우 Primary shard만 존재하고 복제본은 생성되지 않는다.

Elasticsearch는 데이터 가용성과 무결성을 위해 최소 3개이 노드로 구성할 것을 권장한다.

( Master Node가 3개 미만으로 구성될 경우, 한 대만 죽어도 서비스 불가능 상태가 된다. master node도 최소 3대 구성을 권장하니 만약 3대의 Node가 있다면 master/data node의 역할을 모두 하게 설정 가능하다. )

 

shard의 개수는 최초 인덱스 생성 시에만 지정 가능하며, 인덱스를 재색인하지 않는 이상 변경이 불가하다.

 

Elasticsearch Replicas

Elasticsearch에서 복제본은 index shard의 복제본이다.

복제본은 백업 및 복구 목적의 오류 방지 메커니즘으로 사용된다. 복제본은 primary 샤드가 포함된 노드에 배치되지 않는다. 가용성을 보장하기 위해 복제본은 다른 위치에 저장된다.

 

인덱스 생성 후 필요한 만큼 replica를 생성할 수 있는데, 기본 샤드보다 더 많은 복제본을 저장할 수 있다.

 

만약 Node 한대가 사용 불가 상태가 된다면, 유실된 shard에 대해 다른 노드에 replica을 생성하여 총 shard 수를 유지한다.

Primary shard가 유실된 경우에는 남은 복제본 중 하나가 primary shard로 승격되고 다른 노드에 replica를 생성한다.

 

Elasticsearch Analyzers

Analyzer(분석기)는 phrase(구문)과 expression(표현)을 구성 용어로 구문 분석을 한다. 이는 indexing process 중에 발생한다. 각 분석기는 하나의 tokenizer와 여러개의 token filters로 구성된다.

특정 표현식을 만나면 tokenizer는 문자열을 미리 정의된 용어로 분할할 수 있다.

 

Elasticsearch는 문자열 필드가 저장될 때 텍스트 분석(Text Analysis) 과정을 거치는데, 이 과정을 처리하는 기능을 애널라이저(Analyzer)라고 한다. 

 

Analyzer components

  • 0 or more character filters
  • exactly 1 tokenizer
  • 0 or more token filters

https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/writing-analyzers.html

텍스트 데이터가 입력되면 필요에 따라 전체 문장에서 특정 문자를 대치하거나 제거한다 : 캐릭터 필터

문장에 속한 단어들을 term 단위로 분리한다 : tokenizer

분리된 term 들을 하나씩 가공 : token filter

 

Token filter example

  • Standard Tokenizer : 대문자 ↔ 소문자 변환
  • Stop Token Filter : term 중에서 검색어로서 가치 없는 단어들은 불용어(stop word)라고 한다.
    a,an,at.. 등은 불용어로 간주되어 검색어 토큰에서 제외한다.
  • Snowball Token Filter : ~s, ~ing 등을 제거한다. lazy를 lazi로 변경한다.
  • 동의어 추가 : AWS와 amazon을 동의어로 지정한다.

Analyzer Flow Example

https://www.elastic.co/kr/blog/found-text-analysis-part-1

 

 

Elasticsearch Documents

Elasticsearch 아키텍처는 JSON 객체로 저장된 document의 검색을 지원하도록 설계되었다. Elasticsearch는 복잡한 데이터와 쿼리를 처리하는데 도움이 되는 중첩 구조(nested structures)를 지원한다.

정보를 추적하기 위해 Elasticsearch는 메타데이터를 나타내는 keys prepended with an underscore를 사용한다.

 

 

 

References

https://cloud.netapp.com/blog/cvo-blg-elasticsearch-architecture-7-key-components#h_h5

https://velog.io/@koo8624/Database-Elastic-Search-2%ED%8E%B8-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98Architecture

https://esbook.kimjmin.net/03-cluster/3.2-index-and-shards

 

 

반응형

댓글