[NoSQL] ElasticSearch

Ik·2023년 2월 26일
0

Data

목록 보기
28/34

참고

회사 CMS 관련 소스들을 분석하며 기본적으로 목적을 알아야 이해가 쉬울 것이라 생각

  • ElasticSearch에서 하던 작업들을 Spring boot에서 ES 작업 하는 것이 목적이기에 Spring Boot는 ES API 사용한다는 것을 알고 넘어가야 할 듯

  • API가 무슨 작업을 의미하는지 찾아보고 우선 ES에서 어떤 작업을 진행하는지 확인 필요

  • ES가 하는 작업들을 알아야 될 것이며 관련 API는 무엇이 있는지도 알아야 할 듯

  • 이거 코드보면서 딱봐도 API인데(ctrl + 클릭으로 해당 class 정보 볼 수 있는경우) 구글에 돌려도 안나오는 경우 해당 기술 문서에서 서칭 필요
    • java.doc에는 주로 코드(=메서드) 설명이기 때문에 해당 기술 플랫폼(ex, elasticsearch 홈페이지)에서 검색하자





ElasticSearch란

  • 텍스트, 숫자, 위치 기반 정보, 정형 및 비정형 데이터 등 모든 유형의 데이터를 위한 무료 검색 및 분석 엔진

  • 방대한 양의 데이터를 신속하게, 거의 실시간으로 저장, 검색, 분석

  • 단독으로 사용되기도 하고 ELK 스택으로 사용되기도 한다

  • 분산형과 개방형의 특징
    • 여러가지 구조로 분산해 저장하며 안전성 증가
    • 오픈 소스로 누구나 쉽게 이용할 수 있다
  • java base의 검색엔진
  • JSON기반의 분산형 검색 및 분석 엔진
  • 많은 양의 데이터를 보관하고 분산형, 실시간으로 분석 엔진
  • 데이터 저장소, 빅데이터 처리할 때 매우 우용(RDBMS 와 흡사한 기능)
  • 확장성(json 문법만 OK)이 매우 좋은 자바로 구현된 오프소스 검색엔진




사용이유, 장점

  • 빠른 검색, 분산성? => 샤드로 인한 분산성
  • Replica를 통한 안전성
  • Json type으로 스키마 개념 없다



빠른 검색?, 역색인

  • 일반적인 경우 카테고리를 만들고 문서의 위치를 카테고리의 맞게 저장, 문서를 카테고리로 분류하며 문서를 찾기 위해 카테고리를 확인

  • 역색인은 문서 내의 문자와 같은 내용들을 맵핑해 색인해놓는 과정을 거쳐 검색할 때 데이터를 우선으로 해당 데이터가 어떤 문서들에 존재하는지를 검색해 문서들을 찾는다
    • 문서의 내용들을 적절하게 맵핑해서 데이터화
    • 어떤 문서에 존재하는지, 단어의 위치, 빈도 수 등

  • 이 때 단어를 쪼개는 과정 존재하는데 쪼개진 단어들을 term이라고 지칭하며 결국 term을 포함하고 있는 document들을 찾아 빠르게 검색할 수 있다


Analyze

  • 역색인을 위해 미리 값을 정제해 저장하는 과정이 필요한데 이를 Analyze라 한다

  • Analyze는 여기서 데이터가 저장되는 기준을 설정하는 것이며 특별한 정의가 없다면 내장되어 있는 Standard Analzye를 통해 Document가 역색인 구조로 Mapping되어 저장

  • Tokenizer + Token Filter로 구성

  • Tokenizer : 정해진 separator(공백, ,(쉼표) , .(마침표) 등)를 기준으로 문자를 분리하는 작업 수행

  • Token Filter : 분리된 단어들을 검색 가능하도록 가공하는 작업 수행,
    • lowercase : 단어 소문자화
    • stop : 불필요한 단어 제거
    • synonym : 동의어 추가
  • 결론적으로 Tokenizer를 이용해 Term을 만들고 Filter를 통해 적절한 형태로 가공해 저장하며 이는 궁극적으로 빠른 검색 속도를 낼 수 있게 하는 본질적인 원인이라 볼 수 있다


Mapping

  • Document는 Fileds의 집합체이며 여러 Filed들은 각자 고유한 Type을 가지고 있음

  • 때문에 데이터의 저장 형태와 검색을 위해 해당 데이터를 어떻게 접근하고 처리할지에 대한 명세가 필요하고 이 작업을 Mapping이라 한다
    • Document의 Field 목록도 함께 포함하며 Document의 Metadata에 대한 적절한 처리 방법 정의


