標籤:boost filesystem mongodb copy_file no such file or directory
650) this.width=650;" src="https://s2.51cto.com/wyfs02/M00/9C/36/wKioL1ltqUiiTzA6AAA5puBC1Ro224.png" title="3.png" alt="wKioL1ltqUiiTzA6AAA5puBC1Ro224.png" />
Percona MongoDB Hot Backup 測試及痛點前言
Part1:寫在最前
Percona MongoDB 支援Hot Backup,解決了MongoDB官方版本只能使用mongodump的情況。mongodump在小庫中還好,量上來後,備份恢複都是痛苦的。本文就MongoDB hot backup 備份中的一個bug進行複現和解決。
實戰
Part1:限制
在Percona MongoDB3.2.12版本之前,在進行物理熱備份時,如果設定檔中配置了
directoryPerDB: true
directoryForIndexes: true
這兩個參數的話,那麼在執行備份的時候會爆出錯誤:
[[email protected] bin]#./mongo 127.0.0.1:27020/adminMongoDB shellversion: 3.2.11-3.1 connecting to:127.0.0.1:27020/admin heleitest:PRIMARY>use adminswitched to db adminheleitest:PRIMARY>db.runCommand({createBackup: 1, backupDir: "/home/work/backup"}){ "ok" : 0, "errmsg" : "boost::filesystem::copy_file: No such file or directory:\"/home/mongodb/data/admin/collection/11-6714811575794894766.wt\",\"/home/work/backup/admin/collection/11-6714811575794894766.wt\""}
Part1:痛點
這個問題會很頭痛,比如生產庫中,MongoDB庫越來越大,促使我們計劃採用hot backup方案,由於起先的庫開啟了這個方式,那麼臨時的解決方案是什麼樣的呢?
It may be useful to simply let a secondary initial sync with those options off, then you could take a hot backup again to populate all the other nodes. This is not a solution but a path to get the production system back into a state you can use the backups. please note this assume production is built to best practices and is in a replica-set and not a stand alone mongod process.
意思是在我們MongoDB常規的複製集中,如果想要備份這個庫,那麼首先要下掉一個Secondary,清空資料目錄進行重新複製,這個過程會非常緩慢和複雜。如果僅僅是重啟資料庫的話,會起不來報錯,原因是已經開啟了多重路徑儲存資料和索引隔離儲存區 (Isolated Storage)這兩個選項,而現有版本的hotbackup是不支援這樣的備份方式的。
Part2:方案
好在Percona版本響應給力,在賀春暘老師提出該Bug後,官方在3.2.12-3.2版本便修正了這一問題,使得hot backup的痛點得以解決,例如,原先我需要重新對叢集進行關閉參數,匯出匯入資料,這無疑是一個巨大的工作量,同時會讓資料庫可靠性在不短的時間內都處於較低狀態。而現在,我們僅僅要做的就是升級資料庫,這一問題就能夠得到解決。
Part3:複現
[[email protected] bin]# ./mongo 127.0.0.1:27020/adminPercona Server for MongoDB shell version: 3.2.12-3.2connecting to: 127.0.0.1:27020/admin heleitest:PRIMARY> db.runCommand({createBackup: 1, backupDir: "/home/work/backup"}){ "ok" : 1 }
我這裡先對之前的3.2.11-3.1版本進行一個升級,如何升級MongoDB資料庫可參考:
http://suifu.blog.51cto.com/9167728/1947035
同時,設定檔中配置了
directoryPerDB: true
directoryForIndexes: true
可以看到,在3.2.12-3.2版本中,備份是沒有任何異常的。
Part4:校正
我們來看下3.4最新版是否也是正常的
[[email protected] bin]# ./mongo 127.0.0.1:27020/adminPercona Server for MongoDB shell version v3.4.4-1.4connecting to: mongodb://127.0.0.1:27020/adminPercona Server for MongoDB server version: v3.4.4-1.4heleitest:PRIMARY> db.runCommand({createBackup: 1, backupDir: "/home/work/backup"}){ "ok" : 1 }
可以看到,最新版也沒有問題。
Part5:Percona 官方升級日誌
#PSMDB-123: Fixed the creation of proper subdirectories inside the backup destination directory
賀春暘老師提交的jira
https://jira.percona.com/browse/PSMDB-123
——總結——
感謝賀春暘老師的bug提交,感謝Percona團隊高效的修複速率,開源,讓世界更美好~由於筆者的水平有限,編寫時間也很倉促,文中難免會出現一些錯誤或者不準確的地方,不妥之處懇請讀者批評指正。
本文出自 “賀磊的技術部落格” 部落格,請務必保留此出處http://suifu.blog.51cto.com/9167728/1948583
MongoDB Hot Backup 測試及痛點