mongo迁移工具之mongo-shake
最近需要进行MongoDB中数据迁移,之前使用过阿里系的redisShake感觉不错, 这次打算使用mongoShake来进行同步
github: https://github.com/alibaba/MongoShake
前提条件:
远端mongo示例需要开通oplog
将mongo-shake安装到目的端
1. mongo开启oplog
a) 修改配置文件 /data/mongo/mongod.conf
新增配置项
replSet=single # 这个名称可以随意, 最后可以做到辨识的目的
b)重启mongo
systemctl restart mongod
首次登录会出现报错:
show dbs; E QUERY [thread1] Error: listDatabases failed:{undefined "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435, "codeName" : "NotMasterNoSlaveOk" }
解决:
需要执行初始化命令
rs.initiate({ _id: "副本集名称", members: [{_id:0,host:"服务器的IP:Mongo的端口号"}]}) 例如(对应上述配置): rs.initiate({ _id: "single", members: [{_id:0,host:"192.168.144.249:27017"}]}) 执行完成后提示,代表执行成功: { "ok" : 1 }
初始完副本集中唯一的节点,可能短时间显示为SECONDARY或OTHER。一般而言,稍等一会,就会自然恢复为primary,无需人工干预。
rs:OTHER>
rs:PRIMARY>
rs:PRIMARY>
#验证是否生成了oplog.rs表:
2.安装mongoshake
a)下载并解压
wget -c https://github.com/alibaba/MongoShake/archive/refs/tags/release-v2.6.5-20210723-1.tar.gz tar -zxvf mongo-share-v2.6.4-20210723-1.tar.gz cd mongoshake
b)修改配置文件
#源端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
更多参数说明:https://github.com/alibaba/MongoShake/wiki/%E9%85%8D%E7%BD%AE%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E
3. 启动mongoshake
./collector.linux -conf /opt/tools/mongo-shake-v2.6.5/collector.conf -verbose 2
查看进程
ps -ef |grep collector | grep -v 'grep'
如果成功的时候, 源端会自动创建一个mongoshake库
会发现源端自动创建了一个mongoshake库: single:PRIMARY> use mongoshake; switched to db mongoshake #有一个检查点的表 single:PRIMARY> show tables; ckpt_default
如果想同步部分的表,可以设置白名单
filter.namespace.white=aa.t1,bb,t1,cc 表示同步aa库汇总t1表数据,bb库t1表数据,cc库所有数据
重点配置参数:
mongo_urls = mongodb://username:passwd@xx.xx.xx.xxx:27017 tunnel.address = mongodb://username:passwd@127.0.0.1:2701 filter.namespace.white = log_4.1000003920220228
filter.pass.special.db = admin 有些内置库正常不会迁移, 除非指定
filter.ddl_enable = true 是否开启DDL同步
如果想要配置同步的参数也可以修改:
full_sync.reader.collection_parallel = 6 # the number of document writer thread in each collection. # 同一个表内并发写的线程数,例如,8表示对于同一个表,将会有8个写线程进行并发写入。 full_sync.reader.write_document_parallel = 8 # number of documents in a batch insert in a document concurrence # 目的端写入的batch大小,例如,128表示一个线程将会一次聚合128个文档然后再写入。 full_sync.reader.document_batch_size = 128 # max number of fetching thread per table. default is 1 # 单个表最大拉取的线程数,默认是单线程拉取。需要具备splitVector权限。 # 注意:对单个表来说,仅支持索引对应的value是同种类型,如果有不同类型请勿启用该配置项! full_sync.reader.parallel_thread = 1 # the parallel query index if set full_sync.reader.parallel_thread. index should only has # 1 field. # 如果设置了full_sync.reader.parallel_thread,还需要设置该参数,并行拉取所扫描的index,value # 必须是同种类型。对于副本集,建议设置_id;对于集群版,建议设置shard_key。key只能有1个field。 full_sync.reader.parallel_index = _id # drop the same name of collection in dest mongodb in full synchronization # 同步时如果目的库存在,是否先删除目的库再进行同步,true表示先删除再同步,false表示不删除。 full_sync.collection_exist_drop = true
还有更多参数可以参考文档