욱'S 노트

Elasticsearch - 시작하기 본문

Programming/Elasticsearch

Elasticsearch - 시작하기

devsun 2015. 5. 20. 18:32

Getting Started


엘라스틱 서치는 고성능의 확장가능한 오픈소스 풀텍스트 검색 및 분석 엔진이다. 준실시간으로 대량의 데이터의 빠르게 저장할 수 있고 검색할 수 있고, 분석할 수 있다. 


다음은 엘라스틱 서치를 사용할 만한 유스케이스들이다.


  • 당신의 판매할 상품들을 위한 고객들이 검색할 수 있게 온라인 웹스토어를 실행킨다. 이런 경우 엘라스틱 서치에 모든 제품의 카탈로그를 저장하고, 상품들의 자동완성 추천을 할 수 있다.
  • 트렌드나 통계, 합산 등을 위해 로그 및 트랜잭션 데이터를 수집하기를 원한다. 이러한 경우 Logstash를 사용할 수 있다. 한번 데이터가 엘라스틱 서치에 저장되면 그것들을 검색하거나 조합할 수 잇다.
  • 가격 알림 플랫폼을 실행할 수 있다. 특정 가격 이하로 떨어진 상품을 추천하는 것이 예이다. 이러한 경우 엘라스틱 서치에 데이터를 저장하고 Percolator를 이용하여 리버스 서치를 이용할 수 있다. 
  • 빠르게 투자하고, 분석하고, 살펴보고 대량의 데이터에 즉답을 요청하여 분석 및 비즈니스에 활용하고 싶다면 이러한 경우 엘라스틱서치에 데이터를 저장하고 Kibana를 사용해서 커스텀 대시보드를 빠르게 만들 수 있다.

Basic Concepts

엘라스틱 서치에 핵심이 되는 몇가지 컨셉이 있다. 이러한 컨셉들을 이해하면 비약적으로 프로세스를 배우기가 쉬워질 것이다.

Near Realtime (NRT)

엘라스틱 서치는 NRT 검색 플랫폼이다. 약간 지연이 있다는 것을 의미한다. 일반적으로 1초 내외이며 검색되기 전에 도큐먼트를 인덱스하는 시간이 소요된다.

Cluster

클러스터는 전체 데이터를 하나 또는 그 이상의 노드의 집합에서 유지하고 있다는 것을 의미한다. 이는 통합 인덱싱 및 모든 노드를 통한 검색 기능을 제공한다는 것을 의미한다. 클러스터는 유니크한 이름으로 식별되며 기본은 "elasticsearch" 이다. 이름은 매우 중요하다. 노드는 하나의 클러스터의 부분이며, 만약 노드가 셋업 된다면 이름으로 클러스터에 조인한다. 가장 좋은 방법은 프로덕션의 클러스터명을 명시적으로 지정하는 것이다. 

Node

노드는 클러스터의 구성이 되는 싱글 서버 이다. 데이터를 저장하고, 클러스터 인덱싱에 참여하며 검색 기능을 제공한다. 클러스터와 마찬가지로 노드도 이름으로 식별된다. 기본은 랜덤 마블 캐릭터명이 시작시에 할당된다. 만약 기본값을 원하지 않는다면 어떤 이름도 지정할 수 있다. 이름은 관리 목적상 중요하다.

노드는 클러스터명에 의해 특정한 클러스터에 조인한다. 기본으로 각 노드는 elasticsearch라는 클러스터명으로 조인할려고 시도할 것이다. 만약 네트워크상에 기본값의 클러스터가 존재한다면 곤란하므로 클러스터명은 꼭 지정하도록 하자.

Index

인덱스는 비슷한 특성을 가진 도큐먼트의 집합이다. 예를 들어 고객 데이터를 위한 인덱스를 가질 수 있고, 프로덕트 카탈로그를 위한 인덱스를 가질 수 있다. 인덱스는 이름으로 식별되며 이름은 인덱스를 수행하거나, 검색하거나, 업데이트하거나 삭제를 수행할때 사용할 수 있다.

Type

