客户要将生产环境上一套副本集架构的 MongoDB 进行迁移,数据量 240GB 左右。经过测试,全量备份耗时 3.5 小时,恢复耗时 4.5小时。
为了减少割接时间,采取全量 + 增量 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 的运行中,产生了 20374.38MB 大小的 Oplog。
全量备份并拷贝备份期间产生的 Oplog 用来增量还原。
#!/bin/bashuser=adminpassword=123host=127.0.0.1port=27017outputdir=/data/mongobak_`date +%F`authenticationdatabase=adminstart_time=`date +%s`mongodump -u$user --host $host --port $port -p$password --authenticationDatabase $authenticationdatabase --oplog --gzip -o $outputdirstop_time=`date +%s`duration=$((stop_time-start_time)) echo "Spend times: $duration seconds"
利用全备进行数据恢复。
#!/bin/bashstart_time=`date +%s`user=adminpassword=123host=127.0.0.1port=27017authenticationdatabase=adminmongorestore -u$user --host $host --port $port -p$password --authenticationDatabase $authenticationdatabase --oplogReplay --gzip /data/mongobak_2023-07-17stop_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-17shell> mv oplog.bson oplog.bson.gzshell> gzip -d oplog.bson.gzshell> bsondump --pretty oplog.bson > op.json
查看 op.json 文件,找出增量备份开始的时间点。
"ts": { "$timestamp": { "t": 1686669429, "i": 4 }},
备份 Oplog(时间戳大于上一次全备结束时的时间)。
#!/bin/bashuser=adminpassword=123host=127.0.0.1port=27017outputdir=/tmp/oplog_`date +%F`authenticationdatabase=adminstart_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 $outputdirstop_time=`date +%s`duration=$((stop_time-start_time)) echo "Spend times: $duration seconds"
#!/bin/bashuser=adminpassword=123host=127.0.0.1port=27017authenticationdatabase=adminstart_time=`date +%s`mongorestore -u$user --host $host --port $port -p$password --authenticationDatabase $authenticationdatabase --oplogReplay /data/oplog_2023-07-17stop_time=`date +%s`duration=$((stop_time-start_time)) echo "Spend times: $duration seconds"
分别在源端和目标端运行脚本,检查迁移完成后业务数据库下文档数量是否一致。
#!/bin/bashuser=adminpassword=123host=127.0.0.1port=27017authenticationdatabase=adminmpid=`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 $databasedo 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" donedone
图片
图片
本文链接:http://www.28at.com/showinfo-26-34896-0.html一则 MongoDB 副本集迁移实操案例
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
下一篇: 六种常见负载均衡算法