天天看點

MongoDB的資料庫如何備份和恢複?

mongodb資料庫備份手段

全量邏輯備份/恢複

mongodump/mongorestore

對性能的影響

mongodump執行過程由于會周遊所有資料,是以會對mongodb性能有影響,最好在備節點執行(最好是hidden,需檢查備節點資料同步是否正常)。

擷取一緻的資料快照

在mongodump執行過程中由于資料庫還有新的修改,直接運作dump出來的結果不是一個一緻的快照,需要使用一個『--oplog』的選項來将這個過程中的oplog也一塊dump下來(使用mongorestore進行恢複時對應要使用--oplogreplay選項對oplog進行重放)。而由于mongodb的oplog是一個固定大小的特殊集合,當oplog集合達到配置的大小時舊的oplog會被滾掉以為新的oplog騰出空間。在使用『--oplog』選項進行dump時,mongodump會在dump集合資料前擷取當時最新的oplog時間點,并在集合資料dump完畢之後再次檢查這個時間點的oplog是否還在,如果dump過程很長,oplog空間又不夠,oplog被滾掉就會dump失敗。是以在dump前最好檢查一下oplog的配置大小以及目前oplog的增長情況(可結合業務寫入量及oplog平均大小進行粗略估計),確定dump不會失敗。目前我們阿裡雲mongodb服務針對oplog做了彈性擴縮容的優化,能夠確定在邏輯備份過程中oplog不被滾掉,一定能夠備份成功。

索引的備份和恢複

對于集合資料,mongodump出來的結果是一個個bson檔案。而對于集合的索引,則是描述在一個metadata的json檔案裡,裡面還包含建立集合時所使用的選項。在使用mongorestore進行恢複時,會在集合資料恢複完畢之後進行對應的索引建立。

全量實體備份/恢複

對于資料量很大的場景,如果使用mongodump/mongorestore進行備份和恢複,需要的時間可能會很長。對于備份來說,最主要的問題就是備份所需時間越長,oplog被滾掉的幾率就越大,備份失敗的幾率也就越大。而對于恢複來說,由于恢複過程還涉及到索引的建立,如果除了資料量大,還有很多索引,所需花費的時間就更長了。遇到像爐石這種資料災難,恢複時間當然是越短越好,畢竟在遊戲行業分分鐘的流水都很可觀。這時候就需要實體備份出場了,實體備份,顧名思義就是通過實體拷貝資料檔案實作備份。在恢複時可以直接使用實體備份拷貝出來的資料檔案,直接啟動mongod。實體備份最大的好處是速度快,恢複時也不需要再建索引。

實施方法

1.    通過mongoshell執行以下指令以確定所有的寫操作都flush到磁盤并禁止新的寫入:

db.fsynclock();

2.    利用底層檔案系統層或邏輯卷的快照功能對mongodb的資料目錄做快照,或直接通過cp、scp、tar等指令拷貝資料目錄。

3.    還是在剛才的mongoshell上(這裡需要保證和剛剛是同一個連接配接),執行以下指令以重新允許新的寫入:

db.fsyncunlock();

由于執行db.fsynclock()會加資料庫的全局寫鎖,這時資料庫會處于一個不可通路的狀态,是以實體備份最好也在備節點上執行(最好是hidden,注意同樣需要確定實體備份完成之後節點的oplog能追上主節點)。目前我們阿裡雲mongodb團隊已經研發出了無需停寫服務的實體熱備份手段,相信很快就可以讓大家用上,盡請期待!

增量備份

mongodb的增量備份可以通過持續抓取oplog來實作,這個目前沒有現成的工具可以利用,需要自己代碼實作。抓取oplog主要的難題也和使用mongodump進行全量備份一樣,需確定要抓取的oplog不被滾掉。目前我們阿裡雲mongodb服務實作了自動增量備份的功能,結合全量備份可以實作任意時間點恢複功能。

sharding的備份/恢複

針對這兩大難題,阿裡雲雲資料庫mongodb團隊研發了不需要停外部寫,并且無需關資料遷移的sharding備份手段,能夠實作『任意』時間點恢複。

阿裡雲雲資料庫mongodb備份服務

阿裡雲雲資料庫mongodb服務提供自動備份/恢複功能,預設每天為資料進行全量備份,并且自動抓取oplog進行增量備份。使用者可以在控制台自定義備份政策以及進行恢複。

恢複時可以選擇某一個備份集或某一個時間點克隆出一個新的執行個體,可以在新執行個體上進行資料校驗,等校驗沒問題後切換到新執行個體。此外,全量備份的資料還提供下載下傳功能,使用者也可以選擇下載下傳備份集到本地後恢複到一個臨時執行個體進行資料校驗。

總結

以上資訊可以幫助大家對mongodb的備份/恢複手段有一個大概的認識。從省心的角度考慮,還是建議直接使用阿裡雲雲資料庫mongodb服務,我們有自動化的備份/恢複服務,靈活的備份政策,隻需點點滑鼠就能實作任意時間點恢複、實體熱備份、sharding備份/恢複,從此不再為資料庫容災發愁。