zoukankan      html  css  js  c++  java
  • 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/
        ...
    

    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版本不匹配,重新安装匹配的版本即可
        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/

  • 相关阅读:
    1061. 判断题(15)
    1031. 查验身份证(15)
    1006. 换个格式输出整数 (15)
    1046. 划拳(15)
    1001. 害死人不偿命的(3n+1)猜想 (15)
    1021. 个位数统计 (15)
    1054. 求平均值 (20)
    写出这个数 (20)
    设计模式之中介者模式
    kill命令
  • 原文地址:https://www.cnblogs.com/chaizhenhua/p/13324005.html
Copyright © 2011-2022 走看看