MongoShake迁移同步MongoDB

一丶 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。现有通道类型有:

  1. Direct:直接写入目的MongoDB
  2. RPC:通过net/rpc方式连接
  3. TCP:通过tcp方式连接
  4. File:通过文件方式对接
  5. Kafka:通过Kafka方式对接
  6. Mock:用于测试,不写入tunnel,抛弃所有数据

MongoShake迁移同步MongoDB_第1张图片

三、环境
环境: 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秒左右的延迟。

你可能感兴趣的:(数据库,mongodb,数据库,database)