一、初始化
源端导出数据
对源库进行一致性导出,一致性导出无法指定库名,需全量导出
mongodump -u admin -p admin1234 --host=localhost --port 27017 --gzip --oplog --out=/mongodb/backup/20230308/
获取mongo一致性导出时间点 ,时间显示为UTC,比中国正常时间晚8个小时,可以用于mongoshake增量同步,也可以用于oplog增量恢复
因为采用了压缩备份,生成的oplog.bson文件需要解压,首先需要修改文件名,否则解压不成功
cd /mongodb/backup/20230308/
cp oplog.bson /tmp/oplog.bson.gz
cd /tmp/
gzip -d oplog.bson.gz
bsondump oplog.bson > oplog
tail -100 oplog
{"op":"n","ns":"","o":{"msg":"periodic noop"},"ts":{"$timestamp":{"t":1678249800,"i":1}},"t":{"$numberLong":"32"},"v":{"$numberLong":"2"},"wall":{"$date":{"$numberLong":"1678249800877"}}}
db.oplog.rs.find({“ts”:{“$gt”:Timestamp(1678249800,1)}})是一致性备份最后的时间点,将时间戳转换为时间,后面的 1 表示当前时间点第几个操作
[root@Mon01 ~]# date -d @1678249800
Wed Mar 8 12:30:00 CST 2023
目标端导入数据
mongorestore -u admin -p admin1234 --host=localhost --port 27017 --gzip --oplogReplay /mongodb/backup/20230308/
二、恢复增量
源端导出增量数据
导出新生成的oplog ,根据当前时间获取合适的时间戳,作为导出oplog时的上线,虽然导出oplog后可以获取最后时间点,但是如果量太大的话难度会很大
[root@Mon01 ~]# date -d "2023-03-9 9:00:00" +%s
1678323600
mongodump -u admin -p admin1234 --authenticationDatabase admin --host localhost --port 27017 --gzip -d local -c oplog.rs -q '{"ts":{"$gte":{"$timestamp":{"t":1678249800,"i":1}},"$lt":{"$timestamp":{"t":1678323600,"i":1}}}}' --out=/mongodb/backup/20230309/
目标端恢复增量数据
mongorestore -u admin -p admin1234 --authenticationDatabase admin --host localhost --port 27017 --gzip --oplogReplay /mongodb/backup/20230309/local/oplog.rs.bson.gz
因为是异地灾备,建议多次采用恢复增量的方式,减少主从数据差异,降低MongoShake初次增量同步时的带宽压力
三、实时同步
部署mongoshake,参考链接
https://blog.csdn.net/u014650965/article/details/128069447
最后增量同步到2023-03-10 9:00:00
mongoshake配只文件修改如下参数,checkpoint.start_position为UTC时间,需要设置为2023-03-10T1:00:00Z
sync_mode = incr
mongo_urls = mongodb://username:password@source1:20040,source2:20041
tunnel.address = mongodb://target1:20080
filter.ddl_enable = true
checkpoint.start_position = 2023-03-10T1:00:00Z
启动mongoshake
nohup ./collector.linux -conf=collector.conf -verbose 0 &