MongoDB遷移數據到Elasticsearch真實操作案例


· 需求

1、遷移MongoDB中的存量數據到Elasticsearch
2、增量數據業務方會寫到MongoDB,但數據變更也要實時同步到Elasticsearch

經過數日的工具特性和我的需求對比之后,我選擇了monstache來完成這次的需求。不言而喻,它可以滿足我前面提到的需求。

  • 調試過程

1、選擇適合你的monstache版本(符合你的es版本、mongodb版本)
版本參考如下:

我的各個版本如下:

   es:     6.7.0
   mongo:  3.2.13
   所以我選擇 monstache:4版本,對應master分支

2、monstache是使用golang語言開發,首先要安裝go環境,需要注意的是要安裝符合你monstache的go版本,怎么試?繼續往下看,別着急。
我這里需要安裝go1.13.6

1、安裝
    sudo  wget https://dl.google.com/go/go1.13.6.linux-amd64.tar.gz
    tar -C /usr/local -xzf go1.13.6.linux-amd64.tar.gz

2、配置環境變量
    vim /etc/profile
    ...
    export GOROOT=/usr/local/go
    export GOPATH=/home/go/
    export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
    export GOPROXY=https://mirrors.aliyun.com/goproxy/
    ...

    source /etc/profile

3、安裝monstache
這里我直接把它安裝到/usr/local目錄下,省去了配置環境變量的過程。

    cd /usr/local/
    git clone https://github.com/rwynn/monstache.git
    cd monstache

到這里,下載完源碼之后要按照你的mongo 和 es的版本來選擇對應的monstache分支,我這里選擇master分支
    
    git checkout master #切換分支
    go install #安裝monstache,這一步可能會提示go版本不匹配,重新安裝匹配的版本即可.   或者 sudo /usr/local/go/bin/go install
    monstache -v #檢測版本

4、配置同步任務

Monstache配置使用TOML格式,默認情況下,Monstache會使用默認端口連接本地主機上的ES和MongoDB,並追蹤MongoDB oplog。在Monstache運行期間,MongoDB的任何更改都會同步到ES中。

  • 進入monstache安裝目錄,默認是沒有配置文件的,所以我們要創建並且編輯配置文件。
    下面是我用到的配置,大家可以參考
#啟用調試日志,這項要放在最上面,否則日志打印不到文件(坑了我幾個小時)
verbose = true  

#mongodb的鏈接地址
mongo-url = "xxx"

#es的鏈接地址
elasticsearch-urls = ["http://xxx:9200"]

#要監聽的mongodb的集合格式是 庫名.集合名,可以寫多個,也可以使用正則來匹配多個,相應配置項為 namespace-regex
direct-read-namespaces = ["imcenter.im_ch","imcenter.im_chat",]

#es用戶(沒有可不填)
elasticsearch-user = "xxx"

#es密碼(沒有可不填)
elasticsearch-password = "xxx"

#monstache最多開幾個線程同步到es,默認為4
elasticsearch-max-conns = 4

#mongodb刪除集合或庫時是否同步刪除es中的索引
dropped-collections = false
dropped-databases = false

#記錄同步位點,便於下次從該位置同步
resume = true

指定恢復策略。僅當resume為true時生效,默認為0-基於時間戳的變更流恢復
resume-strategy = 0

#生產環境記錄日志必不可少,monstache默認是輸出到標准輸出的,這里指定它輸出到指定的日志文件(這個也是踩坑踩出來的哦!)
[logs]
info = "/home/admin/logs/monstore-center/info.log"
warn = "/home/admin/logs/monstore-center/wran.log"
error = "/home/admin/logs/monstore-center/error.log"
trace = "/home/admin/logs/monstore-center/trace.log"

#設置日志切割參數,下面的配置意思是:每個日志文件超過500M會被切割,最大保存最近60個日志文件,會壓縮歷史日志
[log-rotate]
max-size = 500
max-age = 60
compress = true

#高可用模式下需要配置集群名稱,集群名稱一樣的進程會自動加入一個集群內,要注意這是個集群是高可用的,而不是負載均衡的。(看到其他文檔里說這個參數是es集群的名稱,其實並不是,自定義值)
cluster-name = 'HA-im'

#mapping定義mongodb數據到es的索引名稱和type,namespace是庫名.集合名
#這里需要注意一件事:最好是在es中創建好你要的索引結構,關閉es的自動創建索引功能,不然monstace會給mongodb中所有的集合都創建一個索引。我這里就對應了兩個索引
[[mapping]]
namespace = "ec-imcenter.im_chat"
index = "im_chat"
type = "im_chat"

[[mapping]]
namespace = "ec-imcenter.im_ch"
index = "im_ch"
type = "im_ch"

5、啟動

最好使用兩台機器部署,防止一台機器出故障導致同步延遲。

啟動有多種方式:這里提供兩種吧

1)、systemd管理

#添加配置
sudo vim  /usr/lib/systemd/system/monstache.service

[Unit]
Description=monstache sync service

[Service]
Type=notify
ExecStart=/usr/local/bin/monstache -f -cluster-name HA-im /etc/monstache/config.toml
WatchdogSec=30s
Restart=always

[Install]
WantedBy=multi-user.target

#加載變更
sudo systemctl daemon-reload

#啟動進程
sudo systemctl start monstache

2)、使用supervisord管理進程

cat /etc/supervisord.d/monstache.ini
[program:monstache]
command=/home/admin/go/bin/monstache -cluster-name HA-im -f /mnt/alinas/monstache_im/config.toml
user=admin ; 運行用戶
stopsignal=TERM ; 停止信號
stopwaitsecs = 30 ; 停止等待時間
autostart = true ; 是否自動啟動
startsecs = 30 ; 啟動時間
autorestart = true ; 是否異常自動重啟
startretries = 30 ; 重啟嘗試次數
redirect_stderr = true ; 是否重定向錯誤信息
stdout_logfile_maxbytes = 500MB  ; stdout 日志文件大小,默認 50MB
stdout_logfile_backups = 1     ; stdout 日志文件備份數
stdout_logfile = /home/admin/logs/monstore-center/stdout.log

#啟動進程
sudo systemctl restart supervisord

6、可能會遇到的問題

a、日志沒有輸出到你指定的文件里
    可能的原因:
    1、 檢查機器上是否已經啟動monstache進程
    2、檢查配置文件是否設置了 verbose = true 參數,並且在配置文件的最前面。
    3、檢查配置文件是否設置了如下的logs參數和位置,使用絕對路徑。
    
    [logs]
    info = "xxx"
    warn = "xxx"
    error = "xxx"
    trace = "xxx"
    
    4、檢查啟動monstache的用戶是否有日志目錄的權限
-----------------------------------------------------------------------
b、啟動報monstache未認證,不能在mongodb中創建一個什么集合的問題。

    這個問題是因為開啟高可用集群模式后,monstache需要創建一個集合來記錄同步的位置和一起其他信息。問題的原因可能在於你的mongodb的uri配置問題,需要使用root用戶admin庫來鏈接mongo即可解決這個問題。

tips:

1、如果要刪除索引重新全量同步數據,如果使用的是集群模式,需要在mongodb中刪除monstache集合,否則只會同步增量數據
2、monstache要求mongodb有副本集並開啟oplog,否則gg。

官方文檔:https://rwynn.github.io/monstache-site/start/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM