MongoDB副本集迁移实操案例详解

 更新时间:2023年11月29日 09:52:34   作者:爱可生开源社区  
文中详细阐述了通过全量 + 增量 Oplog 的迁移方式,完成一套副本集 MongoDB 迁移的全过程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

背景介绍

客户要将生产环境上一套副本集架构的 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/bash

user=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/bash
start_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/bash
user=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/bash
user=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
do
  collections=$(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 $collections
  do
    count=$(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.bson 为 oplog.bson.gz,然后解压,再利用 bsondump 工具解析 bson 文件,否则会报错。

以上就是MongoDB 副本集迁移实操案例的详细内容,更多关于MongoDB 副本集迁移实操案例的资料请关注脚本之家其它相关文章!

相关文章

  • MongoDB 中聚合统计计算--$SUM表达式

    MongoDB 中聚合统计计算--$SUM表达式

    这篇文章主要介绍了MongoDB 中聚合统计计算--$SUM表达式的相关知识,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • 使用MongoDB进行数据存储的操作流程

    使用MongoDB进行数据存储的操作流程

    在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为一种高效的NoSQL数据库,逐渐成为了开发者的首选,本文将介绍如何使用MongoDB进行数据存储
    2025-01-01
  • MongoDB中多表关联查询($lookup)的深入讲解

    MongoDB中多表关联查询($lookup)的深入讲解

    NoSql的多表关联一直是比较复杂的问题,下面这篇文章主要给大家介绍了关于MongoDB中多表关联查询($lookup)的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-12-12
  • MongoDB中UPDATE操作$pullAll的方法

    MongoDB中UPDATE操作$pullAll的方法

    与$pull有所不同,$pull操作通过指定一个查询条件或单个值来删除数组中的元素, 而$pullAll删除所有在指定列表中的数组元素,本文介绍Mongodb UPDATE操作中的$pullAll, 用来从数组中删除多个元素,感兴趣的朋友一起看看吧
    2024-06-06
  • Pycharm连接MongoDB数据库安装教程详解

    Pycharm连接MongoDB数据库安装教程详解

    这篇文章主要介绍了Pycharm连接MongoDB数据库安装教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • MongoDB慢查询与索引实例详解

    MongoDB慢查询与索引实例详解

    索引通常能够极大的提高查询的效率,这篇文章主要给大家介绍了关于MongoDB慢查询与索引的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • mongodb增量备份脚本的实现和原理详解

    mongodb增量备份脚本的实现和原理详解

    MongoDB本身不支持增量备份,所以这里介绍我找到的方法,下面这篇文章主要给大家介绍了关于mongodb增量备份脚本的实现和原理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-09-09
  • Mongodb使用索引进行查询优化的操作方法

    Mongodb使用索引进行查询优化的操作方法

    为集合建立合适的索引,能够有效的减少查询操作时扫描数据的数量 ,从而提高查询效率,简化了mongodb内部查询工作,这篇文章主要介绍了Mongodb使用索引进行查询优化的操作方法,需要的朋友可以参考下
    2024-06-06
  • MongoDB安装、基础操作和聚合实例介绍

    MongoDB安装、基础操作和聚合实例介绍

    虽然MongoDB这些年很流行,但笔者之前没研究过,现在有需求研究这类NoSQL的数据库,是为了验证其是否可被替换,本文给大家介绍MongoDB安装、基础操作和聚合实例详解,感兴趣的朋友一起看看吧
    2024-07-07
  • MongoDB4.0在windows10下的安装与服务配置教程详解

    MongoDB4.0在windows10下的安装与服务配置教程详解

    本文通过图文并茂的形式给大家介绍了MongoDB4.0在windows10下的安装与服务配置教程,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08

最新评论