一丶 MongoShake简介
MongoShake是阿里云以Golang语言编写的通用平台型服务工具,它通过读取MongoDB的Oplog操作日志来复制MongoDB的数据以实现特定需求。
MongoShake还提供了日志数据的订阅和消费功能,可通过SDK、Kafka、MetaQ等方式的灵活对接,适用于日志订阅、数据中心同步、Cache异步淘汰等场景
源可以是单个 mongod、副本集或分片,而目标可以是 mongod 或 mongos。如果源是副本集,官方建议从次要/隐藏中获取数据以减轻主要压力。如果源是分片,每个分片都应该连接到 Mongo-Shake。目标端可以有多个 mongos 以保持高可用性,不同的数据将被散列并写入不同的 mongos。
二、 MongoShake功能介绍:
MongoShake从源库抓取oplog数据,然后发送到各个不同的tunnel通道。源库支持:ReplicaSet,Sharding,Mongod,目的库支持:Mongos,Mongod。现有通道类型有:
三、环境
环境: centos7
源库: mongodb 4.2.8(分片集群)
ip | port |
---|---|
172.30.2.185 | mongodb端口:22001、22002、22003 config端口:21000 mongos路由端口:20000 |
172.30.2.186 | mongodb端口:22001、22002、22003 config端口:21000 mongos路由端口:20000 |
172.30.2.187 | mongodb端口:22001、22002、22003 config端口:21000 mongos路由端口:20000 |
目的库:mongodb 4.2.8(分片集群)
ip | port |
---|---|
192.168.0.58 | mongodb端口:22001、22002、22003 config端口:21000 mongos路由端口:20000 |
192.168.0.59 | mongodb端口:22001、22002、22003 config端口:21000 mongos路由端口:20000 |
192.168.0.60 | mongodb端口:22001、22002、22003 config端口:21000 mongos路由端口:20000 |
四、操作步骤
1.执行如下命令下载MongoShake程序并重命名为mongoshake.tar.gz
wget "http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/196977/jp_ja/1608863913991/mongo-shake-v2.4.16.tar.gz" -O mongoshake.tar.gz
2.执行如下命令在将MongoShake解压到/data/mongoshake目录中。
tar zxvf mongoshake.tar.gz && mv mongo-shake-v2.4.16 /root/mongoshake && cd /data/mongoshake
3.执行vim collector.conf命令,修改MongoShake的配置文件collector.conf,涉及的主要参数说明如下表所示
源端地址修改
下面是配置文件详细介绍,如果源库不是分片集群模式,而是单机或者副本集模式,那么配置文件里面的 mongo_cs_ur、mongo_s_url 则不需要配置。其他配置默认即可
# 举例:
# 副本集:mongodb://username1:password1@primaryA,secondaryB,secondaryC
# 分片集:mongodb://username1:password1@primaryA,secondaryB,secondaryC;mongodb://username2:password2@primaryX,secondaryY,secondaryZ
#mongo_urls = mongodb://username:[email protected]:20040,127.0.0.1:20041
#mongodb 若为单节点只配mongo_urls即可,mongo_cs_url、mongo_s_url不用配置
mongo_urls = mongodb://useradmin:useradmin1234@172.30.2.185:22001,172.30.2.186:22001;mongodb://useradmin:useradmin1234@172.30.2.185:22002,172.30.2.187:22002;mongodb://useradmin:useradmin1234@172.30.2.186:22003,172.30.2.187:22003
# please fill the source config server url if source mongodb is sharding. mongoconf地址
mongo_cs_url =mongodb://useradmin:useradmin1234@172.30.2.185:21000,172.30.2.186:21000,172.30.2.187:21000
# please give at least one mongos address if source is sharding.
# 如果源端采用change stream拉取,这里还需要配置至少一个mongos的地址,多个mongos地址以逗号(,)分割
mongo_s_url =mongodb://useradmin:useradmin1234@172.30.2.185:20000,172.30.2.186:20000,172.30.2.187:20000
目的端地址修改
# 此处配置通道的地址,格式与mongo_urls对齐。分片集群到分片集群填写mongs地址
tunnel.address = mongodb://useradmin:useradmin1234@192.168.0.58:20000,192.168.0.59:20000,192.168.0.60:20000
启动方式:
./collector.linux -conf=collector.conf &
日志在 logs 目录下:
tailf logs/collector.log
观察打印的日志信息,当出现如下日志时,即代表全量数据同步已完成,并进入增量数据同步模式。
[09:38:57 CST 2021/10/22] [INFO] (mongoshake/collector.(*ReplicationCoordinator).Run:80) finish full sync,start incr sync with timestamp: fullBeginTs[1560994443], fullFinishTs[1560994737]
在源实例上测试写入:
use testdb;
for (i=1;i<=10000;i++) db.tb3.insert( {name:"student"+i, age:(i%120), address: "shanghai" } );
db.tb3.count()
然后,在目标节点执行验证操作:
use testdb;
db.tb3.count()
可以看到,数据记录是一致的。 实际上测试下来,会有2秒左右的延迟。