인덱스내에 하나 혹은 몇몇의 타입을 정의할 수 있다. 타입은 인덱스의 논리적인 카테고리 또는 파티션이다. 일반적으로  도큐먼트를 위해 정의된 타입은 공통 필드의 집합을 가지고 있다. 예를 들면 블로그 플랫폼이 있고 하나의 인덱스에 데이터에 모든 데이터들이 저장된다고 가정하자. 이 인덱스에 유저 데이터를 위한 타입을 정의할 수 있고, 블로그 데이터를 위한 또 다른 타입을 정의할 수도 있으며 코멘트 데이터를 위한 또다른 타입을 정의할 수도 있다.

Document

도큐먼트는 인덱싱 될 수 있는 정보의 단위이다. 예를 들어 한명의 고객을 위한 도큐먼트가 있고, 하나의 제품을 위한 또다른 도큐먼트가 있을 수 있다. 도큐먼트는 JSON으로 표현된다.

인덱스나 타입내에 많은 도큐먼트들이 저장될 수 있다. 물리적으로는 인덱스내에 도큐먼트가 저장되지만 인덱스내에 타입으로 도큐먼트는 인덱스되거나 할당 될 수 있다.

Shard & Replicas

인덱스는 잠재적으로 싱글 노드의 하드웨어 용량을 초과하는 대량의 데이터를 저장될 수 있다. 예를 들어 수백만의 도큐먼트가 하나의 인덱스에 저장되고 1TB의 용량을 초과한다면 검색 요청은 매우 느리게 동작하게 될 것이다. 

이러한 문제를 해결하기 위해 엘라스틱 서치는 shard라고 불리는 다수의 조각으로 인덱스를 분리하는 기능을 제공한다. 인덱스를 생성하며 원하는 만큼 샤딩을 지정할 수 있다. 각 샤드는 모든 기능을 수행하는 독립된 인덱스이다.

샤딩은 두가지 이유에서 매우 중요하다.
  • 컨텐츠의 볼륨을 수평적으로 분할 및 확장할 수 있다.
  • 샤드에 분산되고 병렬의 작업을 수행할 수 있으므로, 성능이나 처리량을 증대시킬수 있다.
샤드에 어떻게 분산되는지에 대한 메커니즘과 또한 검색 요청에 도큐먼트를 조합하여 돌려주는 것에 대한 것은 전적으로 엘라스틱 서치에 의해 관리된다

네트워크나 클라우드 환경에서 언제든 고장이 발생할 수 있다. 이러한 이유에서 샤드 노드는 오프라인이 되거나 사라져 버릴 수 있다. 이러한 경우에 대비하여 엘라스틱 서치는 인덱스의 샤드의 복제 샤드라고 불리는 복제본을 만든다.

리플리케이션은 주요한 두가지 이유는 다음과 같다.
  • 샤드나 노드가 고장났을때 고가용성을 제공한다. 이러한 이유에서 복제 샤드는 같은 노드에 위치해서는 안된다.
  • 검색은 모든 복제본에서 수행되기 떄문에 볼륨이나 처리량을 스케일 아웃을 할 수 있다.
요약하자면 각 인덱스는 다수의 샤드로 분할 될 수 있다. 인덱스는 또한 여러벌의 복제본을 가질 수 있다. 샤드의 수와 복제본의 수는 인덱스를 생성하는 시점에 정의할 수 있다. 인덱스가 생성된 후에도 복제본의 수의 동적으로 변경할 수 있다. 하지만 샤드의 수는 after-the-fact 변경할 수 없다.

기본적으로 엘라스틱 서치에서 각 인덱스는 5개의 샤드와 하나의 복제본이 할당된다. 이 의미는 클러스터에 적어도 두개의 노드가 있어야 한다는 것을 의미한다. 그리고 5개의 샤드당 하나의 복제본이 지정되므로 하나이 인덱스당 총 10개의 샤드를 가지게 될 것이다.

Installation

엘라스틱 서치는 Java7을 요구한다. 더 정확하게 말하자면 Oracle JDK 버젼 1.8.0_25를 추천한다. 자바 설치는 플랫폼에 따라 다양한 방식이므로 여기서는 자세한 설명을 생략한다. 엘라스틱 서치를 설치하기 전에 수행중인 자바 버젼을 체크하자.

