[컴] elasticsearch 에서 curl 을 이용해서 data 옮기기

 일렉스틱서치 / migration / data / 데이터

elasticsearch 에서 curl 을 이용해서 data 옮기기

elasticsearch 에서는 여러가지 방법으로 migration 방법을 제공한다.

그리고 elasticsearch server 에 직접 접근이 된다면, elasticsearch-dump 도 하나의 방법이 될 수 있다.

여기서는 단순히 curl 을 이용해서 수동으로 index 정보를 가져와서 내 local elasticsearch 에 옮겨넣는 작업을 해보려고 한다.

data 가져오기

아래 request 로 index mapping 과 data 를 가져오자. data 는 _source부분을 사용하면 된다.

curl http://remotesite.com/my_index?pretty=true
curl http://remotesite.com/my_index/_serach?pretty=true

아래 결과값에서 _source 값이 실제 insert 된 값으로 보면 된다.

{
  "_scroll_id": "DnF1ZXJ5VGhlbkasdasd...3",
  "took": 9,
  "timed_out": false,
  "_shards": {
    ...
  },
  "hits": {
    "total": 4411535,
    "max_score": 1,
    "hits": [
      {
        ...
        "_source": {
          "a": {
            "b": "12314214342",
            "c": 138,
            "d": "1.15.0",
            "e": 13000,
            "f": "1.3.0"
          },
          "g": {
            "h": 1
          },
          ...

kibana triple quote

키바나에서 결과값에 """를 넣어서 보여주는 경우가 있다. 이런 값들을 정상적인 json 으로 변경해 줘야 한다. 아래 링크에 간단한 python script 가 있다.

새로운 index 에 data 넣기

curl -XPUT http://localhost:9200/my-new-index -d @f:\mapping.json -H "Content-Type: application/json"
curl -XPOST http://localhost:9200/my-new-index/_doc -d @f:\data.json -H "Content-Type: application/json"
curl -XDELETE http://localhost:9200/my-new-index

index mapping 복사

curl http://remotesite.com/my_index?pretty=true

elasticsearch data 를 migrate 할 때 index mapping 을 미리 새로운 cluster 에 만들어 두라고 한다. Index mappings 은 reindex 명령으로는 migrate 이 안된다고 한다. from : Migrating your Elasticsearch data | Elasticsearch Service Documentation | Elastic

local 에 index mapping 만들기

curl -XPUT http://localhost:9200/my-new-index -d @f:\mapping.json -H "Content-Type: application/json"

// mapping.json
{
  "mappings": {
    "properties": {
      "a": {
        "properties": {
          "a": {
            "type": "keyword"
          },
          "b": {
            "type": "keyword"
          },
          "c": {
            "type": "keyword"
          },
          "d": {
            "type": "integer"
          },
          "e": {
            "type": "keyword"
          }
        }
      },
      "f": {
        "type": "integer"
      }
  }
}

data insert

es 7.0 이상에서는 _doc 를 이용해야 한다.(참고: ElasticSearch 에서 Type 이 사라졌다)

curl -XPOST http://localhost:9200/my-new-index/_doc -d @f:\data.json -H "Content-Type: application/json"

// data.json
{
  "a": {
    "a": "343243243434325gr253523",
    "b": 138,
    "c": "1.15.0",
    "d": 13000,
    "e": "1.3.0"
  },
  "f": 1
}

bulk insert

curl -XPOST "http://localhost:9200/my-new-index/_bulk" --data-binary @data.json -H "Content-Type: application/json"

index 삭제

curl -XDELETE http://localhost:9200/my-new-index

search & scroll

curl -XPOST 'https://ES/my_index/_search?scroll=1m'
curl -XPOST 'https://ES/my_index/_search?scroll' -d '{"scroll": "1m", "scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="}'

curl -XPOST ‘http://locahost:9200/’

1m(100) 은 elasticsearch 에게 얼마나 길게 search context 를 살려야 하는지 알려준다. 2번째 부터 사용되는 scroll_id 는 처음 scroll request 를 하고 나면 응답에 들어있다.

원래는 처음 query 시점에 다른 query 조건을 -d(POST data)로 추가할 수 있지만, 여기서는 dump 를 위한 것이기에 사용하지 않는다.

scroll

주의: deep pagination 에 scroll API 를 사용하지 말라고 한다. 1만개 이상의 page 를 만들어 사용할 것이라면 search_after 를 사용하라고 한다.

search request 가 결과에 1개의 page 를 return 한다. scroll API 는 많은 수의 결과를 가져올 때 사용될 수 있다.(심지어 전체 결과를 가져올때) 전통적인 DB 에서 cursor 의 개념과 비슷하다.

scroll 은 real time 의 user request 들을 위해 만들어진 것은 아니다. 그것보다는 대량의 data 를 처리하기 위해서 만들어졌다. 즉, 하나의 data stream 의 내용을 reindex 하거나 새로운 data stream 으로 index 를 하거나, 다른 설정(configuration) 으로 index 하기위해서 만들어졌다.

댓글 없음:

댓글 쓰기