Mapping 배경

  • DB의 경우 만들 때 반드시 스키마 설계 필요
    • 여기서 스키마는 테이블을 구성하는 구성 요소간의 관계와 정의를 의미한다
      • 컬럼의 타입과 PK, FK 등
    • ES는 스키마가 존재하지 않기 때문에 스키마 설계 대신 Mapping 작업
    • JSON 형태의 데이터(저장하기 이전의 원본 데이터)를 루씬이 이해할 수 있도록 바꿔주는 작업

  • ES가 스키마가 없다고 Fileds(RDBS에서 Column)의 type이 존재하지 않는 것은 아님

  • Document의 Filed들은 각자 고유한 type들을 가지고 있기에 JSON 형태로 입력받은 소스 데이터들을 적절한 데이터 타입으로 변환시켜주는 작업


Mapping 종류

  • Dynamic Mapping : ES 자체적으로 설정되어 있는 경우
  • Explict Mapping : 사용자가 인위적으로 정의하는 경우


참고

  • Analyze => Mapping 과정을 통해 ElasticSearch에 저장된다
  • JSON 문자를 token에 이어 term으로 만드는 과정은 Analyze에서 그리고 term을 저장, 관리 설정은 Mapping에서 진행






구조

  • 클로스터 > 노드> 인덱스(RDB에서 DB) > 샤드

클러스터

  • 하나의 서버에 클러스터 여러 개 존재할 수 있지만 서로 다른 클러스터끼리는 접근, 교환 불가한 독립적인 시스템으로 유지

노드

  • Index로 구성되어 있다
  • 실질적으로 노드를 이용해 여러 가지 작업 진행
    1. 인덱스 생성, 삭제 기능의 노드
    2. 데이터 관련 CRUD 작업 노드
    3. 데이터 변환 노드 등

Index

  • RDB에서 테이블 역할이라 보면 된다
  • 샤드로 구성되어 있다
    • 정확히 Primary와 Replica

샤드

  • Index를 여러 조각으로 나눈 것

  • 샤딩 : 데이터 분산해서 저장하는 방법, INDEX를 여러 개로 쪼개는 작업

  • 검색 속도와 관련해 클러스터 내의 샤드 갯수를 조정하는 튜닝하기도 함

  • Primary와 Replica 2가지로 종류 존재

  • Primary가 원본이라 한다면 Replica는 복제본

  • Primary : 원본 데이터

  • Replica : 노드를 손실했을 경우 데이터의 신뢰성을 위해 샤드 복제한 것
    • 때문에 node내에 서로 다른 종류의 Primary, Replic 샤드 존재
    • 같은 node에 Primary와 Replic 존재하면 의미 X






Alias

  • Data Stream 또는 Indices에 대한 두번째 이름
  • 대부분의 ES APIs는 Data Stream 또는 Index 이름 대신에 Alias를 받는다


배경

  • ES의 경우 Index를 운영할 때 Index의 수정은 불가하다
    • Index를 삭제하고 다시 만드는 작업만이 Index를 수정하는 유일한 방법

  • 클러스터를 운영중인 상황에서는 삭제하고 다시 만드는 도중에 쿼리를 받을 경우 제대로 된 응답을 하지 못하게 된다
    • 이를 유연하게 대처하기 위해 새 Index를 만들고 기존의 Index를 새 Index에 Reindex 진행
    • 기존의 Index 삭제, 기존의 인덱스 명을 새 인덱스의 Alias로 사용

  • 한줄로 어플리케이션 코드에 정지시간(downtime) 또는 어떤 변화없이 데이터를 reindex(copy) 할 수 있기에 사용

  • 일부 블로그에서는 alias 뒤에 version 혹은 timestamp 등을 통해 client가 index를 사용하는데 무리없이 사용된다는 내용 일부 이해했지만 구체적으로 어떻게 운영되나 찾아봤다
    • 기존 index 존재(alias 지칭) 상황을 가정할 때, index를 수정해야된다면 기존 index의 수정된 결과를 신규 index에 reindex하며 alias를 지칭하는 동시에 기존 index와 alias 삭제






용어

Index

  • 색인 데이터

Indexing

  • 색인하는 과정

Indices

  • 매핑 정보를 저장하는 논리적인 데이터 공간
    • 사용자는 Index 하나를 의식하고 작업하지만 실질적으로는 샤드 형태로 여러 노드에 나눠 존재하는데 이를 의미하는 것 같다는 생각이 든다(?)

highlight

  • 검색 결과를 강조하는 기능






Kibana

  • Elasticsearch를 위한 시각화 및 관리 도구

RDBS와 비교

ES는 MySQL, kibana는 workbench 느낌

  • mysql : 오픈 소스의 관계형 데이터베이스 관리 시스템(RDBMS)
  • workbench : SQL 개발과 관리, 데이터베이스 설계, 생성 그리고 유지를 위한 단일 개발 통합 환경을 제공하는 비주얼 데이터베이스 설계 도구

RDBS : ES

  • ROW : Document
  • COLUMN : Field
  • Table(ROW + COLUMN) : index






ref

0개의 댓글