Solution

[ElasticSearch] 개념

jih0ssang 2024. 6. 26. 23:51

참고 블로그 

https://esbook.kimjmin.net/07-settings-and-mappings/7.2-mappings 

https://ym1085.github.io/elasticsearch/Elastic-Stack-기본개념/

https://velog.io/@sung-ik-je/ElasticSearch#index-1

 

ElasticSearch

  • 실시간으로 데이터 저장, 분석, 검색 엔진
  • Java 오픈소스
  • 루씬(lucene) 이라는 검색 라이브러리를 기반으로 만들어짐
  • 수평적으로 확장 가능
  • 검색을 위해 단독으로 쓰이기도 하며, ELK 스택으로 사용되기도 함
  • 버전 7 부터는 jdk가 포함되어 있어서 Java를 따로 설치하지 않아도 됨!
  • ElasticSearch를 한번 실행하면 data 디렉터리가 생성됨
  • 실행 명령어: bin/elasticsearch

특징

  • Scale-out
    • 샤드(shard)를 통해 수평적 확장
  • 고가용성
    • 레플리카(Replica)를 통해 데이터의 안전성 및 신뢰성 보장
  • Restful
    • 데이터의 CRUD 작업은 HTTP Restful API를 통해 수행함
      • 데이터를 HTTP 요청으로 처리하여 언어와 플랫폼에 독립적, 표준화된, 접근성과 유연성
      • SQL이 RDBMS에 최적화되어있는 편인데, HTTP API는 DB를 타지 않음
      • 다양한 클라이언트와의 연동을 용이

 

 

데이터의 CRUD Elastic Search의 Restful
SELECT GET
INSERT PUT
UPDATE POST
DELETE DELETE
   
  • 스키마리스 (Schemaless)
    • JSON 형식
    • 동적 매핑 (새 필드가 추가시 자동 데이터 타입 결정. 각자 고유한 Type 가짐)
    • 단어(term)를 쪼개서 빠른 검색
    • NoSQL 특성 가지고 있으나, RDB와 NoSQL과 다른 점은 “역색인” 구조

      ElasticSearch  RDBMS  MongoDB(NoSQL)
    데이터들의 집합 Index, indices (Table&DB역할) Database Database
    단일 데이터 단위 Document Row Document
    행 단위 Field Column Column
    저장소 Shard Partition  
      Mapping Schema  
      Query DSL SQL  

역색인 구조?

일반 데이터베이스는 색인 구조로, 데이터가 저장될 때마다 순차적으로 색인 번호를 매김.

→ 즉, 번호를 통해 데이터를 알 수 있음.

  • index 0 : “바나나”
  • index 1 : “바나나랑 사과”
  • index 2 : “바나나랑 사과랑 딸기”

이에 반해, 역색인 구조는 데이터를 기준으로 해당 단어가 포함된 위치를 기록

→ 즉, 데이터를 통해 데이터의 위치(번호)를 알 수 있음.

  • "바나나" -> 문서 1 (위치 0), 문서 2 (위치 0), 문서 3 (위치 0)

* Full-text로 검색이 가능한 원리가 이것 때문!

 

 

Analyze

  • term(단어, 토큰) 단위로 쪼개는 과정, 즉 정제 과정
  • Tokenizer (공백이나 , . 기준으로 쪼갬) + Token Filter(검색 가능하도록 가공) 으로 구성

 

Mapping

  • 쪼개진 term을 저장, 관리
  • Dynamic Mapping : ES 자체적으로 설정되어 있는 경우
  • Explict Mapping (명시적) : 사용자가 인위적으로 정의하는 경우

 

  • 인덱스(Index)는 샤드(Shard) 단위로 분리되어 저장
  • 노드가 1개만 있는 경우, 프라이머리 샤드만 존재하고 복제본은 생성되지 않음
  • ES는 최소 3개의 노드 구성을 권장함
  • 예를 들어, 인덱스가 5개의 샤드로 구성어 있고, 클러스터가 4개의 노드로 구성되어 있다고 가정하면 각각 5개의 프라이머리 샤드와 복제본, 총 10개의 샤드들이 전체 노드에 골고루 분배되어 저장됩니다.
    Node1  Node2  Node3  Node4
    프라이머리 샤드1 프라이머리 샤드2 프라이머리 샤드3 프라이머리 샤드4
    프라이머리 샤드5 복제본 샤드1 복제본 샤드2 복제본 샤드3
    복제본 샤드4 복제본 샤드5    
    • 샤드와 복제본은 동일한 데이터를 담고 있으며 반드시 서로 다른 노드에 저장
    • 운영 중 노드가 유실되어도 다른 노드로 복제본 생성하여 가용성과 무결성 보장

샤드(shard)

  • 인덱스 처음 생성할 때 개수를 지정하고 그 이후에는 바꿀 수 없음. 복제본은 가능
  • curl 명령을 통해 REST API로 샤드가 5개, 복제본은 1개인 books 라는 이름의 인덱스를 생성
$ curl -XPUT "http://localhost:9200/books/_settings" -H 'Content-Type: application/json' -d'

 

 

 

 

 

마스터 노드(Master Node)

  • 클러스터 관리
  • 인덱스의 메타 데이터, 샤드의 위치와 같은 클러스터 정보 관리
  • node.master true

데이터 노드(Data Node)

  • 실제 데이터 저장만 하는 노드
  • 모든 노드가 마스터 노드가 될 수 있는 마스터 후보 노드이다.

 

'Solution' 카테고리의 다른 글

[Apache Kafka] 커밋, Offset과 Lag  (0) 2024.06.24
[Apache Kafka] Consumer Group  (0) 2024.06.24
[Apache Kafka] Topic / Partition / Record  (0) 2024.06.24
[Apache Kafka] Kafka 개념  (0) 2024.06.24