Database/Elasticsearch

[Elasticsearch] Elasticsearch란 무엇이고 왜 사용하는가

SeungbeomKim 2023. 11. 10. 16:27

 

Elasticsearch는 Apache Lucene 기반의 검색 엔진입니다. HTTP 웹 인터페이스와 스키마에서 자유로운 Json 문서와 함께 멀티테넌트 지원 전문 검색 엔진을 제공합니다. 더불어, 자바 기반의 오픈 소스이지만, 클라이언트는 수많은 언어(Java, C#, PHP, Python..)로 이용이 가능합니다.

elasticsearch-image

 

Apache Lucene 특징

  1. 자바 언어로 개발
  2. 사용자 위치 정보 이용 가능
  3. 다국어 검색 지원
  4. 자동 완성, 미리 보기 지원
  5. 철자 수정 기능 지원

 

Elasticsearch 특징

  1. 분산 시스템
    • 여러 개의 node로 구성되는 분산 시스템
    • 기존 node에서 새 node를 실행하여 연결하는 것만으로 확장 가능
    • data는 각 node에 분산하여 저장
    • 복사본(replica)을 유지하여 각종 충돌로부터 node data 보호
    • discovery를 내장하여 별도의 분산 시스템 관리자 불필요
  2. 높은 가용성
    • 각 노드는 1개 이상의 원본 및 복사본을 다른 위치에 저장
    • 노드가 종료되거나 실행에 실패할 경우 다른 노드로 data 이동
  3. 멀티 테넌시(multi tenancy)
    • data는 여러 개로 분리된 인덱스들에 그룹으로 저장 (index = RDBMS의 DB에 대응)
    • 서로 다른 인덱스의 데이터를 하나의 질의로 검색하여 하나의 출력으로 도출 가능
  4. JSON DOCUMENT / RESTFUL API
    • 기본적으로 모든 필드를 색인 후 Json 구조로 저장
    • Json 구조로 인해 모든 레벨의 필드에 접근이 쉽고, 빠른 속도로 검색이 가능합니다.
    • 사전 매핑 없이, Json 문서 형식으로 데이터를 입력하면 바로 색인 작업 수행
    • Rest 자원은 색인된 데이터 및 질의, 검색되어 Json 형식으로 출력된 문서를 뜻합니다.
    • Json 문서를 Uri로 명시, 이 문서를 처리하기 위해 HTTP Method 이용
  5. 실시간 분석 
    • 저장된 데이터는 검색에 사용되기 위해 별도의 재시작 / 갱신이 불필요
    • 색인 작업이 완료됨과 동시에 바로 검색 가능
    • 실시간 분석 / 검색은 데이터 증가량에 구애받지 않습니다.

 

elasticsearch 환경설정 

 

elasticsearch.yml 

cluser.name = 클러스터 이름 설정 (default: elasticsearch)
node.name = 노드 이름 설정 
bootstrap.mlockall = 사용 메모리 고정(JVM이 메모리를 다른 자바 프로그램으로 돌리는 것을 방지)
index.number_of_shard = 샤드 개수 지정(default: 5)
index.number_of_replicas = 복사본 개수 지정(default: 1)

HTTP Network Setting

network.bind_host: 서버 내부 IP 주소(방화벽, 공유기 사용시)
network.publish_host: 공개 IP 주소
network.host: 내부 IP와 공개 IP가 동일할 경우 사용
tranport.tcp.port: 다른 노드와 바인딩하여 통신하기 위해 사용하는 포트(default:9300)
transport.tcp.compress: 통신 내용의 압축 여부
http.port: REST API 서비스 포트(default:9200)
http.max_content_length: 최대 전송 데이터
http.enabled: REST API 제공 여부

 

System 구조

elasticsearch-system-architecture

Cluster

  • ES의 가장 큰 단위
  • 여러 대의 서버나 노드가 함께 동작하여 데이터를 저장하고 처리하는 분산 환경
  • 하나의 Cluster는 여러 개의 Node로 이루어져 있습니다.
  • 여러 대의 서버가 하나의 클러스터를 구성할 수 있으며, 그 반대도 가능합니다.
  • 같은 클러스터의 이름으로 노드를 실행하는 것만으로도 자동 확장

Node

  • ElasticSearch를 구성하는 하나의 단위 프로세스
  • node는 master, data node로 구분
  • master node는 전체 cluster 상태의 메타 정보를 관리
  • 기존의 master node가 종료되는 경우, 새로운 master node가 선출됨
  • data node는 실제 데이터가 저장되는 node
  • data node가 하나밖에 없는 경우, 복사본은 생성되지 않습니다.
  • data node는 외부 접근을 차단합니다.

 

node binding

elasticsearch-node-binding

  • 같은 cluster name을 가지고 실행된 노드는 자동으로 바인딩
  • 9200 Port Number부터는 Rest API를 위한 HTTP Port가 할당
  • 9300 Port Number 부터는 node binding을 위한 Port로 할당

Network binding

elasticsearch-network-binding

  • Scale-Out을 위해 네트워크에 있는 다른 서버의 노드와도 binding 가능
  • multicast, unicast 방식을 모두 지원
  • 반드시 두 elasticsearch의 version은 동일해야 합니다.

Shard, Replica

  • Shard: 데이터 검색을 위해 구분되는 최소 단위
  • Index는 기본적으로 Shard 단위로 분리되고, 각 노드에 분산되어 저
  • Replica: Shard에 대한 복제본
  • Replica를 만드는 이유는 원본 Shard에 문제가 생기더라도, Replica를 통해 데이터를 제공할 수 있게 되어 고가용성 증대 및 하나의 데이터를 2개의 Shard가 갖고 있기 때문에 검색 성능이 향상되기 때문입니다.

 

Elasticsearch Data Structure

  • Document: ES의 단일 데이터 단위
  • Type: Document를 모아놓은 집합체
  • Index: 여러 개의 Type을 모아놓은 집합체(Index라는 단어가 여러 뜻으로 사용되기 때문에 데이터 저장 단위인 인덱스는 indices라고도 표현)
  • Indexing: 데이터가 검색될 수 있는 구조로 변경하기 위해 원본 문서를 검색어 토큰들로 변환하여 저장하는 일련의 과정 = 색인 (data를 Elasticsearch에 저장하는 과정)

Elasticsearch에서 데이터를 검색하는 과정 (Query or Filter)

쿼리와 필터 비교 사진

  • ES에서 데이터를 찾고 구분하는 기능은 크게 쿼리 및 필터를 이용하는 방법으로 나뉩니다. 
  • 쿼리와 필터는 모두 Json 형식으로 구현하며 이를 QueryDSL(Domain Specific Language)이라고 합니다.
  • 각각 독립적인 요소로 실행하고, 문법은 Aggregation과 같은 API 내부에서도 사용합니다.

기본적인 형태소 분석 과정

  • 대문자는 모두 소문자로 변환
  • 중복 단어 제거
  • 분석 과정을 거치고 저장된 토큰을 텀(term)이라 칭합니다.

ES의 사용 사례

  • Wikipedia: 전문검색 수행, 실시간 타이핑 검색, 추천 검색어 기능
  • Github: 13000억 줄이 넘는 소스 코드를 검색하는 데 사용
  • Stack Overflow: 검색내용과 결과를 통합해 유사한 질문과 해답을 연결

 

Elasticsearch의 개념과 장점, 시스템 및 데이터 구조에 대해 알아보았습니다. 이제 다음 포스팅에서는 Data Indexing, Searching을 하기 위한 Query의 종류와 사용 방법에 대해 간략한 코드와 함께 보여드리도록 하겠습니다. 

 

'Database > Elasticsearch' 카테고리의 다른 글

[Elasticsearch] Data Indexing, Searching By Query  (0) 2023.11.15