MongoShake操作说明

简介

  • MongoShake是一个以golang语言进行编写的通用的平台型服务,通过读取MongoDB集群的Oplog操作日志,对MongoDB的数据进行复制,后续通过操作日志实现特定需求。集群数据同步是其中核心应用场景,通过抓取oplog后进行回放达到同步目的,实现灾备和多活的业务场景。
  • MongoShake可以根据oplog进行多种操作,文档内主要介绍MongoShake对集群间数据同步功能的使用介绍。
  • MongoShake——基于MongoDB的跨数据中心的数据复制平台-阿里云开发者社区 (aliyun.com)

安装

  • 安装包下载地址:Releases · alibaba/MongoShake (github.com)

     #建议新建mongoshake文件夹,在文件夹内,每个需要迁移的app都建立单独的文件夹
     # 下载安装包至指定mongoshake文件夹下需要进行迁移的app的文件夹内
     wget https://github.com/alibaba/MongoShake/releases/download/release-v2.6.5-20210630/mongo-shake-v2.6.5.tar.gz
     
     #解压缩
     tar -zxvf mongo-shake-v2.6.5.tar.gz
     ```
    
    

连接相关配置说明

  • mongoshake多种功能的实现依赖于对配置项的修改,通过配置不同的参数实现多种功能。

  • 对于MongoDB到MongoDB的同步需求,用户只需要修改collector.conf的配置文件。

    cd mongo-shake-v2.6.5
    vim collector.conf
    
  • sync_mode。同步的模式,有3种模式:all表示全量+增量同步,全量同步完毕以后进入增量同步;full表示仅进行全量同步,全量同步后进程将会退出;incr表示仅进行增量同步(默认),从给定的checkpoint(见下述)开始拉取增量数据。默认incr。

  • mongo_urls。源MongoDB连接串的地址,其格式与mongo_shell使用的连接串格式保持一致。逗号分隔同一个副本集内的结点,分号分隔分片sharding实例,免密模式可以忽略“username:password@”,注意,密码里面不能含有’@'符号。
    举例:
    副本集的连接串格式(A是主节点,B和C是2个从节点):mongodb://username1:password1@primaryA,secondaryB,secondaryC
    分片集的连接串格式(shard1的结点是A,B,C;shard2是X,Y,Z):mongodb://username1:password1@primaryA,secondaryB,secondaryC;mongodb://username2:password2@primaryX,secondaryY,secondaryZ
    注意:如果mongo_connect_mode不是为standalone的话,每个副本集(分片)都需要配置primary+secondary的连接串,不能只配置一个secondary节点,但可以只配置primary的。

  • mongo_cs_url。源MongoDB的config server的地址,如果源端是sharding,需要填写这个配置。默认空。

  • mongo_s_url。源MongoDB的mongos地址,如果源端是sharding,需要填写这个配置。默认空。

  • mongo_connect_mode。数据是从源MongoDB的哪个节点进行拉取的,primary表示从主节点拉取;secondaryPreferred(默认)表示优先从secondary拉取,没有的话将会从primary拉取;standalone表示从给定的单个节点拉取。需要注意的是,如果源端是sharding,且版本小于3.6,而且是全量同步(sync_mode=full),或者全量+增量同步(sync_mode=incr),建议这里配置primary

  • tunnel。通道类型,direct表示目的端对接的是MongoDB,rpc,file,kafka用于远程传输,mock仅用于调试。默认direct,对于Mongodb之间的数据同步,tunnel=direct

  • tunnel.address。通道地址,不同类型的通道需要配置不同的地址。对于***tunnel = direct***,此处配置目的端MongoDB的地址,地址的格式同mongo_urls的格式要求。

  • mongo_connect_mode。MongoDB实例的连接模式,仅限tunnel参数为direct时有效。取值:primary:从primary节点中拉取数。secondaryPreferred:从secondary节点中拉取数据。建议取默认值"secondaryPreferred"。

  • filter.namespace.black 指定数据同步的黑名单,这些指定的命名空间不会被同步至目标数据库,多个命名空间用英文分号(;)分隔。格式:filter.namespace.black = mongodbtest.customer;testdata.test123

  • filter.namespace.white 指定数据同步的白名单,只有这些指定的命名空间会被同步至目标数据库,多个命名空间用英文分号(;)分隔。格式:filter.namespace.white = mongodbtest.customer;test123

  • 其余参数可使用默认配置

启动

  • # 执行下述命令启动同步任务,并打印日志信息
    ./collector.linux -conf=collector.conf -verbose 2
    
    # 在sync_mode = all,即全量+增量同步模式下,观察打印的日志信息,当出现如下日志时,即代表全量数据同步已完成,并进入增量数据同步模式。
    [09:38:57 CST 2019/06/20] [INFO] (mongoshake/collector.(*ReplicationCoordinator).Run:80) finish full sync, start incr sync with timestamp: fullBeginTs[1560994443], fullFinishTs[1560994737]
    

常见问题汇总

  • Q. mongoshake是否会同步config, local, admin库

    A: 不会同步。如果用户一定要把admin的库同步到别的,那么可以通过命名转换功能(配置transform.namespace)把admin库同步到别的数据库,同时配置filter.pass.special.db参数:

    1. filter.pass.special.db = admin
    2. transform.namespace = admin.abc:target.abc # 把admin库下面的abc同步到target库的abc
  • Q. mongoshake碰到同步出错的情况,会跳过这个错误,继续同步吗?

    A: 不会,会持续报错,用户需要关注日志的运行情况。

  • Q. 是否可以把一个MongoDB同步到多个MongoDB?

    A: 可以,需要启动多个mongoshake。对于不同的mongoshake,可以修改写入不同地方的checkpoint即可(比如表名修改一下),或者直接修改不同的collector.id。此外,需要注意的是,同一个目录下启动多个mongoshake,如果collector.id相同,是无法启动成功的。

  • Q. 选择all模式同步,如果挂掉以后重启,是否会重新发起一次全量同步?进入增量阶段,是否要修改为oplog增量模式,然后再重启?

    A: 显示全量同步,全量同步完毕会写入checkpoint,然后进行增量同步,增量同步阶段会不断更新checkpoint。对于mongoshake来说,是否进行全量同步取决于checkpoint,如果checkpoint存在且合法,那么只会进入增量同步;否则,会先进行全量同步,然后是增量。那么checkpoint怎么知道是存在的,就是context里面的参数的位置决定;那么怎么知道checkpoint是合法的?如果最老的oplog的时间位点小于checkpoint,那么就是合法的,证明增量能接上。

  • Mongoshake同步过程的报错信息可参考以下网站解决:

    FAQ · alibaba/MongoShake Wiki (github.com)

如果这篇文章对您的学习工作产生了帮助,请您点一个免费的赞,您的鼓励是我继续创作的动力!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