最近需要进行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
直接下载二进制包, 免除编译部分
wget https://github.com/alibaba/MongoShake/releases/download/release-v2.6.6-20220323/mongo-shake-v2.6.6.tar.gz
mongo-shake-v2.6.6.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

还有更多参数可以参考文档

常见错误:

1.同步的时候发生了终端, 查看mongo日志, 发现会出现   报错 Too  many  open files问题

这是因为连接数不够用导致, 需要调大该值,

1、cat /etc/redhat-release
CentOS release 6.8 (Final) 2、修改当前交互终端的limit值
ulimit -n 655350.此时系统的文件句柄数为655350. 3、永久修改limit值
vim /etc/security/limits.conf
mongod soft nofile 655360
mongod hard nofile 655360 4、centos6还有的limit限制,/etc/security/limits.conf限制实际取决于/etc/security/limits.d/90-nproc.conf的配置,也就是说哪怕/etc/security/limits.conf设置最大打开数是65535,而/etc/security/limits.d/20-nproc.conf里配的是4096,那最终结果还是用户最大只能打开4096个文件句柄,所以还要再修改20-nproc.conf
(如果是centos7,则是/etc/security/limits.d/90-nproc.conf)
vim /etc/security/limits.d/90-nproc.conf
* soft nproc 655360
root soft nproc unlimited 5、OS其他地方可能影响文件最大打开句柄都做设置
vim /proc/sys/fs/file-max
655360 vim /etc/rc.d/rc.local
fs.file-max=655360 vim /etc/sysctl.conf
fs.file-max=655360

我这边的进程管理工具是systemctl, 也同时增加限制条件

