可参考单实例MongoDB 如何开启Oplog_雅冰石的专栏-CSDN博客
在每个目标端都安装mongoshake。
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
#这里以往目标端192.168.144.249同步为例
vi collector.conf
#源端mongo地址
mongo_urls = mongodb://root:密码@192.168.144.248:27017
注意,mongo的密码不能包含@等特殊字符。
#目标端mongo地址
tunnel.address = mongodb://root:密码@192.168.144.249:27017
sync_mode = all
checkpoint.storage.collection = ckpt_default_249
注意:
checkpoint.storage.collection的默认值是ckpt_default,如果多个mongoshake配置的是同一个源端,则需要确保checkpoint.storage.collection的值是不同的,比如192.168.144.250的checkpoint.storage.collection值可以设置为ckpt_default_250
./collector.linux -conf=collector.conf -verbose
[2021/12/24 22:24:39 CST] [WARN]
______________________________
\ \ _ ______ |
\ \ / \___-=O'/|O'/__|
\ MongoShake, Here we go !! \_______\ / | / )
/ / '/-==__ _/__|/__=-| -GM
/ Alibaba Cloud / * \ | |
/ / (o)
------------------------------
……
会发现源端自动创建了一个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
--本篇文章主要参考了:
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的集群复制工具,可以满足迁移和同步的需求,进一步实现灾备和多活功能。
使用MongoShake实现MongoDB副本集间的单向同步 - 云数据库 MongoDB - 阿里云
https://github.com/alibaba/MongoShake/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98&FAQ
https://github.com/alibaba/MongoShake/wiki/FAQ#q-how-to-sync-data-from-one-mongodb-to-several-target-mongodb