故事是这样开始的,因为想做一个MONGODB 的测试库同步部分生产库的数据,同时不想从基本数据搞起,因为数据量比较大。 其实是可以通过mongoexport 和 mongoimport 来搞起的,但问题是如果只是想捕获某个时间段的数据呢,或者仅仅想复现一下生产库中某个时间段出现的故障数据。怎么能跟踪这些数据并记录,在测试库上复现。

其实从MONGODB 3.4以后是有一个工具可以帮助的,Mongoreplay,他主要的功能就是,通过网络抓包,将通过网卡的数据截获变成特定的数据格式,然后在通过  replay的方式将数据在另一个库上进行重放,我们可以认为他有点类似于mysql 的binlog.  当然原理可能不同。

坑在哪里,继续往下听。 在捕捉数据的时候,要指定网卡,要指定你捕捉的端口号

mongoreplay record -i ens32 -e "port 27027" -b 20 -p /mongodata/mongo.json

MONGOREPLAY 的“坑”_服务器

据以BSON的方式灌入你指定的文件中。然后你拿着这个文件,可以原地将数据灌入到指定的 MONGODB 服务器

MONGOREPLAY 的“坑”_时间段_02

数据源位置,执行play 命令就可以将数据灌入到测试机中。

坑在哪里,在测试的过程中,发现数据时有时无,而且数据时有时无是有规律的,凡是在本地机执行的命令都找不到,凡是不在本地机执行的命令都有相关的数据抓取。

这里就牵扯,不是这个命令的问题,是抓包的问题,命令中 -i 后面的是必须要指定数据来源的网卡,一般机器有lo 本地回路,和 对外的物理网卡。而监控的时候,是在监控对外的物理网卡,而本地执行的命令均在 lo 回路中体现。

但这里就出现了问题,如果想要一个完全的数据通过mongoreplay命令是很困难的,即使我们产生两套mongoreplay 去抓取本地 和 外网的数据,但执行的顺序我们是无法再回放中进行鉴别的。

所以mongoreplay 这样的功能,仅仅有限于系统调试和故障重放,对于数据同步来说,这个功能实属鸡肋。

MONGOREPLAY 的“坑”_数据_03

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: go