申請域名需要多久seo鏈接優(yōu)化建議
文中詳細(xì)闡述了通過全量 + 增量 Oplog 的遷移方式,完成一套副本集 MongoDB 遷移的全過程。
作者:張然,DBA 數(shù)據(jù)庫技術(shù)愛好者~
愛可生開源社區(qū)出品,原創(chuàng)內(nèi)容未經(jīng)授權(quán)不得隨意使用,轉(zhuǎn)載請聯(lián)系小編并注明來源。
本文約 900 字,預(yù)計閱讀需要 3 分鐘。
背景介紹
客戶要將生產(chǎn)環(huán)境上一套副本集架構(gòu)的 MongoDB 進(jìn)行遷移,數(shù)據(jù)量 240GB 左右。經(jīng)過測試,全量備份耗時 3.5 小時,恢復(fù)耗時 4.5小時。
為了減少割接時間,采取全量 + 增量 Oplog 的遷移方式。提前一天進(jìn)行全備,割接當(dāng)天只需備份增量的 Oplog 恢復(fù)即可,可大幅減少割接窗口。
實(shí)操過程
查看 Oplog 信息
檢查并評估生產(chǎn)環(huán)境 Oplog 的產(chǎn)生信息,以防全量和增量備份期間產(chǎn)生的 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 的運(yùn)行中,產(chǎn)生了 10374.38MB 大小的 Oplog。
全量備份
全量備份并拷貝備份期間產(chǎn)生的 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"
全量恢復(fù)
利用全備進(jìn)行數(shù)據(jù)恢復(fù)。
#!/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"
提取增量備份開始的時間點(diǎn)
全備備份出來的 Oplog,可以利用 bsondump
工具將 bson 轉(zhuǎn)換為 json 格式,查看備份時間產(chǎn)生的最后的 Oplog 的時間戳,根據(jù)此時間戳來進(jìn)行增量的 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
文件,找出增量備份開始的時間點(diǎn)。
"ts": {"$timestamp": {"t": 1686669429,"i": 4}
},
增量備份
備份 Oplog(時間戳大于上一次全備結(jié)束時的時間)。
#!/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"
增量恢復(fù)
#!/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"
增量遷移后業(yè)務(wù)文檔數(shù)量對比
分別在源端和目標(biāo)端運(yùn)行腳本,檢查遷移完成后業(yè)務(wù)數(shù)據(jù)庫下文檔數(shù)量是否一致。
#!/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
源端運(yùn)行結(jié)果:
目標(biāo)端運(yùn)行結(jié)果:
注意事項(xiàng)
- 使用 secondary 備份時,在割接停止業(yè)務(wù)后,增量備份前,首先檢查下從庫與主庫的延時,確保主從沒有延時,防止備份出的數(shù)據(jù)和主庫不一致。
- 如果全備時指定了 gzip,在提取時間戳?xí)r要重命名
oplog.bson
為oplog.bson.gz
,然后解壓,再利用bsondump
工具解析 bson 文件,否則會報錯。
更多技術(shù)文章,請?jiān)L問:https://opensource.actionsky.com/
關(guān)于 SQLE
SQLE 是一款全方位的 SQL 質(zhì)量管理平臺,覆蓋開發(fā)至生產(chǎn)環(huán)境的 SQL 審核和管理。支持主流的開源、商業(yè)、國產(chǎn)數(shù)據(jù)庫,為開發(fā)和運(yùn)維提供流程自動化能力,提升上線效率,提高數(shù)據(jù)質(zhì)量。
SQLE 獲取
類型 | 地址 |
---|---|
版本庫 | https://github.com/actiontech/sqle |
文檔 | https://actiontech.github.io/sqle-docs/ |
發(fā)布信息 | https://github.com/actiontech/sqle/releases |
數(shù)據(jù)審核插件開發(fā)文檔 | https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse |