1 概述
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
官方链接:https://docs.mongodb.com/
类别:数据库
2 数据库编译安装
2.1 编译
本次编译请参考mongodb-3.6.18
2.2 安装
本次安装请参考mongodb-3.6.18
3 基础环境
3.1 环境信息
Mongodb3.6.18(源端) |
121.36.6.217(linux) |
Mongodb3.6.18(目标端) |
114.116.236.85(linux) |
Mongo-shake(工具) |
121.36.7.55(linux) |
3.2 源端mongodb环境
3.2.1 创建用户
源端创建需要登录的用户,并授予管理员权限。
db.createUser({
user: "root",
pwd: "jiayan",
"roles" : [
{
"role" : "read",
"db" : "local"
},
{
"role" : "read",
"db" : "admin"
},
{
"role" : "read",
"db" : "config"
}
]
})
3.2.2 打开oplog日志
1)配置文件添加如下2行:
oplogSize=50
replSet=jiayan
2)初始化副本集
use admin
rs.initiate({_id:'jiayan',members:[{_id:0,host:'127.0.0.1:27017'}]})
初始化副本集必须在admin数据库下初始化,否则初始化成功后,对数据的所有操作全部异常
1)查看oplog日志
db.printReplicationInfo()
3.3 目标端mongodb环境
3.3.1 创建用户
源端创建需要登录的用户,并授予管理员权限
db.createUser({
user: "root",
pwd: "jiayan",
"roles" : [
{
"role" : "read",
"db" : "local"
},
{
"role" : "read",
"db" : "admin"
},
{
"role" : "read",
"db" : "config"
}
]
})
4 迁移工具
4.1 简介
MongoShake是一个以golang语言进行编写的通用的平台型服务,通过读取MongoDB集群的Oplog操作日志,对MongoDB的数据进行复制,后续通过操作日志实现特定需求。日志可以提供很多场景化的应用,为此,在设计时就考虑了把MongoShake做成通用的平台型服务。通过操作日志,提供日志数据订阅消费PUB/SUB功能,可通过SDK、Kafka、MetaQ等方式灵活对接以适应不同场景(如日志订阅、数据中心同步、Cache异步淘汰等)。集群数据同步是其中核心应用场景,通过抓取oplog后进行回放达到同步目的,实现灾备和多活的业务场景。
MongoShake的应用场景大致有这几种:
1.MongoDB集群间数据的异步复制,免去业务双写开销。
2.MongoDB集群间数据的镜像备份
3.日志离线分析
4.日志订阅
5.数据路由。根据业务需求,结合日志订阅和过滤机制,可以获取关注的数据,达到数据路由的功能。
6.Cache同步。日志分析的结果,知道哪些Cache可以被淘汰,哪些Cache可以进行预加载,反向推动Cache的更新
7.基于日志的集群监控
4.2 安装包
获取地址:
https://github.com/alibaba/MongoShake/releases/download/release-v2.4.7-20200630/mongo-shake-v2.4.7_2.tar.gz
5 迁移计划
5.1 迁移需求
从mongodb迁移到mongodb,在业务不停机的情况下完成全量数据+增量数据的迁移。
5.2 迁移策略
使用mongo-shake进行全量+增量的迁移
6 迁移过程
6.1 安装迁移工具
解压mongo-shake-v2.4.7_2.tar.gz
6.2 修改配置文件
修改collector.conf内容:
默认必须修改的以下参数,具体其他参数可以查看配置文件
master_quorum = true ##如果开启主备mongoshake拉取同一个源端,此参数需要开启。
sync_mode = all mongo_urls = mongodb://121.36.6.217:27017 ##源MongoDB连接串信息,逗号分隔同一个副本集内的结点,分号分隔分片sharding实例,免密模式
tunnel.address = mongodb://114.116.236.85:27017 ##目标MongoDB连接串信息,此处配置通道的地址,格式与mongo_urls对齐
mongo_connect_mode=standalone ### standalone表示从任意单个结点拉取。
checkpoint.storage.url = mongodb://121.36.6.217:27017 ##checkpoint的具体写入的MongoDB地址,如果不配置,对于副本集将写入源库(db=mongoshake),对于分片集
checkpoint.storage.db = mongoshake # checkpoint存储的db的名字
6.3 确认数据
6.3.1 源端
6.3.2 目标端
6.4 全量同步
6.4.1 开启进程
执行
./collector.linux -verbose -conf=collector.conf
6.4.2 查看日志
部分日志 collector.log
6.4.3 查看目标端数据
6.5 增量同步
6.5.1 源端操作
6.5.2 查看日志
6.5.3 查看目标端数据
7 迁移问题
7.1 no oplog ns in mongo
7.1.1 背景
启动迁移工具进行迁移时,报:
There has no oplog collection in mongo db server
7.1.2 原因
源端mongodb没有打开oplog日志
7.1.3 解决方法
源端打开oplog日志,具体步骤请看3.2.2
7.2 no reachable servers
7.2.1 背景
启动迁移工具进行迁移时,报:
error[no reachable servers]. Please add primary node into 'mongo_urls' if 'context.storage.url' is empty
7.2.2 原因
配置文件里配置的该库,在实际源端数据库没有创建
7.2.3 解决方法
在源端创建该数据库
8 总结
Mongo-shake支持全量+增量的迁移,增量通过抓取oplog后进行回放达到同步目的,业务无需停机。