java -version
echo $JAVA_HOME

자바가 설치되어 있다면 엘라스틱 서치를 다운로드 받고 실행할 수 있다. 바이너리는 www.elastic.co/downloads에서 이용가능하다. 각 릴리이즈는 zip 또는 tar 압축이거나 DEB 또는 RPM 패키지이다. 가장 간단하게 tar 파일을 이용하자.

엘라스틱 서치 1.5.2를 다음과 같이 다운로드 하자. (윈도우 유저는 아래와 같이 하면 안된다.)

curl -L -O https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.5.2.tar.gz

그리고 다음과 같이 압축을 풀자.

tar -xvf elasticsearch-1.5.2.tar.gz

현재 디렉토리에 파일과 폴더들이 생성될 것이다. bin 디렉토리를 접근하자.

cd elasticsearch-1.5.2/bin

이제 우리는 싱글 클러스터와 우리의 노드를 시작할 준비가 되었다.

./elasticsearch

만약 모든 명령이 잘 수행되었다면 다음과 같은 메시지를 확인할 수 있을 것이다. 

./elasticsearch
[2014-03-13 13:42:17,218][INFO ][node           ] [New Goblin] version[1.5.2], pid[2085], build[5c03844/2014-02-25T15:52:53Z]
[2014-03-13 13:42:17,219][INFO ][node           ] [New Goblin] initializing ...
[2014-03-13 13:42:17,223][INFO ][plugins        ] [New Goblin] loaded [], sites []
[2014-03-13 13:42:19,831][INFO ][node           ] [New Goblin] initialized
[2014-03-13 13:42:19,832][INFO ][node           ] [New Goblin] starting ...
[2014-03-13 13:42:19,958][INFO ][transport      ] [New Goblin] bound_address {inet[/0:0:0:0:0:0:0:0:9300]}, publish_address {inet[/192.168.8.112:9300]}
[2014-03-13 13:42:23,030][INFO ][cluster.service] [New Goblin] new_master [New Goblin][rWMtGj3dQouz2r6ZFL9v4g][mwubuntu1][inet[/192.168.8.112:9300]], reason: zen-disco-join (elected_as_master)
[2014-03-13 13:42:23,100][INFO ][discovery      ] [New Goblin] elasticsearch/rWMtGj3dQouz2r6ZFL9v4g
[2014-03-13 13:42:23,125][INFO ][http           ] [New Goblin] bound_address {inet[/0:0:0:0:0:0:0:0:9200]}, publish_address {inet[/192.168.8.112:9200]}
[2014-03-13 13:42:23,629][INFO ][gateway        ] [New Goblin] recovered [1] indices into cluster_state
[2014-03-13 13:42:23,630][INFO ][node           ] [New Goblin] started

너무 자세히 살펴보는 것은 피하겠다. 위에서 설펴보면 우리는 노드명은 "New Goblin" 라는 이름으로 시작되었다는 것을 알 수 있고, 싱글 클러스터에서 자신의 마스터로 선출된 것을 알 수 있다. 아직의 마스터의 의미를 알 필요는 없다. 여기서 가장 중요한 것은 하나의 클러스터에 하나의 노드가 시작되었다는 것이다. 

앞에서 언급했다시피, 클러스터나 노드명은 오버라이드할 수 있다. 엘라스틱 서치를 싲가할때 다음과 같이 커맨드라인에 명시하면 된다.

./elasticsearch --cluster.name my_cluster_name --node.name my_node_name

또한 HTTP address (192.168.8.112) 와 port (9200)가 우리의 노드에 접근할 수 있는 주소이다. 기본으로 엘라스틱 서치를 REST API을 제공하기 위해 9200 포트를 사용한다. 이 포트는 필요에 의해 변경할 수 있다.


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

Elasticsearch - Mapping  (0) 2015.05.28
Elasticsearch - API Conventions  (0) 2015.05.28
Elasticsearch - Exploring Your Data  (0) 2015.05.27
Elasticsearch - Modifying Your Data  (0) 2015.05.27
Elasticsearch - Exploring Cluster  (0) 2015.05.22
Comments