一则 MongoDB 副本集迁移实操案例

文中详细阐述了通过全量 + 增量 Oplog 的迁移方式,完成一套副本集 MongoDB 迁移的全过程。

作者:张然,DBA 数据库技术爱好者~

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

本文约 900 字,预计阅读需要 3 分钟。

背景介绍

客户要将生产环境上一套副本集架构的 MongoDB 进行迁移,数据量 240GB 左右。经过测试,全量备份耗时 3.5 小时,恢复耗时 4.5小时。

为了减少割接时间,采取全量 + 增量 Oplog 的迁移方式。提前一天进行全备,割接当天只需备份增量的 Oplog 恢复即可,可大幅减少割接窗口。

实操过程

查看 Oplog 信息

检查并评估生产环境 Oplog 的产生信息,以防全量和增量备份期间产生的 Oplog 被覆盖掉。

mongo> db.getReplicationInfo()
{
"logSizeMB" : 20480,
"usedMB" : 20374.38,
"timeDiff" : 7074665,
"timeDiffHours" : 1965.18,
"tFirst" : "Fri Feb 24 2023 18:36:32 GMT+0800 (CST)",
"tLast" : "Wed May 17 2023 15:47:37 GMT+0800 (CST)",
"now" : "Wed May 17 2023 15:47:43 GMT+0800 (CST)"
}

可以看出在 1965.18h 的运行中,产生了 10374.38MB 大小的 Oplog。

全量备份

全量备份并拷贝备份期间产生的 Oplog 用来增量还原。

#!/bin/bashuser=admin
password=123
host=127.0.0.1
port=27017
outputdir=/data/mongobak_`date +%F`
authenticationdatabase=admin
start_time=`date +%s`
mongodump -u$user --host $host --port $port -p$password --authenticationDatabase $authenticationdatabase --oplog --gzip -o $outputdir
stop_time=`date +%s`
duration=$((stop_time-start_time)) 
echo "Spend times: $duration seconds"

全量恢复

利用全备进行数据恢复。

#!/bin/bashstart_time=`date +%s`
user=admin
password=123
host=127.0.0.1
port=27017
authenticationdatabase=admin
mongorestore -u$user --host $host --port $port -p$password --authenticationDatabase $authenticationdatabase --oplogReplay --gzip /data/mongobak_2023-07-17
stop_time=`date +%s`
duration=$((stop_time-start_time)) 
echo "Spend times: $duration seconds"

提取增量备份开始的时间点

全备备份出来的 Oplog,可以利用 bsondump 工具将 bson 转换为 json 格式,查看备份时间产生的最后的 Oplog 的时间戳,根据此时间戳来进行增量的 Oplog 备份。

shell> cd /data/ mongobak_2023-07-17
shell> mv oplog.bson oplog.bson.gz
shell> gzip -d oplog.bson.gz
shell> bsondump --pretty oplog.bson > op.json

查看 op.json 文件,找出增量备份开始的时间点。

"ts": {"$timestamp": {"t": 1686669429,"i": 4}
},

增量备份

备份 Oplog(时间戳大于上一次全备结束时的时间)。

#!/bin/bashuser=admin
password=123
host=127.0.0.1
port=27017
outputdir=/tmp/oplog_`date +%F`
authenticationdatabase=admin
start_time=`date +%s`
mongodump -u$user --host $host --port $port -p$password --authenticationDatabase $authenticationdatabase -d local -c oplog.rs -q '{"ts":{"$gt": {"$timestamp":{"t":1686669429, "i":4}}}}' -o $outputdir
stop_time=`date +%s`
duration=$((stop_time-start_time)) 
echo "Spend times: $duration seconds"

增量恢复

#!/bin/bash
user=admin
password=123
host=127.0.0.1
port=27017
authenticationdatabase=admin
start_time=`date +%s`
mongorestore -u$user --host $host --port $port -p$password --authenticationDatabase $authenticationdatabase --oplogReplay  /data/oplog_2023-07-17
stop_time=`date +%s`
duration=$((stop_time-start_time)) 
echo "Spend times: $duration seconds"

增量迁移后业务文档数量对比

分别在源端和目标端运行脚本,检查迁移完成后业务数据库下文档数量是否一致。

#!/bin/bashuser=admin
password=123
host=127.0.0.1
port=27017
authenticationdatabase=admin
mpid=`pidof mongod`
tooldir=`dirname $(ls -l /proc/$mpid/exe | awk '{print $11}')`
database=$(echo "show dbs" | $tooldir/mongo -uadmin --host $host --port $port -p$password --authenticationDatabase $authenticationdatabase  --quiet |awk '{print $1}'| sed -E '/^admin$|^config$|^local$/d')
for db in $database
docollections=$(echo -e "use $db\n show collections" | $tooldir/mongo -u $user --host $host --port $port -p $password  $authenticationdatabase --quiet | sed '/switched to db/d')for table in $collectionsdocount=$(echo -e "use $db\n db.$table.count()" | $tooldir/mongo -u $user --host $host --port $port -p $password  --authenticationDatabase $authenticationdatabase  --quiet | sed '/switched to db/d')echo "$db.$table have $count documents"done
done

