elasticsearch 5.0에서 사라진 api를 확인하고 싶다면.. 아래 페이지에 접근한다.


https://www.elastic.co/guide/en/elasticsearch/reference/5.0/breaking_50_search_changes.html



변경 사항과 삭제된 api를 볼 수 있다.


예를 들어, 삭제된 api는 다음과 같다.


Deprecated queries removededit

The following deprecated queries have been removed:

filtered
Use bool query instead, which supports filter clauses too.
and
Use must clauses in a bool query instead.
or
Use should clauses in a bool query instead.
missing
Use a negated exists query instead. (Also removed _missing_ from the query_string query)
limit
Use the terminate_after parameter instead.
fquery
Is obsolete after filters and queries have been merged.
query
Is obsolete after filters and queries have been merged.
query_binary
Was undocumented and has been removed.
filter_binary
Was undocumented and has been removed.




그리고, filtered query의 경우는 아래의 url에 접근할 수 있지만. 자세히 살펴보면 deleted page로 되어 있다..(즉 삭제된 api를 의미한다)


https://www.elastic.co/guide/en/elasticsearch/reference/5.5/query-dsl-filtered-query.html

Posted by '김용환'
,




축소(shrink) api 예제는 다음과 같다. 



간단한 인덱스를 하나 생성한다.


$ curl -XPUT "http://localhost:9200/source_index"



특정 노드에 shrink를 실행한다. 모든 저장(index.blocks.write)을 막는다.


$ curl -XPUT "http://localhost:9200/source_index/_settings" -d'

{

  "settings": {

    "index.routing.allocation.require._name": "노드 이름", 

    "index.blocks.write": true 

  }

}'





원본 인덱스는 다음 커맨드를 사용해 target_index라는 새로운 인덱스로 축소한다.

$ curl -XPOST 'localhost:9200/source_index/_shrink/target_index?pretty'


모니터링은 _cat/recovery 엔드 포인트를 사용한다.


$ curl -XGET localhost:9200/_cat/recovery


Posted by '김용환'
,



일래스틱서치 1.x에서 트라이브(tribe) 노드가 소개되었지만, 클러스터와 클러스터를 연결하는 기능으로 애매한 포지션이 있었다..


5.4.0에서 deprecated되고 7.0에서 사라질 예정이라 한다. cross cluster search로 대체될 예정이다.


일래스틱서치에서 애매한 기능은 늘 deprecated된다. 





https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-tribe.html


Tribe nodeedit

Warning

Deprecated in 5.4.0.

The tribe node is deprecated in favour of Cross Cluster Search and will be removed in Elasticsearch 7.0.



corss cluster search 모듈은 다음 내용을 참조한다.

https://www.elastic.co/guide/en/elasticsearch/reference/5.x/modules-cross-cluster-search.html

Posted by '김용환'
,

일래스틱서치에서는 인덱스 이름을 변경할 수 있는 방법이 거의 없지만..


유일하게 스냅샷을 복구할 때 인덱스 이름을 유일하게 변경할 수 있다.




$ curl -XPOST "http://localhost:9200/_snapshot/es/snapshot_1/_restore" -d'

{

"indices": "my_index",

"ignore_unavailable": "true",

"rename_replacement": "your_index"

}'



Posted by '김용환'
,


먼저 저장소 경로를 등록한다. vi conf/elasticsearch.yml에서 다음을 추가한다. 


path.repo: ["/tmp/mnt"] 



파일 시스템 저장소를 등록한다.


curl -XPUT 'http://localhost:9200/_snapshot/es-backup' -d '{

"type": "fs",

"settings": {

"location": "/tmp/mnt/es-backup",

"compress": true

}

}'



만약 conf/elasticsearch.yml 파일에서 path.repo를 등록하지 않으면 다음 에러가 발생한다. 


