· 需求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便可解决这个问题。