源端运行结果:

目标端运行结果:

注意事项

  • 使用 secondary 备份时,在割接停止业务后,增量备份前,首先检查下从库与主库的延时,确保主从没有延时,防止备份出的数据和主库不一致。
  • 如果全备时指定了 gzip,在提取时间戳时要重命名 oplog.bsonoplog.bson.gz,然后解压,再利用 bsondump 工具解析 bson 文件,否则会报错。

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/228941.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nodejs669在线图书借阅管理系统vue前端

系统的设计与实现主要实现角色有管理员和用户,管理员在后台管理用户模块、用户表模块、图书借阅模块、图书归还模块、图书分类模块、token表模块、收藏表模块、书籍信息模块、图书资讯模块、留言板模块、书籍信息评论表模块、注册用户模块、配置文件模块、处罚记录模块、在线客…

中兴小鲜50 ZTE 畅行50 刷机救砖演示机7543n root 虎贲 展锐 T760 解锁BL

系统信息 网络制式 支持中国移动、中国电信、中国联通、中国广电四大运营商5G频段;支持4G/3G/2G 系统平台 MyOS 13.0(基于Android 13) 硬件信息 处理器 展锐T760,高性能8核5G芯片 存储 6GB RAM128GB ROM 扩展 不支持 电池容…

基于单片机温湿度光照自动窗帘系统设计

**单片机设计介绍, 基于单片机温湿度光照自动窗帘系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的温湿度光照自动窗帘系统是一种智能家居系统,通过使用单片机作为控制核心&#xff0c…

前端---JavaScript篇

1. 介绍 JavaScript 是 前端开发人员必须学习的 3 门语言中的一门: HTML 定义了网页的内容CSS 描述了网页的布局JavaScript 控制了网页的行为 接下来开始详解JavaScript。 2.引入方法 js有两种导入方式,一种是内部脚本:直接在html页面中…

MSI Center,XBox从任务栏取消固定

1,设置查看方式中隐藏项目可见 2,进入文件夹:C:\Users\Default\AppData\Local\Microsoft\Windows\Shell 找到下面这两个文件夹: 3,修改文件名或者删除这两个文件即可

这个蓄电池监控神技,谁用谁知道!

随着电力需求的不断增长,蓄电池作为能量存储的关键组件在各个领域得到了广泛应用,为了确保蓄电池的可靠性和性能,监控系统变得至关重要。 蓄电池监控系统可以实时监测电池的状态、健康状况以及充放电过程,从而提高电池的寿命、降低…

【Rust】基本的语法概念

Rust初学习 常见概念变量与可变性变量常量隐藏 数据类型标量类型字符类型复合类型元组数组 函数参数语句和表达式具有返回值的函数 注释控制流使用循环重复执行 常见概念 变量与可变性 变量 fn main() {let x 5;println!("The value of x is: {x}");x 6;println…

链接共享平台LinkStack

什么是 LinkStack ? LinkStack 是一个独特的平台,为在线管理和共享链接提供了高效的解决方案。平台提供了一个类似于 Linktree 的网站,它可以让用户克服社交媒体平台上只能添加一个链接的限制。借助 LinkStack,用户可以轻松链接到…

比尔盖茨:GPT-5不会比GPT-4好多少,生成式AI已达到极限

比尔盖茨一句爆料,成为机器学习社区热议焦点: “GPT-5不会比GPT-4好多少。” 虽然他已不再正式参与微软的日常运营,但仍在担任顾问,并且熟悉OpenAI领导团队的想法。 消息来自德国《商报》(Handelsblatt)对…

酷开系统 | 追求娱乐不止一种方式,酷开科技带你开启新体验!

在当今社会,娱乐方式多种多样,人们对于娱乐的需求和追求也在日益增长。然而,传统的娱乐方式已经无法满足大家对于多元化、个性化的体验需求。此时,酷开科技以其独特的视角和领先的技术,为消费者们带来了全新的娱乐体验…

Java代码的编译与执行过程

一、编译过程 1、javac 编译 Java源代码通过编译器(javac)编译为字节码文件(.class)。 idea中的 build 和 maven package等指令都可以编译为 .class 2、类加载器(Class Loader) 类加载器负责将类的字节码文件加载到内存中,以便在运行时创…

Docker 概述与安装

文章目录 1. Docker简介2. 传统虚拟机和容器3. Docker运行速度快的原因4. Docker软件4.1 Docker镜像4.2 Docker容器4.3 Docker仓库 5. Docker架构6. CentOS安装Docker6.1 卸载旧版本6.2 配置yum资源库6.3 安装Docker引擎6.4 启动docker引擎6.5 设置开机自启 7. 卸载Docker8. 运…