· 需求
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。