[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target [Service]
Type=forking
ExecStart=/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/conf/mongodb.conf
LimitFSIZE=infinity
LimitCPU=infinity
LimitAS=infinity LimitNOFILE=640000
LimitNPROC=640000 [Install]
WantedBy=multi-user.target

同时增大最大连接数:

# 数据存储目录
dbpath=/data/mongodb/data
# 日志存储目录
logpath=/data/mongodb/logs/mongodb.log
# 进程文件
pidfilepath=/data/mongodb/mongodb.pid
# 日志追加方式存储
logappend=true
# 开启日志文件,默认开启
journal=false #quiet=true port=27017
# 是否以守护进程方式运行
fork=true
#fork=false
# 不给你定IP
bind_ip=0.0.0.0
# 开启认证(安全模式)
#auth=false
auth=true storageEngine=wiredTiger
wiredTigerCacheSizeGB=20 # 这里设置mongo最大使用的内存, 防止出现占用内存过多 maxConns=20000
# 副本集的名称
#replSet=mongo45
# 复制操作日志大小(MB)
#oplogSize=10240

如果发现buffer/cache较高, 也可以清理

手动清理:
> sync
> echo 1 > /proc/sys/vm/drop_caches
> echo 2 > /proc/sys/vm/drop_caches
> echo 3 > /proc/sys/vm/drop_caches sync:将所有未写的系统缓冲区写到磁盘中,包含已修改的i-node、已延迟的块I/O和读写映射文件
echo 1 > /proc/sys/vm/drop_caches:清除page cache
echo 2 > /proc/sys/vm/drop_caches:清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。
echo 3 > /proc/sys/vm/drop_caches:清除pagecache和slab分配器中的缓存对象。
/proc/sys/vm/drop_caches的值,默认为0

定时清理:

> vim clean.sh
#!/bin/bash#每两小时清除一次缓存
echo "开始清除缓存"
sync;sync;sync #写入硬盘,防止数据丢失
sleep 20#延迟20秒
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches > chmod +x clean.sh
> crontab -e
# 每两小时执行一次
0 */2 * * * /opt/clean.sh

mongo迁移工具之mongo-shake的更多相关文章

  1. 【mongo】启动mongo

    输入mongo应该就可以启动了.但是我得到了一个报错信息. Failed global initialization: BadValue Invalid or no user locale set. ...

  2. windows mongo 开启副本集 6.x版本 mongo : 无法将“mongo”项识别为 cmdlet、函数、脚

    mongo报错 当前使用版本6.0.3,bin目录下并没有mongo.exe,所以没有mongo命令, 需要下载 https://www.mongodb.com/try/download/shell  ...

  3. 谈一谈NOSQL的应用,Redis/Mongo

    1.心路历程 上年11月份来公司了,和另外一个同事一起,做了公司一个移动项目的微信公众号,然后为了推广微信公众号,策划那边需要我们做一些活动,包括抽奖,投票.最开始是没有用过redis的,公司因为考虑 ...

  4. window下安装mongodb及php mongo扩展

    1.安装mongoDB 下载最新版本的 MongoDB 下载地址:http://www.mongodb.org/downloads 解压文件到 D:\mongodb 解压后的文件列表如下: 创建数据存 ...

  5. 如何在Ubuntu中让mongo远程可连接

    最近团队的一个成员由于项目原因需要在vps上建立mongo数据库服务器并允许远端访问,这里整理下设置的思路 首先需要安装mongo apt-get updateapt-get install mong ...

  6. 【原】安装mongo的php插件

    http://pecl.php.net/package/mongo https://github.com/mongodb/mongo-php-driver/tarball/master 1. 安装mo ...

  7. mongo学习笔记(六):linux上搭建

    linux分以下几台 monogos mongocfg mongod1 mongod2 1.用ssh把 mongodb-linux-x86_64-3.0.6.tgz 移到linux /root上 2. ...

  8. mongo学习笔记(五):分片

    分片  人脸:       代表客户端,客户端肯定说,你数据库分片不分片跟我没关系,我叫你干啥就干啥,没什么好商量的. mongos: 首先我们要了解”片键“的概念,也就是说拆分集合的依据是什么?按照 ...

  9. spring-boot支持双数据源mysql+mongo

    这里,首先想说的是,现在的web应用,处理的数据对象,有结构化的,也有非结构化的.同时存在.但是在spring-boot操作数据库的时候,若是在properties文件中配置数据源的信息,通过默认配置 ...

  10. Mongo数据模型

    Mongo数据模型 一个Mongo系统(参考上述部署)包含一组数据库 一个 database 包含一组collection 一个 collection 包含一组document 一个 document ...

随机推荐

  1. LinkedHashMap原理详解—从LRU缓存机制说起

    写在前面 从一道Leetcode题目说起 首先,来看一下Leetcode里面的一道经典题目:146.LRU缓存机制,题目描述如下: 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结 ...

  2. TypeScript 高级教程 – 把 TypeScript 当强类型语言使用 (第一篇)

    前言 原本是想照着 TypeScript 官网 handbook 写个教程的. 但提不起那个劲... 所以呢, 还是用我自己的方式写个复习和进阶笔记就好了呗. 以前写过的 TypeScript 笔记: ...

  3. Python 潮流周刊#70:微软 Excel 中的 Python 正式发布!(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  4. Linux操作系统和文件系统、常见命令(下)

    C语言的绝大部分内容应该记录在以.c作为拓展名的文件里,这种文件叫做C语言的源文件 C语言程序里还包括以.h作为拓展名的文件,这种文件叫头文件(只有极少数的内容可以记录在头文件里) C语言程序里可以使 ...

  5. Android 基于 Choreographer 的渲染机制详解

    本文介绍了 App 开发者不经常接触到但是在 Android Framework 渲染链路中非常重要的一个类 Choreographer.包括 Choreographer 的引入背景.Choreogr ...

  6. OCR+PDF解析配套前端工具开源详解!

    面对日常生活和工作中常见的OCR识别.PDF解析.翻译.校对等场景,配套的可视化工具能够极大地提升我们的使用体验和工作效率. 通过可视化界面,我们可以直观地看到文本识别.解析和翻译的结果,便捷评估产品 ...

  7. vue前端开发仿钉图系列(2)左侧图层列表的开发详解

    项目开发前还是特别说明一下组件库的重要性,谢谢饿了么团队分享的element组件库,大大节省了页面的开发成本.左侧图层列表核心功能有1.根据图层类型展示点线面2.开关控制右侧地图上点线面的展示和隐藏3 ...

  8. v-model 语法糖-在父子组件传值 的简写形式

    props的变量名字 必须是  value ,this.$emit('input',数据值) 的自定义事件必须是 input : v-model 是 vue 中进行数据双向绑定的指令,在内部实际上是通 ...

  9. SaaS架构:中央库存系统架构设计

    大家好,我是汤师爷~ 近年来,越来越多的零售企业大力发展全渠道业务.在销售额增长上,通过线上的小程序.直播.平台渠道等方式,拓展流量变现渠道.在会员增长方面,通过多样的互动方式,全渠道触达消费者,扩大 ...

  10. 某物联网数智化园区行业基于 KubeSphere 的云原生实践

    公司简介 作为物联网 + 数智化园区一体化解决方案提供商,我们致力于为大中型园区.停车场提供软硬件平台,帮助园区运营者实现数字化.智能化运营. 在使用 K8s 之前我们使用传统的方式部署上线,使用 s ...