[ES] ElasticSearch, 너 뭐냐?

코박·2022년 7월 27일
0

ElasticSearch

목록 보기
1/5

일반적인 검색의 문제

RDBMS 내 검색 (WHERE, LIKE 등등)

단순 텍스트 패턴매칭에 대한 검색만을 제공

  • (ex. like %가%)

다량 또는 복잡한 조건의 데이터 검색 시, 속도 현저히 느려짐

자연어 처리 및 비정형 데이터의 색인과 검색 불가

시나리오로 좀 더 알아볼까요?

문제점 시나리오

사용자 검색

두루치기가 먹고싶다!

감자마켓 에 방문하신 유OO 씨는 "두루치기" 를 검색

하지만 배고픔으로 인해 급한 나머지 "enfnclrl(두루치기)" 로 검색

서버의 RDBMS 내 데이터 조회

뭐? enfnclrl? 오케이!

RDBMS의 관리중인 "Food" 테이블에서 enfnclrl이 포함된 데이터를 조회

사용자가 원하지 않는 결과 반환

너가 원하는 데이터야! 자!

RDBMS 씨는 싱글벙글하며 결과를 반환

당연하게도 저런 데이터가 존재하지않아 Empty 를 반환

분노 & 서비스 사용하지않음

뭐야 왜 안나와!

사용자의 실수를 고려하지 않는 결과에 분노하며 사이트를 꺼버림

해결 방법?

이처럼 서비스를 이용하는 고객들은 예기치못한 상황을 발생시킴

이런 상황에 대해 유연하게 대처할 수 있는 서비스의 개발이 필요

이런 검색도 해결해줄 영웅 어디 없나?

엘라스틱 서치

엘라스틱 서치?

루씬(정보 검색 라이브러리)을 기반으로 개발된 오픈소스 검색 엔진

NoSQL(비관계형 데이터베이스) 의 일종

기존 데이터베이스의 검색 방식이 아닌 역색인 방식의 검색을 지원

전문검색 및 분석 후 검색 지원

Rest API 지원

루씬 라이브러리

자바로 만들어진 고성능 정보 검색 개발용 라이브러리

색인과 검색기능에만 집중한 강력한 기능 지원

정확도와 재현율을 기준으로 검색의 품질을 구현

  • 정확도: 관련없는 데이터를 얼마나 정확하게 제거한지 판단
  • 재현율: 입력받은 데이터를 얼마나 빼먹지않고 찾아냈는지 판단

루씬 검색 과정

관리 인터페이스

  • 서버 상태 관리, 검색 과정에서의 다양한 설정 API 를 담당

분석 인터페이스

  • 웹 기반으로 구성, 질의어 분석과 데이터 분석 API를 담당

역색인

색인 (List)

  • 어떠한 내용에 대해 최단시간내에 찾아내기 위해 먼저 조회하는 자료구조
    • ex) 책의 목차
  • 일반적인 RDBMS 에서 주로 단방향 색인을 사용
  • 문서들을 조회하며 해당 단어가 있는지 확인

역색인 (Map)

  • 분석된 키워드들을 바탕으로 문서를 찾아가는 형식
  • 미리 인덱싱되어있는 구조를 통해 단어가 나타나는 문서를 빨리 찾아낼 수 있음

인덱싱

  • 데이터 프레임 내에서 특정한 데이터만 골라내는 과정

논리적 구조



index -> My SQL 의 데이터 베이스, 검색에 최적화 된 문서의 집합

type -> My SQL의 테이블
엘라스틱 7.0 이후부터 완전히 사라짐 (Index역할 위임)

field -> My SQL의 칼럼 (검색 설정 정의)

document -> 다중 필드와 값을 가진 독립적인 데이터

물리적 구조

세그먼트

  • 엘라스틱 서치의 빠른 문서 검색을 위해 설계된 자료 구조
  • 검색 시, 샤드에 있던 다량의 세그먼트들이 결과값을 도출

샤드

  • 인덱스 내부의 파티션, 데이터 손실 최소화 가능

노드(프로세스 단위)

  • 엘라스틱 서치의 대용량 데이터(클러스터)의 색인 및 검색을 처리
  • 마스터노드, 데이터노드, 코디네이팅 노드, 인제스트 노드로 이루어져있으며
    각자의 수행 작업이 모두 다름

    클러스터(시스템 단위)

  • 엘라스틱 서치의 노드가 여러개 모인 전체 데이터를 저장하고 모든 노드를 포괄하는
    통합적인 색인과 검색을 처리함
  • 각 클러스터는 고유한 이름을 지녀야 노드가 잘못된 곳에 포함될 일이 없음

검색 과정

Query Phase

  • 처음 쿼리 명령을 받은 노드는 모든 샤드에게 쿼리를 전달 후 1차적으로 샤드 검색 실행
  • 각 샤드들은 요청된 크기만큼의 검색 결과 큐를 노드로 반환

