基於檔案系統快照的備份恢復(mongo官方文件翻譯-4.0.0版本)
本文件描述使用系統級工具如LVM或儲存裝置的備份、恢復。
檔案系統快照,或“塊級”備份方法,使用系統級工具建立資料檔案的副本。這些方法速度快、可靠性高,但是需要額外的系統配置。
MongoDB 3.2增加的新特性:當MongoDB例項的資料檔案和journal日誌檔案在單獨的捲上時,WiredTiger儲存引擎支援卷級備份。但是,為建立滿足資料一致性的備份,必須鎖定資料庫,所有的寫操作都要掛起,直到備份完成。
MongoDB 3.2以前,建立卷級備份,要求資料檔案和journal日誌在同一個捲上。
Snapshots Overview
快照的工作原理是在實時資料和特定快照卷之間建立指標。當工作資料偏離快照時,快照過程使用copy-on-write策略。因此,快照只儲存修改後的資料。
建立快照之後,將快照映像掛載到檔案系統上,並從快照中複製資料。這樣生成的備份是一個包含所有資料的完整副本。
Considerations
Valid Database at the Time of Snapshot
當快照發生時,資料庫接受的所有寫入操作都需要完全寫入磁碟:要麼寫入journal日誌檔案,要麼寫入資料檔案。
如果某些修改沒有寫入磁碟,那麼生成的快照,不會包含這些修改。
對於 MMAPv1 儲存引擎,如果備份發生時,寫操作處於進行中的狀態,則備份的資料檔案將是不一致狀態。開啟了journal日誌,所有正在進行的寫操作產生的資料檔案狀態都是可恢復的;如果未開啟journal日誌,在執行備份操作之前,必須將所有的寫操作刷入磁碟,並且必須確保在整個備份過程中不發生寫操作。如果開啟了journal日誌,journal日誌必須和資料檔案在同一個捲上。
對於 WiredTiger 儲存引擎。資料檔案反映了最後一個檢查點的一致狀態。每2 GB或每分鐘,有一個檢查點。
Entire Disk Image
磁碟快照,是一個完整磁碟的映象。除非你想要備份整個系統,否則,應將mongo資料檔案、journal日誌檔案、配置檔案放到一個邏輯磁碟上,這個磁碟不包含其他的資料。或者,也可以將上述的 mongo 相關的檔案,儲存到一個專用的裝置上。
Site Failure Precaution
確保將資料從快照複製到其他系統。這確保了資料是安全的,不會出現站點故障。
(也就是說:備份資料不要放在生產環境的mongo伺服器上,避免當mongo出現故障時,備份資料也一併丟失了。)
No Incremental Backups
本文件,不包含建立增量備份的方法。
Snapshots With Journaling
如果啟用了journal日誌,那麼可以使用任何型別的檔案系統或卷/塊級快照工具來建立備份。
如果系統是Linux的,使用LVM,以提供disk package和快照功能。還可以在雲/虛擬化環境中使用LVM。
Snapshots with Amazon EBS in a RAID 10 Configuration
(略)
Back Up and Restore Using LVM on Linux
本節概述在Linux系統上使用LVM進行簡單備份的過程。
對於備份系統和基礎設施,僅使用以下步驟作為指導。生產備份系統必須考慮一些特定於應用程式的需求和特定環境特有的因素。
Create a Snapshot
從MongoDB 3.2開始,為了使用 WiredTiger 對 MongoDB 進行卷級備份,資料檔案和日誌不再需要放置在同個捲上。
要使用LVM建立快照,以root使用者,執行如下命令:
lvcreate --size 100M --snapshot --name mdb-snap01 /dev/vg0/mongodb
該命令在vg0卷組中建立一個名為 mdb-snap01 的快照。
本例建立的快照名為“mdb-snap01”,位於/dev/vg0/mdb-snap01。
由於引數--size 100M,快照的上限為100兆。這個大小並不反映磁碟上的資料總量,而是/dev/vg0/mongodb當前狀態與建立快照之間的差異量。
警告:
確保您建立的快照有足夠的空間來應對資料增長,特別是在將資料從系統中複製出來或複製到臨時映像所需的時間內。
如果快照空間不足,則快照映像將是不可用的。需要丟棄此邏輯卷,重新建立一個。
當命令返回時,快照就建立完成了。可以在任何時候直接從快照進行恢復,也可以通過建立新的邏輯卷並從該快照生成一個備用映像。
雖然對於快速建立高質量備份,快照非常有用,但它並不是儲存備份資料的理想格式。快照一般與原始資料,儲存在一起。因此,應該歸檔快照,並存儲到其他地方。
Archive a Snapshot
建立快照後,掛載快照並將資料拷貝到獨立儲存。
umount /dev/vg0/mdb-snap01
dd if=/dev/vg0/mdb-snap01 | gzip > mdb-snap01.gz
上述命令執行的操作:
- 確保沒有掛載/dev/vg0/mdb-snap01裝置。不要使用已掛載的檔案系統或檔案系統快照,進行塊級拷貝。
- 使用dd命令對整個快照映像執行塊級拷貝,並將結果壓縮,儲存到當前工作目錄。
警告:
上述命令會在當前目錄,建立一個很大的 gz 檔案,確保當前目錄下有足夠的空間。
Restore a Snapshot
要恢復快照,執行如下命令:
lvcreate --size 1G --name mdb-new vg0
gzip -d -c mdb-snap01.gz | dd of=/dev/vg0/mdb-new
mount /dev/vg0/mdb-new /srv/mongodb
上述命令執行的操作:
- 在/dev/vg0卷組中,建立一個名為mdb-new的新邏輯卷,路徑為/dev/vg0/mdb-new。注意:新卷的最大大小為1G,這個值應比原始資料大,否則恢復會失敗,根據你的實際情況,調整這個值的大小。
- 解壓、解檔mdb-snap01.gz檔案,到新建的邏輯卷 mdb-new中。
- 掛載 mdb-new 到 /srv/mongodb 目錄。具體要掛載到哪個目錄,根據實際配置的mongo資料檔案位置來定。
注意:
恢復的快照中,會包含一個mongod.lock檔案。如果不刪除這個檔案,mongo會認為這是由於上次的異常終止留下的檔案。如果你啟用了journal日誌,並且沒有使用db.fsyncLock(),那麼不需要刪除這個檔案。如果你使用了db.fsyncLock(),那麼需要手動刪除這個檔案。
Restore Directly from a Snapshot
如果備份檔案沒有進行壓縮,要恢復備份,可以使用如下命令:
umount /dev/vg0/mdb-snap01
lvcreate --size 1G --name mdb-new vg0
dd if=/dev/vg0/mdb-snap01 of=/dev/vg0/mdb-new
mount /dev/vg0/mdb-new /srv/mongodb
Remote Backup Storage
可以與SSH配合,實現遠端備份。
下面這個命令序列與上面解釋的過程相同,只是它使用SSH,將快照歸檔、壓縮到遠端的機器上。
umount /dev/vg0/mdb-snap01
dd if=/dev/vg0/mdb-snap01 | ssh [email protected] gzip > /opt/backup/mdb-snap01.gz
lvcreate --size 1G --name mdb-new vg0
ssh [email protected] gzip -d -c /opt/backup/mdb-snap01.gz | dd of=/dev/vg0/mdb-new
mount /dev/vg0/mdb-new /srv/mongodb
(可以只看第二條命令。這條命令是歸檔+壓縮,生成的gz檔案是在遠端伺服器上。之後,登入遠端伺服器,直接按上面章節描述的恢復過程,恢復mongo即可)
Back up Instances with Journal Files on Separate Volume or without Journaling
MongoDB 3.2開始,為了使用 WiredTiger 對MongoDB進行卷級備份,資料檔案和journal日誌不再需要駐留在單個捲上。但在備份過程中,必須鎖定資料庫,並暫停所有對資料庫的寫入,以確保備份的一致性。
如果沒有開啟journal日誌,或者journal日誌檔案在一個單獨的捲上(沒有和資料檔案在一起),則必須將所有寫入操作寫入磁碟,並鎖定資料庫,以防止在備份過程中寫入。
- 將所有寫入操作刷入磁碟,並且鎖定資料庫,以防止後續的寫入。在mongo shell中執行如下命令:
db.fsyncLock();
- 建立備份。詳見“Create a Snapshot”章節。
- 建立備份完成後,解除對資料庫的鎖定。在mongo shell中執行如下命令:
db.fsyncUnlock();