· 需求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便可解決這個問題。