Documents

ElasticSearch

아래 책를 참고하여 학습한 내용을 정리/기록한 포스트입니다. 자세한 내용은 책을 참고하시기 바라며, 문제가 있을 경우 연락 부탁드립니다.

elasticsearch-in-action

ES 소개

관련 결과와 추천이 필요한 이유는 단지 우리가 성급해졌거나 좋은 검색엔진으로 인해 참을성이 없어졌기 때문만은 아니다. 점점 더 선택해야 할 것들이 많아지기 때문으로도 볼 수 있다.

  • ES는 아파치 루씬Apache Lucene 위에서 만들어진 오픈소스 분산 검색엔진이다.

  • 일반적으로 빅데이터를 색인해서 전문검색과 실시간 통계를 실행하는데 사용된다.

  • 검색의 유사성을 조정해서 검색 제안을 할 수도 있다.

  • 클러스터 설정 뿐만 아니라 데이터 색인과 검색을 위해 JSON 형식의 HTTP API를 사용한다.

    • REST API 대신 Native Java API를 사용하려면 9300 포트(transport)에 연결해야 한다.

  • 실시간 검색 혹은 데이터 색인/검색을 위한 NoSQL 데이터 저장소로도 사용할 수 있다. 기본적으로 document 기반이고 확장성이 있다.

    • 다른 NoSQL 저장소와 같이, ES는 트랜잭션을 지원하지 않는다.

  • ES는 자동으로 데이터를 샤드에 나눠서 클러스터 중 이용 가능한 서버들에 분산시켜 균형을 유지한다.

기능 들여다보기

Elasticsearch cluster

Application’s view: logical layout

Logical layout

  • 검색 애플리케이션이 무엇을 알아야 하는지

  • ES에서 document의 index를 만들 때 index 안의 type에 document를 넣는다. index > type > document

  • index-type-ID 조합은 ES에서 하나의 문서를 유일하게 식별한다.

Document
{ (1)
    "name": "yeongjun.kim", (2)
    "age": 30, (3)
    "hobby": ["coding", "skateboard"], (4)
    "job": { (5)
        "name": "software engineer",
        "location": "naver financial"
    }
}
1 JSON 표현으로 된 데이터를 Document라고 한다.
2 Document는 Field와 값Elasticsearch Denver을 가진다. "name" 이 Field이고, "yeongjun.kim" 이 값이다.
3 "age" 필드Field의 type은 long이다.
4 Array를 포함할 수 있다.
5 계층을 가질 수 있다.

Document

  • ES에서 데이터의 가장 작은 단위

    • ≒ row(rdbms)

  • 보통 데이터의 JSON 표현

  • 유연한 구조로 미리 정의한 스키마에 의존하지 않음

    • ES에서 document는 스키마가 없다고 말함. → 모든 문서가 같은 필드를 가질 필요가 없고, 같은 스키마일 필요가 없다는 뜻

  • 각 field의 type은 중요

    • ES는 모든 field와 type 그리고 다른 설정에 대한 매핑을 보관하고 있음 → mapping 타입으로 불리기도 함

Type

  • 문서에 대한 논리적인 컨테이너

  • 각 type에서 field의 정의를 mapping이라고 부름

  • ES 7.0에서 Type은 완전히 사라졌다.

ES에서 스키마가 없다면 왜 document는 type에 속해 있으며, 각 type은 스키마와 같은 mapping을 포함하는가?
  • document가 반드시 스키마가 필요하진 않기 때문에 schema-free라고 한다.

  • document는 mapping에 정의한 모든 field를 포함할 필요가 없다.

  • document는 mapping에 정의한 field 외에 새로운 field를 생성할지도 모른다.

  • product에 안전한 방법은 색인을 만들기 전에 mapping을 정의하는 것이다.

  • 새로운 document가 mapping에 존재하지 않는 field와 함께 색인되면 ES는 자동으로 새로운 field를 mapping에 추가한다.

    • field를 추가하기 위해 type이 무엇인지 추측한다. 예를 들어 값이 7이면 long 타입으로 가정한다.

  • 우선 mapping은 type에서 지금까지 색인한 모든 document의 모든 field를 포함한다. → 뭔말이지??

Index

  • 색인은 mapping 타입의 컨테이너이다.

    • ≒ database(rdbms)

  • 색인은 shard라는 chunks로 나뉜다.

    • 하나의 shard는 하나의 루씬 색인이다.

    • 색인은 여러개의 루씬 색인으로 구성된다.

  • 모든 mapping 타입의 모든 field를 저장하고, 고유의 설정을 한다.

  • es에서 데이터를 저장하기 위한 장소로, RDBMS의 데이터베이스와 유사하다. index는 하나 또는 여러 개의 도큐먼트 타입을 가질 수 있다.

  • 실제 소스 코드나 참조 문서에는 indice라는 용어가 사용되는데 index는 검색에서 포괄적인 의미인 색인 또는 색인 파일이고, indice는 es 내에서 물리적으로 사용되는 색인 또는 색인 파일이라고 보면 된다. 가존 검색엔진의 collection과 같은 의미가 indice다

Mapping

Field

Administrator’s view: physical layout

A tree-node cluster

  • ES가 뒷단에서 어떻게 데이터를 다루는지

  • 데이터가 물리적으로 어떻게 배치되는지 이해하는 것은 결국 ES가 어떻게 확장하는지에 대한 이해이다.

Node

  • Node는 ES를 실행하는 프로세스다.

  • Node는 ES의 인스턴스다.

  • 다수의 노드는 같은 클러스터에 합류할 수 있다.

Document의 Index를 만들 때 발생하는 일
  1. Document ID의 해시값에 기반을 둬서 선택한 주Primary 샤드 중 하나로 보낸다.

  2. 주 샤드의 모든 Replica 샤드에 Index하도록 Document를 복제한다.

  3. 이것은 Replica 샤드가 주 샤드로부터 데이터를 동기화하도록 유지한다.

  4. 동기화된 Replica는 검색을 제공하고, 주 샤드가 이용 불가능한 경우 주 샤드로 자동 승격될 수 있다.

Index를 검색할 때 발생하는 일
  1. Index를 검색할 때, ES는 해당 Index의 전체 샤드를 찾아야 한다.

  2. 샤드가 Primary 혹은 Replica일 수 있는데, 보통 Primary와 Replica 샤드가 같은 Document를 포함하기 때문이다.

  3. ES는 검색하는 Index의 Primary/Replica 샤드 간에 검색 로드를 분배해서, 검색 성능과 고장 감내fault tolerance에 유용하게 Replica를 사용한다.

Shard

  • 하나의 shard는 하나의 루씬 색인이다.

  • 루씬 색인은 역 색인inverted indexing을 포함하는 파일들의 모음a directory of files이다.

  • 역 색인은 ES가 전체 document를 찾아보지 않고도 하나의 텀(혹은 단어)을 포함하는 문서를 찾도록 해주는 구조다.

  • shard는 primary 또는 replica shard일 수 있다.

  • replica shard는 primary shard의 정확한 복제본이다.

  • replica shard는 검색을 위해 사용되거나 장애대응용으로 사용 할 수 있다.

  • ES 색인은 하나 이상의 primary shard와 0개 이상의 replica shard로 구성된다.

  • replica는 언제나 변경 가능하지만, primary shard는 불가능 하므로 색인을 생성하기 전에 샤드의 수를 결정해야 한다.

Elasticsearch-head 모니터링 툴은 크롬 확장프로그램으로도 지원된다. https://chrome.google.com/webstore/detail/elasticsearch-head/ffmkiejjmecolpfloofpjologoblkegm/related

es,elastic search