욱'S 노트

Elasticsearch - Exploring Cluster 본문

Programming/Elasticsearch

Elasticsearch - Exploring Cluster

devsun 2015. 5. 22. 18:33

REST API


이제 우리는 우리의 노드를 가지게 되었고, 실행하였다. 다음은 노드와 어떻게 커뮤니케이션을 하는 것인가이다. 엘라스틱 서치에서는 매우 이해하기 쉽고 파워풀한 REST API를 제공한다. API를 통해서 수행할 수 있는 작업은 다음과 같다.


클러스터, 노드와 인덱스 헬스, 상태, 통계 체크

클러스터, 모드 , 인덱스 데이터 및 메타데이터 관리

인덱스에 CRUD 수행 및 검색 수행

페이징, 소팅, 필터링, 스크립팅, faceting, aggregation등 진화된 검색 수행


Cluster Health


기본적인 헬스 체크부터 시작해보자. 우리는 curl를 사용할 것이다. 하지만 당신이 원한다면 HTTP/REST 콜을 생성하는 다른 툴을 사용해도 좋다. 명령을 수행하기 위해 다른 쉘 윈도우를 열자.


클러스터 헬스를 체크하기 위해 _cat API를 사용할 것이다. 우리 노드의 HTTP 엔드포인트는 9200번이라고 가정하자.


curl "localhost:9200/_cat/health?v"


결과는 다음과 같다. 


epoch      timestamp cluster       status node.total node.data shards pri relo init unassign

1394735289 14:28:09  elasticsearch green           1         1      0   0    0    0        0


우리의 클러스터명이 "elasticsearch" 이고 상태가 green이라는 것을 알 수 있다.


클러스터 헬스 체크를 수행했을때 green, yellow 또는 red가 결과로 받을 수 있다. Green의 의미는 모든 것이 좋다는 의미이며, yellow는 모든 데이터가 이용가능하나 몇몇의 복제본이 아직 할당 되지 않았다는 것을 의미한다. Red의 의미는 어떤 데이터는 어떤 이유에 의해 유효하지 않다는 것을 의미한다. 만약 클러스터의 상태가 red라도 부분적으로 이용가능하다. 그러나 데이터를 유실할 수 있기 때문에 최대한 빨리 고쳐야 한다. 


또한 위의 결과로부터 우리는 하나의 노드에 0개의 샤드임을 확인할 수 있는데 이는 아직 데이터가 없기 때문이다. 또 클러스터 명이 기본으로 elasticsearch인데 엘라스틱 서치는 멀티캐스트 네트워크를 이용해 다른 노드를 찾기 때문에 사고로 하나의 클러스터로 조인될 수 있을을 주의하자.


우리 클러스터에 존재하는 모든 노드를 리스트를 가지고 와보자.


curl 'localhost:9200/_cat/nodes?v'


결과는 다음과 같다.


host         ip        heap.percent ram.percent load node.role master name

mwubuntu1    127.0.1.1            8           4 0.00 d         *      New Goblin


여기 우리는 "New Goblin"으로 명명된 하나의 노드가 있음을 알 수 있다.


List All Indexes


이제 우리의 인덱스들을 조회해보자.


curl 'localhost:9200/_cat/indices?v'


결과는 다음과 같다.


health index pri rep docs.count docs.deleted store.size pri.store.size


아직 클러스터에는 인덱스가 없다는 것을 의미한다.


Create an Index


이제 "customer"라는 이름의 인덱스를 생성하고 다시 모든 인덱스를 조회해보자.


curl -XPUT 'localhost:9200/customer?pretty'

curl 'localhost:9200/_cat/indices?v'


첫번째 커맨드는 customer로 명명된 인덱스를 생성하는 것이다. 뒤에 붙인 pretty는 JSON 결과를 반환할때 pretty-print 해달라는 의미이다. 


결과는 다음과 같다.


curl -XPUT 'localhost:9200/customer?pretty'

{

  "acknowledged" : true

}


curl 'localhost:9200/_cat/indices?v'

