可参考单实例MongoDB 如何开启Oplog_雅冰石的专栏-CSDN博客
Mongo shake下载地址:
Releases · alibaba/MongoShake · GitHub
cd /opt
tar -xvf mongo-shake-v2.4.16.tar.gz
mv mongo-shake-v2.4.16 mongoshake
cd mongoshake
vi collector.conf
#源端mongo地址
mongo_urls = mongodb://root:密码@192.168.144.251:27017
注意,mongo的密码不能包含@等特殊字符。
#目标端mongo地址
tunnel.address = mongodb://root:密码@192.168.144.252:27017
sync_mode = all
filter.ddl_enable = true
/*
详细的配置参数介绍,请参考:
配置参数说明 · alibaba/MongoShake Wiki · GitHub
*/
sh start.sh collector.conf
#检查是否能看到collector进程
ps -ef |grep collector | grep -v 'grep'
root 27759 1 0 18:52 ? 00:00:00 ./hypervisor --daemon --exec=./collector.linux -conf=collector.conf 1>> collector.linux.output 2>&1
root 27760 27759 0 18:52 ? 00:00:04 ./collector.linux -conf=collector.conf 1>> collector.linux.output 2>&1
/*
对应的停止命令是sh stop.sh mongoshake.pid。
日志文件路径:mongoshake/logs
有时启动mongoshake没起来,日志里也没报错,可用如下方式启动,能在启动页面就能看到有日志输出:
./collector.linux -conf=collector.conf -verbose
*/
会发现源端自动创建了一个mongoshake库:
single:PRIMARY> use mongoshake;
switched to db mongoshake
#有一个检查点的表
single:PRIMARY> show tables;
ckpt_default
#在源端插入数据
single:PRIMARY> use bb;
switched to db bb
single:PRIMARY> db.a.insert({"id":1})
WriteResult({ "nInserted" : 1 })
#在目标端验证下数据能否同步过来
> use bb;
switched to db bb
> db.a.find();
{ "_id" : ObjectId("61c5e78406138fe33e2b88d5"), "id" : 1 }
发现数据过来了。
假如只想同步mongo的部分表,可以这样实现:
修改配置文件,设置以下参数,不同对象之间用分号分隔:
示例:
同步aa.t1,bb.t1这俩表:
filter.namespace.white =aa.t1;bb.t1
--本篇文章主要参考了:
使用MongoShake实现MongoDB副本集间的单向同步 - 云数据库 MongoDB - 阿里云
GitHub - alibaba/MongoShake: MongoShake is a universal data replication platform based on MongoDB's oplog. Redundant replication and active-active replication are two most important functions. 基于mongodb oplog的集群复制工具,可以满足迁移和同步的需求,进一步实现灾备和多活功能。