일렉스틱서치 / 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 가 있다.
- Make triple quoting output in console configurable · Issue #15628 · elastic/kibana · GitHub : 참고로 utf8을 사용하려면 이곳에 file open(read, write 모두) 부분에 encoding 설정을 추가해줘야 한다.
- UnicodeDecodeError 'cp949' codec can't decode bytes in position · 뚠뚠라이프
새로운 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 하기위해서 만들어졌다.
댓글 없음:
댓글 쓰기