{"error":{"root_cause":[{"type":"repository_exception","reason":"[es-backup] location [/tmp/es-backup] doesn't match any of the locations specified by path.repo because this setting is empty"}],"type":"repository_exception","reason":"[es-backup] failed to create repository","caused_by":{"type":"repository_exception","reason":"[es-backup] location [/tmp/es-backup] doesn't match any of the locations specified by path.repo because this setting is empty"}},"status":500}





snapshot 저장하기


$ curl -XPUT 'http://localhost:9200/_snapshot/es-backup/snapshot_1?wait_for_completion=true' -d '{

> "indices": "index_1,index_2",

> "ignore_unavailable": "true",

> "include_global_state": false

> }'

{"snapshot":{"snapshot":"snapshot_1","uuid":"gD2dYNYzQjevg3S6PbV0Fg","version_id":5030199,"version":"5.3.1","indices":[],"state":"SUCCESS","start_time":"2017-06-08T02:41:58.489Z","start_time_in_millis":1496889718489,"end_time":"2017-06-08T02:41:58.496Z","end_time_in_millis":1496889718496,"duration_in_millis":7,"failures":[],"shards":{"total":0,"failed":0,"successful":0}}}[/usr/local/elasticsearch-5.3.1/bin]





스냅샷 정보를 얻어오려면 다음 커맨드를 사용한다. 


curl -XGET 'http://localhost:9200/_snapshot/es-backup/snapshot_1'

{"snapshots":[{"snapshot":"snapshot_1","uuid":"gD2dYNYzQjevg3S6PbV0Fg","version_id":5030199,"version":"5.3.1","indices":[],"state":"SUCCESS","start_time":"2017-06-08T02:41:58.489Z","start_time_in_millis":1496889718489,"end_time":"2017-06-08T02:41:58.496Z","end_time_in_millis":1496889718496,"duration_in_millis":7,"failures":[],"shards":{"total":0,"failed":0,"successful":0}}]}





curl -XGET 'http://localhost:9200/_snapshot/es-backup/snapshot_1,snapshot_2'





curl -XGET 'http://localhost:9200/_snapshot/es-backup/_all'

'{"snapshots":[{"snapshot":"snapshot_1","uuid":"gD2dYNYzQjevg3S6PbV0Fg","version_id":5030199,"version":"5.3.1","indices":[],"state":"SUCCESS","start_time":"2017-06-08T02:41:58.489Z","start_time_in_millis":1496889718489,"end_time":"2017-06-08T02:41:58.496Z","end_time_in_millis":1496889718496,"duration_in_millis":7,"failures":[],"shards":{"total":0,"failed":0,"successful":0}}]}




스냅샷 삭제하는 방법은 다음과 같다. 


curl -XDELETE 'http://localhost:9200/_snapshot/es-backup/snapshot_1'



Posted by '김용환'
,



cat API의 기본 엔드 포인트는 /_cat이다. 매개 변수가 없이 호출하면 cat API에 사용할 수 있는 모든 엔드 포인트를 표시한다.



curl -XGET 'localhost:9200/_cat'

=^.^=

/_cat/allocation

/_cat/shards

/_cat/shards/{index}

/_cat/master

/_cat/nodes

/_cat/tasks

/_cat/indices

/_cat/indices/{index}

/_cat/segments

/_cat/segments/{index}

/_cat/count

/_cat/count/{index}

/_cat/recovery

/_cat/recovery/{index}

/_cat/health

/_cat/pending_tasks

/_cat/aliases

/_cat/aliases/{alias}

/_cat/thread_pool

/_cat/thread_pool/{thread_pools}

/_cat/plugins

/_cat/fielddata

/_cat/fielddata/{fields}

/_cat/nodeattrs

/_cat/repositories

/_cat/snapshots/{repository}

/_cat/templates