Fetch Phase

  • 노드는 반환받은 결과들의 점수 (score) 를 기반으로 정렬한 후, 샤드들에게 최종 결과를 요청
  • 전체 문서내용등의 정보가 담긴 결과가 반환되어 클라이언트로 전달

REST api 를 통한 데이터 조작

example)
curl -XGET http://localhost:9200/shop/products/1
-->
shop 이라는 인덱스(데이터베이스)의
products라는 타입(테이블)의
첫번째 Document(Row, 데이터)를 가져오라는
명령어입니다.

#### 이를 이용해 직접 Postman 과 같은 프로그램을 사용 #### curl 명령어를 통해 직접 ES Server 에 접근해 데이터를 조작 가능함

엘라스틱 서치 사용 이유

기존의 RDBMS 와 저장방식의 차이로 대량의 데이터를 고속으로 처리 가능

엘라스틱 서치만으로도 기본적인 백엔드 구성 가능

  • elk stack (ElasticSearch / Logstash / Kibana) 활용
  • ElasticSearch: 데이터를 저장/쿼리 생성/검색 및 분석 처리 담당
  • Kibana: 시각화 및 분석을 위한 관리 도구
  • Logstash: 데이터 수집 도구 (동기화 처리 유용)

Rest API 만으로 작업 수행 가능

그리고 시나리오를 통해 알아봅시다.

엘라스틱 서치 사용 시나리오

사용자 검색

후.. 여기도 없으면 맥북을 부수고 윈도우로 가겠어!

분노를 가라앉히고 이번에 새로나온 마켓 GG 에 방문하신 유OO 씨는 "두루치기" 를 검색

하지만 이번에도 배고픔과 분노로 인해 급한 나머지 "enfnclrl(두루치기)" 로 검색

분석된 키워드로 인덱스 조회

뭐? enfnclrl? 이거 오타같은데.. "두루치기, enfnclrl" 둘다 오케이!

관리중인 "Food" 인덱스에서 분석기를 통해 뽑아낸 enfnclrl두루치기가 포함된 데이터를 조회

원하는 결과 반환

이걸 먹고 싶었니?

이상한 검색어임에도 정상적으로 두루치기를 잘 찾아 반환해준 모습

유OO씨는 눈에서 뜨거운 물이 흐르는걸 느낌

편안

고마워요! 엘라스틱 서치!

강력한 검색 엔진, 엘라스틱 서치!

Q. 어떻게해서 저런 검색이 가능했던 걸까요? 코드 구현 아닌가요?

A. 엘라스틱 서치에서는 여러 플러그인을 통해 시나리오와 같은 오타뿐만 아니라, 사전에 등록된 여러 동의어 처리도 가능하게끔 해줄 수 있습니다.

Q. 금액을 지불해야한다거나 제한적인 부분이 존재하는거 아닌가요?

A. 내부에 보안 패키지를 사용하거나 ES 에서 제공하는 Cloud를 통해 관리를 할 것이 아니라면 절대적으로 무료로 서비스를 제공해줍니다.

이외에도 자동완성, 오타교정(ex. 유호챨 -> 유호철)과 같은 작업들도
처리해줄 수 있는 여러 플러그인들과 기본적으로 제공해주는 것들이 많이 존재함

엘라스틱 서치의 뒷면

엘라스틱 서치 단점

진입 장벽이 높다

  • 현재까지 한 설명만 해도 솔직히 이해가 잘 가지않는 부분이 많았을 거라 생각

각 데이터간 조인을 수행 할 수 없다.

  • 다만 이 경우엔 쿼리를 두번 던져 해결 가능

트랜잭션과 롤백을 제공하지 않는다.

실시간 검색 기능이 아님

  • 형태소 분리 등 색인한 데이터를 기준으로 1초 정도 후에 검색 가능

기존 데이터 Update 를 제공하지 않음

  • 업데이트 명령 요청 시 기존 문서를 삭제하고 새로운 문서를 생성하는 방식

엘라스틱 서치 유의사항

기존 RDBMS와 동시 사용 시 동기화 처리 유의

  • 동기화 실패 시, ES 서버와 기존 DB 내용이 달라 원하는 검색 불가능
  • 주로 사용하는 동기화 방법에는 ELK 스택의 LogStatsh를 사용함

노드는 최소 3개 유지

  • 노드를 2개만 유지 할 시, 메인 노드 에러 시 2번 노드로 사용 불가
  • 2번 노드의 동기화 데이터를 복제 시킬 노드가 없어 사용 불가

최대 인덱싱 개수 제한

  • 처음 인덱스를 만들면 검색 시, 최대 인덱싱 할 수 있는 데이터의 수가 1만개가 기본, 최대 5만개 까지 설정이 가능
  • 5만개가 넘어갈 경우, 이상의 데이터 조회 불가능
  • 이에 따른 대응책이 필요
profile
웹 개발자 할래요

0개의 댓글