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

· 需求linux

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

通過很多天的工具特性和個人需求對比以後,我選擇了monstache來完成此次的需求。不言而喻,它能夠知足我前面提到的需求。git

· 調試過程github

一、選擇適合你的monstache版本(符合你的es版本、mongodb版本)
版本參考以下:
golang

個人各個版本以下:mongodb

es:     6.7.0
mongo:  3.2.13

因此我選擇 monstache:4版本,對應master分支

二、monstache是使用golang語言開發,首先要安裝go環境,須要注意的是要安裝符合你monstache的go版本,怎麼試?繼續往下看,彆着急。
我這裏須要安裝go1.13.6vim

一、安裝
    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

二、配置環境變量
    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/
    ...

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

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

到這裏,下載完源碼以後要按照你的mongo 和 es的版原本選擇對應的monstache分支,我這裏選擇master分支
    
    git checkout master #切換分支
    go install #安裝monstache,這一步可能會提示go版本不匹配,從新安裝匹配的版本便可
    monstache -v #檢測版本

四、配置同步任務負載均衡

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

a、進入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"

五、啓動

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

啓動有多種方式:這裏提供兩種吧

a、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

b、使用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

六、可能會遇到的問題

a、日誌沒有輸出到你指定的文件裏

可能的緣由:

    一、 檢查機器上是否已經啓動monstache進程
    二、檢查配置文件是否設置了 verbose = true 參數,而且在配置文件的最前面。
    三、檢查配置文件是否設置了以下的logs參數和位置,使用絕對路徑。
    
    [logs]
    info = "xxx"
    warn = "xxx"
    error = "xxx"
    trace = "xxx"
    
    四、檢查啓動monstache的用戶是否有日誌目錄的權限

b、啓動報monstache未認證,不能在mongodb中建立一個什麼集合的問題。

這個問題是由於開啓高可用集羣模式後,monstache須要建立一個集合來記錄同步的位置和一塊兒其餘信息。問題的緣由可能在於你的mongodb的uri配置問題,須要使用root用戶admin庫來連接mongo便可解決這個問題。

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

相關文章
相關標籤/搜索