각각의 cap api 요약을 한다면 다음과 같다.

  • 클러스터에서 현재 실행 중인 작업
  • 세그먼트 통계
  • 세그먼트 통계(특정 인덱스로 제한)
  • 샤드 할당 - 관련 정보
  • 필드 데이터 캐시 크기
  • 개별 필드의 필드 데이터 캐시 크기
  • 복구 정보
  • 복구 정보(특정 인덱스로 제한)
  • 클러스터에 등록된 스냅샷 저장소 정보
  • 사용자 정의 노드의 속성 정보
  • 색인 통계
  • 색인 통계(특정 색인으로 제한)
  • 특정 저장소에 속한 모든 스냅샷에 대한 정보
  • 각 노드에 설치된 플러그인
  • 특정 별명의 인덱스 앨리어스와 인덱스
  • 마스터 정보(선출된 마스터 표시 포함)
  • 마스터 노드 정보
  • 클러스터 상태
  • 실행 대기 중인 작업
  • 클러스터당 노드별 쓰레드 풀 정보
  • 클러스터당 노드별 단일 또는 다중 스레드 풀에 대한 스레드 풀 정보
  • 전체 클러스터 또는 개별 인덱스의 다큐먼트 개수
  • 모든 샤드 관련 정보(특정 인덱스로 제한)


클러스터 상태 정보를 보려면 다음을 호출한다.

$ curl -XGET 'localhost:9200/_cat/health'
1496739863 18:04:23 elasticsearch yellow 1 1 60 60 0 0 41 0 - 59.4%



컬럼 내용을 보이게 하려면 v를 추가한다. 

$ curl -XGET 'localhost:9200/_cat/health?v'
epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1496740013 18:06:53  elasticsearch yellow          1         1     60  60    0    0       41             0                  -                 59.4%


help 커맨드를 사용하면 헤더 내용을 알 수 있다.


$ curl -XGET 'localhost:9200/_cat/health?help'

epoch                 | t,time                                   | seconds since 1970-01-01 00:00:00

timestamp             | ts,hms,hhmmss                            | time in HH:MM:SS

cluster               | cl                                       | cluster name

status                | st                                       | health status

node.total            | nt,nodeTotal                             | total number of nodes

node.data             | nd,nodeData                              | number of nodes that can store data

shards                | t,sh,shards.total,shardsTotal            | total number of shards

pri                   | p,shards.primary,shardsPrimary           | number of primary shards

relo                  | r,shards.relocating,shardsRelocating     | number of relocating nodes

init                  | i,shards.initializing,shardsInitializing | number of initializing nodes

unassign              | u,shards.unassigned,shardsUnassigned     | number of unassigned shards

pending_tasks         | pt,pendingTasks                          | number of pending tasks

max_task_wait_time    | mtwt,maxTaskWaitTime                     | wait time of longest task pending

active_shards_percent | asp,activeShardsPercent                  | active number of shards in percent





특정 헤더만 보고 싶다면 다음을 실행한다.


$ curl -XGET 'localhost:9200/_cat/health?h=cluster,status'

elasticsearch yellow



용량을 알아서 보여주지만, bytes=b로 하면 바이트로, bytes=mb는 메가 바이트로 표현할 수 있다.


$ curl -XGET 'localhost:9200/_cat/indices'

yellow open books               SO4qsDCoSIK2y0Hb3OcBpQ 5 1     2 0  7.4kb  7.4kb


$ curl -XGET 'localhost:9200/_cat/indices?bytes=b'

yellow open books               SO4qsDCoSIK2y0Hb3OcBpQ 5 1     2 0      7646      7646




 /_cat/master REST 엔드 포인트를 호출하면 노드에 대한 정보와 현재 노드 중 하나를 마스터로 선출할 수 있다.


$ curl -XGET 'localhost:9200/_cat/master?v'

id                     host      ip        node

5OEGj_avT8un0nOak28qQg 127.0.0.1 127.0.0.1 5OEGj_a



응답에서 알 수 있듯이 현재 어떤 노드가 마스터로 선출되었는지에 대한 정보를 얻었다. 노드의 식별자, IP 주소, 이름을 볼 수 있다.




node 정보를 확인할 수 있다.


참고로 노드 이름, 노드의 역할(노드가 마스터(m), 데이터(a), ingest(i) 또는 클라이언트(-) 노드인지 여부), 노드의 부하(load_1m, load_5m ,load_15m), 가동 시간(uptime)을 선택하려면 다음과 같이 진행할 수 있다.


(참고: https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-nodes.html)


$ curl -XGET 'localhost:9200/_cat/nodes?v&h=name,node.role,load,uptime'






Posted by '김용환'
,

pretty 사용시 기본은 예쁘게 json을 볼 수 있다.


[/usr/local/elasticsearch-5.3.1/bin] curl 'localhost:9200/_cluster/health?pretty'

{

  "cluster_name" : "elasticsearch",

  "status" : "yellow",

  "timed_out" : false,

  "number_of_nodes" : 1,

  "number_of_data_nodes" : 1,

  "active_primary_shards" : 60,

  "active_shards" : 60,

  "relocating_shards" : 0,

  "initializing_shards" : 0,

  "unassigned_shards" : 41,

  "delayed_unassigned_shards" : 0,

  "number_of_pending_tasks" : 0,

  "number_of_in_flight_fetch" : 0,

  "task_max_waiting_in_queue_millis" : 0,

  "active_shards_percent_as_number" : 59.4059405940594

}





format=yaml 매개 변수를 사용하면 yaml 형태로 정보를 얻을 수 있다.



[/usr/local/elasticsearch-5.3.1/bin] curl 'localhost:9200/_cluster/health?pretty&format=yaml'

---

cluster_name: "elasticsearch"

status: "yellow"

timed_out: false

number_of_nodes: 1

number_of_data_nodes: 1

active_primary_shards: 60

active_shards: 60

relocating_shards: 0

initializing_shards: 0

unassigned_shards: 41

delayed_unassigned_shards: 0

number_of_pending_tasks: 0

number_of_in_flight_fetch: 0

task_max_waiting_in_queue_millis: 0

active_shards_percent_as_number: 59.4059405940594

Posted by '김용환'
,


일래스틱서치는 5가지 저장소 타입을 공개하고 있다. 


기본적으로 일래스틱서치는 운영 체제 환경을 기반으로 최상의 구현을 선택한다.



* 첫 번째 방법은 elasticsearch.yml 파일에서 index.store.type 속성을 추가해 모든 인덱스에 설정하는 것이다. 예를 들어 모든 인덱스에 niofs 저장소 타입을 설정하려면 elasticsearch.yml 파일에 다음 라인을 추가 할 수 있다.


index.store.type: niofs 


두 번째 방법은 다음과 같은 커맨드를 사용해 인덱스를 생성할 때 인덱스의 저장소 타입을 설정하는 것이다.


curl -XPUT "http://localhost:9200/index_name" -d' { 

 "settings": { 

 "index.store.type": "niofs" 

 } 

}'





1. simplefs


