본문 바로가기

Elasticsearch

[MongoDB] mongoDB 데이터 Monstache을 사용하여 elasticsearch로 이동시키기

반응형

mongoDB 데이터 약 1,000만건을 Monstache를 이용하여 Elasticsearch로 옮기기! 

 

1. git clone https://github.com/rwynn/monstache.git
2. cd monstache
3. go install
4. make

* 뭔가 잘 되었는데 마지막에 이런 에러가 났다. 근데 그냥 무시하고 진행해도 되었다!

5. cd build/darwin-amd64
6. monstache -v

=> 만약 zsh: commant not found: monstach 에러가 나온다면 

./monstache -v

으로 "./"을 추가해서 해보니 되었다. 

 

 

 

7. build/darwin-amd64 위치에서 vi config.toml 환경설정 파일 작성

# connection settings
mongo-url = "mongodb://localhost:27017"
elasticsearch-urls = ["http://localhost:9200"]
direct-read-namespaces = ["[db명].whole_address"]
change-stream-namespaces = ["[db명].whole_address"]
file-namespaces = ["whole_address"]

# namespace-regex = '^tabling\.whole_address_$'
# namespace-exclude-regex = '^mydb\.ignorecollection$'
gzip = true
stats = true
index-stats = true
replay = false
resume-strategy = 1
elasticsearch-max-conns = 4
elasticsearch-max-seconds = 5
elasticsearch-max-bytes = 8000000
dropped-collections = false
dropped-databases = false
resume = true
resume-write-unsafe = true
resume-name = "default"
index-files = false
file-highlighting = false
verbose = true
exit-after-direct-reads = false
index-as-update=true
index-oplog-time=true

[logs]
info = "/Users/build/monstache/build/darwin-amd64/logs/info.log"
warn = "/Users/build/monstache/build/darwin-amd64/logs/warn.log"
error = "/Users/build/monstache/build/darwin-amd64/logs/error.log"
trace = "/Users/build/monstache/build/darwin-amd64/logs/trace.log"

[[mapping]]
namespace = "[db명].whole_address"
index = "whole_address"

* Elasticsearch _id값을 MongoDB inserting data 중 특정 값으로 넣고 싶은 경우 👇👇

https://blckchainetc.tistory.com/417

 

[Elasticsearch] Monstache config script _id override / mongoDB의 특정 필드를 ES _id로 지정하기

MongoDB에서 Elasticsearch 로 데이터를 옮기는 와중, ES의 _id가 MongoDB의 _id와 동일하게 들어간다는 것을 발견하고 ES의 _id를 field 중 유일한 pk인 buildingManagementNo로 설정해서 다시 monstache insert..

blckchainetc.tistory.com

 

 

logs 의 경로는 현재 위치를 입력 

* logs 폴더 직접 만들기 

mkdir logs

* 아래에 [[mapping]] 중 

index = "whole_address"는 elasticsearch index명이다. 설정해주지 않으면 읽어오는 mongoDB의 "db명.collecion명"으로 기본 세팅된다. 

참조 : https://www.alibabacloud.com/help/ja/elasticsearch/latest/use-monstache-to-synchronize-data-from-a-mongodb-database-to-an-alibaba-cloud-elasticsearch-cluster-in-real-time

 

https://rwynn.github.io/monstache-site/advanced/?spm=a2c63.p38356.0.0.17358eeeWWVX3d#index-mapping 

 

Advanced - Monstache

Monstache supports indexing the raw content of files stored in GridFS into Elasticsearch for full text search. This feature requires that you install an Elasticsearch plugin which enables the field type attachment. For versions of Elasticsearch prior to ve

rwynn.github.io

 

 

 

8. 실행

./monstache -f ./config.toml

-> 약 1074만 건의 데이터가 30분? 정도 걸린 후 elasticsearch에 입력되었다 !! 하지만 2200건이 덜 들어갔다. 왜지 (?) 

 

ERROR===> mongoDB에 NaN value 가 있다면 해당 도큐먼트는 들어가지 않는 것 같다. -> Mongodb에서 NaN의 value를 모두 0으로 바꿔주었다. 

 

ERROR===> 만약 ES 해당 index의 Mappings의 Type = geo_point 인데 "1000"과 같이 존재하지 않는 수가 들어가 있으면 아래와 같은 에러가 난다. 

{"_index":"whole_address","_type":"_doc","_id":"6292d00029bc0be4e90d2ca7","status":400,"error":{"type":"mapper_parsing_exception","reason":"failed to parse","caused_by":{"reason":"illegal latitude value [1000.0] for coordinates","type":"illegal_argument_exception"}}}

mongodb UpdateMany()로 longitude, latitude 1000인 경우를 -> 0 으로 바꿔주었다. 좌표값을 구할 수 없는 도큐먼트들에게 임의로 1000을 주었지만 에러가 나서 0으로 바꿨다. 근데 0,0이면 영국 좌표가 되는데 이 도큐먼트가 검색되면 조건을 넣는다던지 나중에 따로 처리를 해야할 것 같다. 

 

* 만약 nori, ngram과 같은 analyzer를 각 필드 특성에 맞춰 사용한다면, 위 명령어 실행 전에 index mappings를 해주어야 한다. 

 

진행되는 동안 방금 만들은 logs 폴더 안에 error, trace, info 들이 생겨서 확인하거나 또는 kibana 연결하여 확인할 수 있다. kibana로 들어가 실시간으로 insert된 도큐먼트를 볼 수 있다.

 

kibana를 on할 때 
"License is not available" 에러가 나왔다.  

아래 답변을 참고하여 elasticsearch-setup-passwords 를 auto로 입력해주었는데 이 덕분에 되었는지 아니면 다른 이유인지는 모르겠다. 

https://discuss.elastic.co/t/unable-to-access-kibana-with-license-is-not-available/274323/5

 

 

 

 

9. 백그라운드로 monstache 를 돌려서 mongoDB에 추가생성/업데이트/삭제 등이 생기면 elasticsearch와 동일하게 씽크 맞추도록 만들기 

 

nohup monstache -f ./config.toml 2>&1& 
nohup monstache -f /Users/build/monstache/build/darwin-amd64/config.toml 2>&1&

 

nohup = no hang up 이라고 한다. 

아래 명령어를 계속해서 (멈추지 않고) 실행하게 하는 거 같다! 

 

아까 안들어갔던 2200건의 value 중 "NaN" 를 0으로 수정했더니 자동으로 올라갔다. 그런게 시간이 조금 걸렸다. 한 몇 분~ 10분 정도! 천천히 업데이트가 되나보다. 

 

 

Monstache 백그라운드 끄는 방법 

ps -ef | grep monstache 

위의 명령어로 돌아가는 monstache의 pid (?) Number 를 찾기 

kill [number]

kill하기 

 

 

 

 

Reference : https://kogun82.tistory.com/m/210

https://rwynn.github.io/monstache-site/start/

반응형