Contents

Elastic Search 개념 다지기

ElasticSearch란?

“루씬(Lucene)이라는 검색 라이브러리를 기반으로 검색 기능을 제공하는 오픈 소스 검색 엔진이다."

  1. 아파치 루씬 기반 아파치 루씬 은 자바로 개발된 검색 서비스용 라이브러리. 루씬은 전문 텍스트 검색(Full text search)에 특화되어 있어 문서가 색인될 때부터 검색 가능해질 때까지의 대기시간이 매우 짧다는 장점이 있다.

  2. Restful API REST API 형태로 조작할 수 있다. 검색 및 분석 결과를 API 형태로 제공한다. 어플리케이션에서 쉽게 활용할 수 있는 장점이 있다.

  3. JSON 기반 JSON 형으로 모든 요청 및 응답 문서를 표현한다. 덕분에 텍스트, 숫자, 위치 기반 정보 등 정형, 비정형 데이터를 대상으로 분석 및 검색이 가능하다.

  4. 분산 시스템 클러스터 기반이기에 서버 확장이 가능하고, 확장된 서버에 데이터를 분산하여 병렬처리가 가능하기때문에 검색 대상의 용량이 크더라도 빠르게 분석 및 검색이 가능하다.

  • 클러스터: 여러 대의 컴퓨터 혹은 구성 요소들을 논리적으로 결합하여 전체를 하나의 컴퓨터, 하나의 구성 요소처럼 사용할 수 있게 해주는 기술

  • 노드: 클러스터를 구성하는 하나하나의 프로세스

    es cluster

클러스터를 구성하고있는 노드 중 어느 노드에 요청해도 동일한 응답과 동작을 보장받을 수 있다.

단일 노드로도 클러스터를 구성할 수 있지만, 단일 노드로 클러스터를 구성했을 경우 해당 노드에 장애가 발생한다면 요청 불가 상태가 된다. 반면에 다수개의 노드로 클러스터를 구성하게되면, 하나의 노드에 장애가 발생해도 다른 노드에서 요청을 처리 할 수 있기에 안정적으로 운영이 가능하기때문에 단일 노드의 구성은 추천하지 않는다.

es cluster

  • 디스커버리: 노드가 처음 실행할 때 하나의 클러스터로 바인딩하는 과정

스크린샷 2022-01-12 20.18.07

  • 마스터(Master-eligible)

    • 클러스터 구성에서 중심이 되는 노드
    • 클러스터 내의 노드의 상태, 성능 정보, 샤드 정보 등 메타데이터를 관리하면서 클러스터의 안정성을 확보하기 위해 필요한 작업을 수행한다.
    • 반드시 한 대 이상으로 구성해야한다.
    • 마스터 역할이 가능한 후보 노드와 실제 마스터 역할을 하는 노드로 구분된다.
    • 마스터 후보 노드는 마스터 노드로부터 지속적으로 클러스터 운영에 필요한 데이터를 전달 받고, 마스터와 노드와 같은 메타 데이터를 유지한다.
    • 마스터 노드 장애시 마스터 후보 노드 중 한대가 마스터 도의 역할을 수행하기때문에 중단 없이 서비스를 운영 가능하다.

    스크린샷 2022-01-12 20.03.52

  • 데이터(Data)

    • 사용자가 색인한 문서를 저장하고, 검색 요청을 처리해서 결과를 돌려주는 역할

    • 자신이 요청을 직접 처리하거나 다른 데이터 노드에게 요청을 전달한다.

      스크린샷 2022-01-12 20.04.12

    • 종류

      • Content Data: 유저가 만든 콘텐츠를 수용하는 노드. CRUD, 검색 및 집계와 같은 작업을 가능하게한다.
      • Hot Data: 시계열 데이터를 저장한다. Read/write가 빠르며 더 많은 하드웨어 리소스가 필요하기 때문에 고사양의 서버에 적합하다.
      • Warm Data: 더 이상 업데이트가 되지 않지만 쿼리를 실행하는 인덱스를 저장한다. 오래된 데이터지만 활용하고 있는 데이터를 보관한다.
      • Cold Data: 읽기 전용 인덱스를 저장한다.(자주 사용하지 않는 인덱스) 읽기 전용 데이터의 경우 클러스터의 저장공간을 최대 50% 절약 가능하다.
      • Frozen Data: shared_cache 옵션만으로 마운트 된 검색 가능한 스냅샷을 저장한다. 스냅샷 데이터를 해당 노드에 저장하고 데이터를 검색 가능하도록 하는 노드이다.
  • 인제스트(Ingest)

    • 사용자가 색인하길 원하는 문서의 내용 중 변환이 필요한 부분을 사전에 처리하는 노드

    • 데이터 노드에 저장하기 전 특정 필드의 값을 가공해야 할 경우 유용하다.

    • Logstash 와 비슷한 기능을 갖고있다.

      스크린샷 2022-01-12 20.04.24

  • 코디네이트(Coordinate)

    • 사용자의 요청을 데이터 노드로 전달하고, 다시 데이터 노드로부터 결과를 취합하는 노드
    • 중간다리 역할을 한다.
    • 문서를 저장하지 않는 데이터 노드라고 생각할 수 있다.