simplefs는 랜덤 액세스 파일(Java RandomAccessFile-http://docs.oracle.com/javase/8/docs/api/java/io/RandomAccessFile.html)를 사용해 구현된 Directory 클래스 구현을 사용하며 루신의 SimpleFSDirectory (http://lucene.apache.org/core/6_2_0/core/org/apache/lucene/store/SimpleFSDirectory.html)과 매핑된다. 매우 간단한 애플리케이션에서는 simplefs만으로 충분한다. 그러나 simplefs 저장소의 주요 병목은 다중 스레드가 접근할 때이며 이 때 성능이 떨어진다. 


index.store.type을 simplefs로 설정해야 한다.



2. niofs

niofs 저장소 타입은 java.nio 패키지의 FileChannel 클래스 (http://docs.oracle.com/javase/8/docs/api/java/nio/channels/FileChannel.html)를 기반으로하는 Directory 클래스 구현을 사용하며 루신의 NIOFSDirectory (https://lucene.apache.org/core/6_2_0/core/org/apache/lucene/store/NIOFSDirectory.html)과 매핑된다. niofs 저장소 구현은 성능 저하 없이 여러 스레드가 동일한 파일에 동시에 접근할 수 있게 한다. niofs 저장소를 사용하려면 index.store.type을 niofs로 설정해야한다.



3. mmapfs


mmapfs 저장소 타입은 루신의 MMapDirectory (http://lucene.apache.org/core/6_2_0/core/org/apache/lucene/store/MMapDirectory.html) 구현을 사용한다. mmapfs는 읽을 때는 mmap 시스템 호출 (http://en.wikipedia.org/wiki/Mmap)을 사용하고 저장할 때는 랜덤 액세스 파일을 사용한다. mmapfs 저장소는 매핑된 파일의 크기와 동일한 프로세스에서 사용 가능한 가상 메모리 주소 공간의 일부를 사용한다. 잠금 기능이 없으므로 다중 스레드가 접근할 때 확장이 가능하다. 운영 체제의 인덱스 파일을 읽기 위해 mmap을 사용할 때는 이미 캐시된 것처럼 보인다(가상 공간에 매핑되었다). 이 때문에 루신 인덱스에서 파일을 읽을 때 해당 파일을 운영 체제 캐시에 로드할 필요가 없으므로 접근이 더 빠르다. 기본적으로 루신과 일래스틱서치가 I/O 캐시에 직접 접근할 수 있어서 인덱스 파일에 빠르게 접근할 수 있다.


mmap 파일 시스템 저장소는 64비트 환경에서 가장 잘 작동하고 32비트 환경에서는 인덱스가 충분히 작고 가상 주소 공간이 충분하다고 확신할 때만 사용해야 한다. mmapfs 저장소를 사용하려면 index.store.type을 mmapfs로 설정해야 한다.


공부할만한 블로그 


http://blog.thetaphi.de/2012/07/use-lucenes-mmapdirectory-on-64bit.html


http://jprante.github.io/lessons/2012/07/26/Mmap-with-Lucene.html




4. fs

fs 저장소는 기본 파일 시스템 구현이다. fs 저장소가 기본으로 설정되면 일래스틱서치는 운영 체제 환경에 따라 최적의 구현을 선택할 수 있다. 윈도우 32비트에서는 simplefs, 다른 32비트에서는 niofs, 64비트 시스템에서는 mmapfs으로 선택된다.



5. default_fs


일래스틱서치 1.x버전에는 Hybrid(2.x버전에서는 default_fs라고 한다)와 Memory라는 두 가지 다른 저장소 타입이 사용되었다. 일래스틱서치 2.x부터는 Memory 저장소 타입이 제거되었다. 일래스틱서치 5.0 버전부터는 default_fs 저장소 타입이 더 이상 사용되지 않을 것이고 표시하고 있다. 이제 default_fs는 이전 버전과의 호환성을 위해 내부적으로 fs 타입을 지정하도록 되어 있고 조만간에 제거될 것이다.



Posted by '김용환'
,



transient 가 있다. 


일래스틱서치에는 단일 호출에 여러 속성을 포함할 수 있다. 


커맨드의 transient라는 이름은 클러스터를 다시 시작한 후에는 해당 속성을 잊어 버린다는 것을 의미한다.


curl -XPUT 'localhost:9200/_cluster/settings' -d '{

 "transient" : {

  "cluster.routing.allocation.require.group": "group1"

 }

}'




재시작 후에 해당 속성을 잊는 것을 피하고 영구적으로 설정하려면 transient 속성 대신 persistent를 사용한다. 


curl -XPUT 'localhost:9200/_cluster/settings' -d '{

 "persistent" : {

  "cluster.routing.allocation.require.group": "group1"

 }

}'





https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-update-settings.html

Posted by '김용환'
,



일래스틱서치에 라우팅 정보를 제공하는 방법은 몇 가지가 있다. 가장 간단한 방법은 다큐먼트를 저장할 때 routing URI 매개 변수를 추가하는 것이다. 예를 들면 다음과 같다.


$ curl -XPUT localhost:9200/person/doc/1?routing=A -d '{ "name" : "samuel" }'



$ curl -XPOST localhost:9200/_bulk --data-binary '

    

{ "index" : { "_index" : "person", "_type" : "doc", "_routing" : "A" } }

{ "name" : "samuel" }'



확인하는 방법은 _cat/shards 이다.

$  curl -XGET localhost:9200/_cat/shards/person?v
index  shard prirep state      docs store ip        node
person 2     p      STARTED       0  130b 127.0.0.1 5OEGj_a
person 1     p      STARTED       2 6.6kb 127.0.0.1 5OEGj_a
person 3     p      STARTED       1 3.4kb 127.0.0.1 5OEGj_a
person 4     p      STARTED       0  130b 127.0.0.1 5OEGj_a
person 0     p      STARTED       0  130b 127.0.0.1 5OEGj_a




또한 특정 routing 매개 변수 값으로 모든 다큐먼트를 얻어로면 다음 쿼리를 실행한다.


$ curl -XGET 'localhost:9200/person/_search?pretty&q=*&routing=A'





검색 샤드 API에 routing 매개 변수를 사용하면 하나의 샤드에만 요청을 보낸다.


curl -XGET 'localhost:9200/documents/_search_shards?pretty&routing=B' -d '{"query":"match_all":{}}'

{

  "nodes" : {

    "5OEGj_avT8un0nOak28qQg" : {

      "name" : "5OEGj_a",

      "ephemeral_id" : "cLOEvTLySTGA9z49Q2NHLg",

      "transport_address" : "127.0.0.1:9300",

      "attributes" : { }

    }

  },

  "indices" : {

    "documents" : { }

  },

  "shards" : [

    [

      {

        "state" : "STARTED",

        "primary" : true,

        "node" : "5OEGj_avT8un0nOak28qQg",

        "relocating_node" : null,

        "shard" : 0,

        "index" : "documents",

        "allocation_id" : {

          "id" : "jBQxmDVISEWGPnkC0NL-Eg"

        }

      }

    ]

  ]

}




라우팅을 사용해서 다큐먼트를 저장할 때 동일한 라우팅 값을 가진 다큐먼트는 동일한 샤드에서 저장된다. 


그러나 주어진 샤드에 여러 라우팅 값을 가진 많은 다큐먼트가 있을 수 있다.


라우팅을 사용하면 쿼리 중에 사용되는 샤드 개수를 제한할 수 있지만 필터링을 대체할 수는 없다.


즉 라우팅을 포함한 쿼리와 라우팅을 포함하지 않은 쿼리는 동일한 필터 집합을 가져야 한다. 


예를 들어 사용자 식별자를 라우팅 값으로 사용하고 사용자 데이터를 검색한다면 해당 식별자에도 필터를 포함해야 한다.








앨리어스를 사용할 수도 있다. index와 routing 매개 변수를 함께 정의했다. routing 매개 변수에 여러 값을 넣을 수 있다. (앨리어스는 검색 개발자에 실제 관련 정보를 숨기거나 multi tenany 같은 효력을 주게 할 수 있다)


curl -XPOST 'http://localhost:9200/_aliases' -d '{

"actions" : [

{

"add" : {

"index" : "person",

"alias" : "personA",

"routing" : "A"

}

}

]

}'




앨리어스 사용방법은 다음과 같다.


curl -XGET 'http://localhost:9200/personA/_search?q=*&pretty=true'




여러 라우팅 매개 변수를 사용해 하나 이상의 샤드에 요청할 수 있다.


curl -XGET 'localhost:9200/persons/_search?routing=A,B&pretty=true'



참고로 앨리어스에 인덱싱(인덱스 저장)에 사용되는 index_routing 매개 변수를 사용할 수 있는데, 오직 search_routing과 달리 하나의 값만 사용할 수 있다.

Posted by '김용환'
,