新聞中心
1、全量邏輯備份/恢復(fù) Mongodump/Mongorestore
對(duì)于數(shù)據(jù)量比較小的場(chǎng)景,使用官方的mongodump/mongorestore工具進(jìn)行全量的備份和恢復(fù)就足夠了。mongodump可以連上一個(gè)正在服務(wù)的mongod節(jié)點(diǎn)進(jìn)行邏輯熱備份。其主要原理是遍歷所有集合,然后將文檔一條條讀出來(lái),支持并發(fā)dump多個(gè)集合,并且支持歸檔和壓縮,可以輸出到一個(gè)文件(或標(biāo)準(zhǔn)輸出)(對(duì)原理感興趣可以參見(jiàn)我之前寫的兩篇文章Mongodump的archive(歸檔)模式原理解析以及Mongorestore的archive(歸檔)模式恢復(fù)原理解析)。同樣,mongorestore則是連上一個(gè)正在服務(wù)的mongod節(jié)點(diǎn)進(jìn)行邏輯恢復(fù)。其主要原理是將備份出來(lái)的數(shù)據(jù)再一條條寫回到數(shù)據(jù)庫(kù)中。
對(duì)性能的影響
mongodump執(zhí)行過(guò)程由于會(huì)遍歷所有數(shù)據(jù),因此會(huì)對(duì)MongoDB性能有影響,最好在備節(jié)點(diǎn)執(zhí)行(最好是hidden,需檢查備節(jié)點(diǎn)數(shù)據(jù)同步是否正常)。
獲取一致的數(shù)據(jù)快照
在mongodump執(zhí)行過(guò)程中由于數(shù)據(jù)庫(kù)還有新的修改,直接運(yùn)行dump出來(lái)的結(jié)果不是一個(gè)一致的快照,需要使用一個(gè)『--oplog』的選項(xiàng)來(lái)將這個(gè)過(guò)程中的oplog也一塊dump下來(lái)(使用mongorestore進(jìn)行恢復(fù)時(shí)對(duì)應(yīng)要使用--oplogReplay選項(xiàng)對(duì)oplog進(jìn)行重放)。而由于MongoDB的oplog是一個(gè)固定大小的特殊集合,當(dāng)oplog集合達(dá)到配置的大小時(shí)舊的oplog會(huì)被滾掉以為新的oplog騰出空間。在使用『--oplog』選項(xiàng)進(jìn)行dump時(shí),mongodump會(huì)在dump集合數(shù)據(jù)前獲取當(dāng)時(shí)最新的oplog時(shí)間點(diǎn),并在集合數(shù)據(jù)dump完畢之后再次檢查這個(gè)時(shí)間點(diǎn)的oplog是否還在,如果dump過(guò)程很長(zhǎng),oplog空間又不夠,oplog被滾掉就會(huì)dump失敗。因此在dump前最好檢查一下oplog的配置大小以及目前oplog的增長(zhǎng)情況(可結(jié)合業(yè)務(wù)寫入量及oplog平均大小進(jìn)行粗略估計(jì)),確保dump不會(huì)失敗。目前我們阿里云MongoDB服務(wù)針對(duì)oplog做了彈性擴(kuò)縮容的優(yōu)化,能夠確保在邏輯備份過(guò)程中oplog不被滾掉,一定能夠備份成功。
索引的備份和恢復(fù)
對(duì)于集合數(shù)據(jù),mongodump出來(lái)的結(jié)果是一個(gè)個(gè)bson文件。而對(duì)于集合的索引,則是描述在一個(gè)metadata的json文件里,里面還包含創(chuàng)建集合時(shí)所使用的選項(xiàng)。在使用mongorestore進(jìn)行恢復(fù)時(shí),會(huì)在集合數(shù)據(jù)恢復(fù)完畢之后進(jìn)行對(duì)應(yīng)的索引創(chuàng)建。
2、全量物理備份/恢復(fù)
對(duì)于數(shù)據(jù)量很大的場(chǎng)景,如果使用mongodump/mongorestore進(jìn)行備份和恢復(fù),需要的時(shí)間可能會(huì)很長(zhǎng)。對(duì)于備份來(lái)說(shuō),最主要的問(wèn)題就是備份所需時(shí)間越長(zhǎng),oplog被滾掉的幾率就越大,備份失敗的幾率也就越大。而對(duì)于恢復(fù)來(lái)說(shuō),由于恢復(fù)過(guò)程還涉及到索引的創(chuàng)建,如果除了數(shù)據(jù)量大,還有很多索引,所需花費(fèi)的時(shí)間就更長(zhǎng)了。遇到像爐石這種數(shù)據(jù)災(zāi)難,恢復(fù)時(shí)間當(dāng)然是越短越好,畢竟在游戲行業(yè)分分鐘的流水都很可觀。這時(shí)候就需要物理備份出場(chǎng)了,物理備份,顧名思義就是通過(guò)物理拷貝數(shù)據(jù)文件實(shí)現(xiàn)備份。在恢復(fù)時(shí)可以直接使用物理備份拷貝出來(lái)的數(shù)據(jù)文件,直接啟動(dòng)mongod。物理備份大的好處是速度快,恢復(fù)時(shí)也不需要再建索引。
實(shí)施方法
物理備份通過(guò)拷貝數(shù)據(jù)文件來(lái)實(shí)現(xiàn),這要求所有被拷貝的數(shù)據(jù)文件必須是一個(gè)一致的數(shù)據(jù)快照。因此物理備份的實(shí)施方法和MongoDB采用的存儲(chǔ)引擎有關(guān),并且,根據(jù)是否配置MongoDB打開(kāi)了Journal,在實(shí)施的細(xì)節(jié)上會(huì)有一些不同,具體可參考官方文檔。不管使用何種存儲(chǔ)引擎,在3.2版本之后,都可以用以下方法實(shí)現(xiàn)物理備份:
通過(guò)mongoshell執(zhí)行以下命令以確保所有的寫操作都flush到磁盤并禁止新的寫入:
利用底層文件系統(tǒng)層或邏輯卷的快照功能對(duì)MongoDB的數(shù)據(jù)目錄做快照,或直接通過(guò)cp、scp、tar等命令拷貝數(shù)據(jù)目錄。
還是在剛才的mongoshell上(這里需要保證和剛剛是同一個(gè)連接),執(zhí)行以下命令以重新允許新的寫入:
由于執(zhí)行db.fsyncLock()會(huì)加數(shù)據(jù)庫(kù)的全局寫鎖,這時(shí)數(shù)據(jù)庫(kù)會(huì)處于一個(gè)不可訪問(wèn)的狀態(tài),因此物理備份最好也在備節(jié)點(diǎn)上執(zhí)行(最好是hidden,注意同樣需要確保物理備份完成之后節(jié)點(diǎn)的oplog能追上主節(jié)點(diǎn))。目前我們阿里云MongoDB團(tuán)隊(duì)已經(jīng)研發(fā)出了無(wú)需停寫服務(wù)的物理熱備份手段,相信很快就可以讓大家用上,盡請(qǐng)期待!
增量備份
MongoDB的增量備份可以通過(guò)持續(xù)抓取oplog來(lái)實(shí)現(xiàn),這個(gè)目前沒(méi)有現(xiàn)成的工具可以利用,需要自己代碼實(shí)現(xiàn)。抓取oplog主要的難題也和使用mongodump進(jìn)行全量備份一樣,需確保要抓取的oplog不被滾掉。目前我們阿里云MongoDB服務(wù)實(shí)現(xiàn)了自動(dòng)增量備份的功能,結(jié)合全量備份可以實(shí)現(xiàn)任意時(shí)間點(diǎn)恢復(fù)功能。
3、Sharding的備份/恢復(fù)
爐石是不分服的,因此它后面也有可能是使用分布式數(shù)據(jù)庫(kù)。對(duì)于分布式數(shù)據(jù)庫(kù)來(lái)說(shuō),備份和恢復(fù)比單機(jī)數(shù)據(jù)庫(kù)更加復(fù)雜。分布式數(shù)據(jù)庫(kù)包含多個(gè)節(jié)點(diǎn),并且通常包含不同角色的節(jié)點(diǎn)。以MongoDB的Sharding集群為例,它包含一個(gè)保存元數(shù)據(jù)的config server以及若干個(gè)保存數(shù)據(jù)的shard。其中最主要的元數(shù)據(jù)就是數(shù)據(jù)在shard之間的分布情況。對(duì)于多個(gè)節(jié)點(diǎn)的備份,其中一個(gè)難題是保證所有節(jié)點(diǎn)備份的數(shù)據(jù)是同一個(gè)時(shí)間點(diǎn)的,常規(guī)采用的手段是停止外部寫入后進(jìn)行備份,這在互聯(lián)網(wǎng)服務(wù)中顯然不可接受。退而求其次,可以在停止接受同步的備節(jié)點(diǎn)上進(jìn)行備份,這樣可以得到一個(gè)時(shí)間大致接近的備份。另外一個(gè)難題是各數(shù)據(jù)節(jié)點(diǎn)之間通常存在數(shù)據(jù)遷移,而數(shù)據(jù)遷移就涉及到起碼2個(gè)以上數(shù)據(jù)節(jié)點(diǎn)的數(shù)據(jù)修改以及元數(shù)據(jù)節(jié)點(diǎn)的數(shù)據(jù)修改,如果在備份過(guò)程中發(fā)生數(shù)據(jù)遷移,很難保證備份出來(lái)的數(shù)據(jù)和元數(shù)據(jù)是一個(gè)一致的狀態(tài)。因此通常在備份過(guò)程中需要關(guān)閉數(shù)據(jù)遷移。MongoDB官方的文檔指導(dǎo)步驟就是采用這個(gè)思路,先關(guān)閉負(fù)責(zé)數(shù)據(jù)遷移的balancer,然后依次在config server和各個(gè)shard的備節(jié)點(diǎn)上進(jìn)行備份。關(guān)閉數(shù)據(jù)遷移大的問(wèn)題是關(guān)閉期間集群無(wú)法實(shí)現(xiàn)數(shù)據(jù)均衡,除了會(huì)影響集群的訪問(wèn)性能外,還造成資源的浪費(fèi),這在數(shù)據(jù)量較大,所需備份時(shí)間較長(zhǎng)時(shí)可能造成比較大的影響。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
文章名稱:MongoDB備份恢復(fù)筆記-創(chuàng)新互聯(lián)
轉(zhuǎn)載來(lái)源:http://www.dlmjj.cn/article/hohsh.html