天天看點

從爐石傳說資料庫故障談談MongoDB的資料庫備份和恢複手段MongoDB資料庫備份手段阿裡雲MongoDB備份服務總結

從爐石傳說資料庫故障談談MongoDB的資料庫備份和恢複手段MongoDB資料庫備份手段阿裡雲MongoDB備份服務總結

<a href="/go/1/6?postion=1" target="_blank">雲資料庫 mongodb 版</a>

基于飛天分布式系統和高性能存儲,提供三節點副本集的高可用架構,容災切換,故障遷移完全透明化。并提供專業的資料庫線上擴容、備份復原、性能優化等解決方案。

<a href="/go/1/6?postion=1" target="_blank">了解更多</a>

從爐石傳說資料庫故障談談MongoDB的資料庫備份和恢複手段MongoDB資料庫備份手段阿裡雲MongoDB備份服務總結

看到這個消息,我的第一反應是重新翻出塵封已久的ipad,裝上爐石準備上線領補償。等等,作為一個資料庫行業從業人員,是不是還應該幹點什麼?恩,很有必要再重新審視一下我們的資料庫有沒有做好容災,否則,今天你看别人熱鬧,明天可能就别人看你熱鬧了。借此機會我想給大家普及一下mongodb資料庫的備份和恢複手段(當然爐石傳說應該不一定是使用mongodb作為資料庫),以幫助大家做好容災,過個好年。同時,我也為我們阿裡雲mongodb服務做下廣告,我們的mongodb服務擁有完善的自動備份/恢複功能,靈活的備份政策,好用的恢複到任意時間點功能。我們的備份存放了多份副本,可靠性達10個9,請大家放心使用!

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。實體備份最大的好處是速度快,恢複時也不需要再建索引。

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

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

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

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

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

針對這兩大難題,我們阿裡雲mongodb團隊研發了不需要停外部寫,并且無需關資料遷移的sharding備份手段,能夠實作『任意』時間點恢複,這個功能将伴随着即将推出的sharding形态一起推出,盡情期待!

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

從爐石傳說資料庫故障談談MongoDB的資料庫備份和恢複手段MongoDB資料庫備份手段阿裡雲MongoDB備份服務總結
從爐石傳說資料庫故障談談MongoDB的資料庫備份和恢複手段MongoDB資料庫備份手段阿裡雲MongoDB備份服務總結

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

說了這麼多,大家應該對mongodb的備份/恢複手段有了一個大概的認識。如果要圖省心,還是建議直接使用阿裡雲mongodb服務,我們有自動化的備份/恢複服務,靈活的備份政策,隻需點點滑鼠就能用上任意時間點恢複、實體熱備份、sharding備份/恢複這些黑科技,從此不再為資料庫容災發愁,業務你們做,鍋有我們來背,還等什麼呢,快來試用吧!

從爐石傳說資料庫故障談談MongoDB的資料庫備份和恢複手段MongoDB資料庫備份手段阿裡雲MongoDB備份服務總結