health index    pri rep docs.count docs.deleted store.size pri.store.size

yellow customer   5   1          0            0       495b           495b


두번째 명령의 결과는 우리는 customer라는 하나의 인덱스를 가지고 있으며 5개의 프라이머리 샤드와 1개의 복제본을 가지고 있으며 0개의 도큐먼트가 포함되어 있다는 것이다. 


또한 customer 인덱스가 강태가 yellow라고 나타나는데 앞에서 이 상태는 몇몇의 복제본이 아직 할당되어 있지 않다는 것을 의미한다고 했었다. Customer 인덱스에 대해 이러한 결과가 발생하는 이유는 이 인덱스를 위해 하나의 복제본을 기본적으로 생성하기 때문이다. 우리는 하나의 노드만 실행했기때문에 고가용성을 위한 하나의 복제본은 아직 할당 되지 않았다. 세컨드 노드에 복제본이 할당되면 상태는 green으로 변경될 것이다.


Index and Query a Document


이제 클러스터 인덱스에 무언가를 넣어보자. 도큐먼트를 인덱싱하기 위해 우리는 엘라스틱 서치에게 인덱스에 타입을 알려야 한다.


단순한 customer 도큐먼트를 "external" 타입으로 인덱스하고 ID는 1로 할당하자.


우리의 JSON 도큐먼트는 다음과 같다.


{"name:"John Doe"}


다음과 같은 커맨드를 수행하자.


curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '

{

  "name": "John Doe"

}'


결과는 다음과 같다.


{

  "_index" : "customer",

  "_type" : "external",

  "_id" : "1",

  "_version" : 1,

  "created" : true

}


위의 결과로 부터 우리는 새로운 customer 도큐먼트가 customer 인덱스의 external type에 성공적으로 생성되었음을 알 수 있다. 도큐먼트는 인덱싱 타임에 명시한 내부적인 id 1을 가진다.


엘라스틱 서치의 중요한 점은 도큐먼트를 인덱싱하기 저네 명시적으로 인덱스를 생성할 필요가 없다. 앞의 예제에서 만약 인덱스가 존재하지 않는다면 엘라스틱 서치는 자동적으로 인덱스를 생성한다.


이제 인덱스된 도큐먼트를 검색해보자.


curl -XGET 'localhost:9200/customer/external/1?pretty'


결과는 다음과 같다.


curl -XGET 'localhost:9200/customer/external/1?pretty'

{

  "_index" : "customer",

  "_type" : "external",

  "_id" : "1",

  "_version" : 1,

  "found" : true, "_source" : { "name": "John Doe" }

}


특별한 점 없이 잘 조회되는 것을 알 수 있다.


Delete an Index


이제 인덱스를 삭제하고 다시 모든 인덱스를 조회해보자.


curl -XDELETE 'localhost:9200/customer?pretty'

curl 'localhost:9200/_cat/indices?v'


결과는 다음과 같다.


{

  "acknowledged" : true

}



health index pri rep docs.count docs.deleted store.size pri.store.size


이것은 모든 인덱스가 성공적으로 삭제되었다는 것을 의미한다. 


이전의로 돌아가 다시 하나의 도큐먼트를 입력해보자. 인덱스를 삭제해보자.


curl -XPUT 'localhost:9200/customer'

curl -XPUT 'localhost:9200/customer/external/1' -d '

{

  "name": "John Doe"

}'

curl 'localhost:9200/customer/external/1'

curl -XDELETE 'localhost:9200/customer'


지금 까지 공부한 것을 생각해보면 엘라스틱 서치에는 데이터에 접근하는 다음과 같은 패턴이 있다는 것을 알 수 있다. 패턴을 요약해보면 아래와 같다.


curl -X<REST Verb> <Node>:<Port>/<Index>/<Type>/<ID>


이러한 REST 접근 패턴은 기억하기 쉽고 이해하기 쉬워서 엘라스틱 서치를 처음 학습할 때 편할 것이다.


'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 - 시작하기  (1) 2015.05.20
Comments