스크린샷 2022-01-12 20.04.38

  • 사용자의 데이터가 저장되는 논리적인 공간

  • RDBMS에 비교하자면 데이터베이스라고 볼 수 있다.

  • 이름은 클러스터 내에서 유니크해야한다.

  • 인덱스에 저장된 문서들은 데이터 노드들에 분산 저장된다.

  • 인덱스 안의 데이터를 유형별로 논리적으로 나눠 놓은 공간
  • RDBMS에 비교하자면 테이블의 개념으로 볼 수 있다.
  • 6.x 버전 이후로 하나의 인덱스에 하나의 타입만을 가질 수 있다. 큰 이슈가 없다면 _doc을 타입명으로 사용하게된다.

ElasticSearch는 인덱스를 샤드로 나누고 나뉘어진 샤드에 세크먼트 단위로 문서를 저장한다.

  • 인덱스에 색인되는 문서들이 저장되는 논리적인 공간
  • 장애 상황에서 유실되지않고, 서비스의 연속성을 유지하기 위해 프라이머리 샤드와 레플리카 샤드로 나눠서 관리한다.
    • 프라이머리 샤드(Primary Shard)
      • 인덱스를 최초로 생성하는 시점에 개수를 결정, 이후 변경 불가하다.
    • 레플리카 샤드(Replica Shard)
      • 프라이머리 샤드의 복제본
      • 프라이머리 샤드가 저장된 노드와 다른 노드에 저장된다.
      • 프라이머리 샤드와 동일한 문서를 가지고 있기 때문에 사용자의 검색 요청에도 응답 할 수 있어, 레플리카 샤드의 개수를 늘릴 경우 검색 요청에 대한 응답 속도를 높일 수 있다.
  • 샤드의 데이터들을 가지고 있는 물리적인 파일
  • 하나의 샤드는 다수의 세그먼트로 구성되어있다.
  • ElasticSearch에 데이터를 색인하면 ElasticSearch는 이것을 메모리에 모아두고 새로운 세그먼트를 디스크에 기록하여 검색을 리프레쉬하여 새로운 검색 가능한 세크먼트를 생성한다.
  • 샤드에서 검색 시, 각 세그먼트를 검색하여 결과를 조합한 후 최종 결과를 해당 샤드의 결과로 리턴한다.
  • 불변의 성질을 가지고 있기때문에 데이터가 업데이트되면, 실제로는 삭제되었다고 마크만하고 새로운 데이터를 가르키게 된고 삭제되었다고 마크된 데이터는 디스크에 남아있다 백그라운드에서 주기적/특정 임계치를 넘기면 더이상 필요없어진 데이터들을 정리하고 새로운 세그먼트로 병합한 후 세그먼트를 디스크에서 완전히 삭제하는 병합 과정을 거치게된다.

모든 인덱스는 settings, mappings 라는 두 개의 정보 단위를 가지고 있다.

  • 처음 인덱스를 정의하면 number_of_shards, number_of_replicas 와 같이 몇가지 정보들이 자동으로 생성된다.
  • number_of_shards
  • 프라이머리 샤드 수
  • 인덱스를 처음 생성할 때 한번 지정하면 변경이 불가하다.
  • 샤드의 수를 변경하려면 새로 인덱스를 정의하고 기존 인덱스의 데이터를 재색인 해야 한다.
  • number_of_replicas
  • 리플리카 샤드 수
  • 다이나믹하게 변경이 가능하다.
  • Refresh_interval
    • ElasticSearch에서 세그먼트가 만들어지는 리프레시 타임을 설정하는 값
    • default 값은 1s
    • 다이나믹하게 변경이 가능하다.
  • analyzer, tokenizer, filter
  • RDBMS와 비교하자면 스키마와 유사하다. ElasticSearch에 저장될 JSON 문서들이 어떤 키와 어떤 형태의 값을 가지고 있는지 즉, 사용자가 색인한 문서의 다양한 필드들을 적절한 타입으로 스키마를 정의하는 것이다.

  • 미리 정의해 놓고 사용하는 정적 매핑(static mapping) 미리 정의하지 않은 상태에서 최초 색인된 문서를 바탕으로 ElasticSearch가 자동으로 매핑을 생성해주는 동적 매핑(dynamic mapping) 이 있다.

  • 이미 만들어진 매핑에 필드를 추가하는 것은 가능하지만, 이미 만들어진 필드를 삭제하거나 필드의 타입 및 설정값을 변경한는 것은 불가능하다.

  • 데이터 타입 종류

    코어 데이터 타입 설명 종류
    String 문자열 데이터 타입 text, keyword
    Numeric 숫자형 데이터 타입 Long, integer, short, byte, double, float, half_float, scaled_float
    Date 날짜형 데이터 타입 date
    Boolean Bool 데이터 타입 boolean
    Binary 바이너리 데이터 타입 binary
    Range 범주 데이터 타입 integer_range, float_range, long_range, double_range, date_range