一則 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/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.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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章