mongoshake迁移工具的常见问题

e05af9fa3e92c48e7abf31c98701b31b.jpeg

     大家在使用mongoshake中遇到了很多问题,我这里对这些问题进行了总结,以更好的帮助大家在遇到问题时可以快速定位问题根源。
      如果还有其他新的问题,可以直接在评论区进行评论,会进行问题解答的。

Q. mongoshake是否会同步集合分片配置

A:不会同步,需要在同步前提前创建好

Q. 源端库没有开启集合分片,目标端是否可以开启集合分片

A:可以,需要在目标端前提前创建集合分片

Q. mongoshake全量和增量迁移中断后,是否可以直接再次开启迁移

A:不可以,全量同步后会创建mongoshake库,里面会记录增量信息,需手动删除源库mongoshake中ckpt_default集合,否则数据会丢失

Q. mongoshake迁移数据完后,在原有集合上开启集合分片,磁盘为何爆满

A:在已有的数据上直接开启分片,接下来的操作是拷贝,把当前分片上的数据块迁移到其它shard上,然后再删除旧数据块。删除的旧数据块不是马上释放的

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. 从MongoDB同步到MongoDB发现全量阶段目的端MongoDB压力过大怎么办?

A: 用户可以降低全量同步配置replayer的相关参数,以降低目的端压力。

Q. 从MongoDB同步到MongoDB发现全量阶段同步时间过久,怎么办?

A: 用户可以定位一下看看目的慢的原因是什么,正常情况下可以提高全量配置replayer的相关参数,以提高全量同步的性能。但也有可能,问题的瓶颈是源端/网络端/通道cpu,内存等压力过高,都是有可能的。

Q. 到底什么是checkpoint?

A: checkpoint是记录增量同步的位点情况,mongoshake的启动就是根据这个位点来进行的,比如我们已经同步到10点钟了,那么这个时候挂掉了,如果没有位点,那么只能从头开始拉,位点的意义就是在于断点续传。在mongoshake中,位点信息是以64位时间戳来标记的(ts字段,准确的说是32位时间戳+计数),如果发生挂掉重启,那么会从源库的oplog表中寻找这个位点,并从此开始往后进行同步。

到这里,用户可能会问,那么mongoshake里面位点是存储在哪里的?存储的位置就是取决于用户context的相关配置,以副本集为例,checkpoint是存储于源库的mongoshake库的ckpt_default表,其大概内容长这个样子:

rszz-4.0-2:PRIMARY>use mongoshake switched to db mongoshake rszz-4.0-2:PRIMARY> show collections ckpt_default rszz-4.0-2:PRIMARY> db.ckpt_default.find() { "_id" : ObjectId("3d75e8b872d91278c3be0cc9"), "name" : "rszz-4.0-2", "ckpt" : Timestamp(1566556865, 196096) }

其中ckpt对应的field就是checkpoint。

用户可能还会问,那么mongoshake的checkpoint是怎么存储的,什么时候会存储?答案是,checkpoint是定期存储的,如果有数据同步,那么checkpoint的更新会很频繁(秒级别);如果没有数据同步,比如这个时候用户源端就是没有写入,那么默认是分钟级别更新一次心跳checkpoint。假设mongoshake数据位点记录是10:00:00,但是数据已经同步到10:00:10,这个时候mongoshake挂掉了,下次会从10:00:00重新开始同步,由于DML本身具有幂等性,数据的重复回放是OK的。那么用户可能会问,DDL怎么办?参考下面问题。

Q. 如何同步DDL?DDL能保证幂等性吗?

A: 设置replayer.dml_only = false可以同步DDL。DDL不能保证幂等性。在mongoshake里面,如果发现是DDL语句,会卡一个全局的barrier,让当前DDL语句同步,然后再卡一个全局barrier,等当前DDL语句同步完成,再接着并发同步接下来的oplog,barrier的卡锁伴随着checkpoint的强制刷新。但是由于DDL同步和checkpoint的刷新并不是一个原子操作,如果用户恰好在同步DDL完成和checkpoint刷新之间,进程挂掉了,那么没有办法,重启以后肯定会持续报错,用户需要手动运维解决,比如跳过这个DDL,或者目的端近些一个反向操作(原来DDL是建库,需要进行删除库;原来是建索引,需要进行删索引操作)。但是,这个概率很低。

Q. mongoshake碰到同步出错的情况,会跳过这个错误,继续同步吗?

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

Q. 除了日志如何知道目前mongoshake的同步情况?

A: mongoshake有提供restful接口,可以监控mongoshake的内部同步情况,参考wiki: How to monitor the MongoShake,正常情况下lsn_ckpt.time会一直增长,如果这个数值不增长了,那么就表示同步出现问题了。

Q. 全量同步是否会同步索引?

A: 2.1以下版本,目前会同步索引,先是全量同步,全量同步完毕后会同步索引,后面版本我们会考虑加入开关,全量同步完毕可以选择性是否同步索引。接着是增量同步,增量同步阶段,设置replayer.dml_only = true不会同步索引,false的话会同步索引。

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

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

Q. 我的数据量很大,几百G/几个T/几十个T,all模式同步有什么要注意的地方?

A: 最需要注意的就是,全量同步完毕,增量能否接上。mongoshake是根据oplog的位点来决定全量结束是否要进行增量,如果全量花了2天,但是oplog表只能存储1天,那么全量同步完毕以后mongoshake就会报错退出,这是因为增量的位点丢失了。所以如果全量很大,同步时间势必很久,那么就需要放大oplog的表的大小以维持增量oplog。

其他还需要注意的就是压力问题,如何选取适当的参数应对对于源端/目的端的压力,减少对业务的影响。用户也可以决定从一个hidden结点,护着一个独立的secondary结点进行拉取。

Q. 同步出现xxx错误,怎么办?

A: 这个我在github的wiki基本都有总结,可以先看下github的faq。如果里面没有提到的,可以提交issue进行反馈。

Q. 目前mongoshake有校验工具吗?

A: 目前script下面有个comparison.py的全量校验脚本校验数据的一致性。那么如何进行增量的校验呢?目前还没有,敬请期待。

Q. sharding模式同步有啥需要注意的吗?

A: 如果源端是sharding,那么目前需要关闭balancer,在v2.1非稳定版本里面,我们支持了不关闭balancer,用户可以进行试用,但是目前这个是非稳定版本。此外源端如果是sharding,DDL的同步(replayer.dml_only = false)不能开启。

Q. 我把数据写入到kafka,怎么从kafka中拉取数据,发现直接拉取出现乱码

A: 请先看下wiki: https://github.com/alibaba/MongoShake/wiki/FAQ#q-how-to-connect-to-different-tunnel-except-direct。

kafka通道中的数据是有控制信息在里面的,用户不好直接剥离,可以用receiver进行对接。目前receiver对接后所有oplog都打印到控制台,用户也可以自己修改receiver代码,对接下游服务。当然,这个需要用户懂golang语言,这可能有一些学习成本在里面。后面我们会看看如何以更好的形式对接给用户。

Q. 我发现mongoshake建立以后对源端性能有所影响,出现了一些慢查询。

A: 目前全量阶段由于是扫表等操作,会对源端产生一些影响。增量阶段,正常情况影响很小,因为目前oplog找对应ts是二分模式。

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

A: 可以,需要启动多个mongoshake。对于不同的mongoshake,可以修改写入不同地方的checkpoint即可(比如表名修改一下),或者直接修改不同的collector.id。此外,需要注意的是,同一个目录下启动多个mongoshake,如果collector.id相同,是无法启动成功的。参考:https://github.com/alibaba/MongoShake/wiki/FAQ#q-how-to-sync-data-from-one-mongodb-to-several-target-mongodb

公众号内直接回复加群也可以,扫码加群也可以,觉得帖子写的不错,点点关注,点点赞,多多转载。

加入数据库技术交流群:

7d2e8b670aab1721205c2bb28ad01166.jpeg

进群福利:

1、知识共享与学习机会

2、问题求助与解决支持

3、技术沉淀和分享平台

4、及时了解行业动态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值