使用文件系统快照备份和还原

在本页面

本文档介绍了使用系统级工具(例如LVM或存储设备)创建 MongoDB 系统备份的过程,以及相应的还原策略。

这些文件系统快照或“块级”备份方法使用系统级工具来创建保存 MongoDB 数据文件的设备的副本。这些方法可以快速完成并可靠地工作,但是需要在 MongoDB 之外进行其他系统配置。

在版本 3.2 中进行了更改:MongoDB 3.2 添加了对当WiredTiger存储引擎使用 MongoDB 实例的数据文件和日记文件位于单独的卷上时对 MongoDB 实例的卷级备份的支持。

在 MongoDB 3.2 之前,使用 WiredTiger 创建 MongoDB 实例的卷级备份要求数据文件和日志位于同一卷上。

Snapshots Overview

快照通过在实时数据和特殊快照卷之间创建指针来工作。这些指针在理论上等效于“硬链接”。当工作数据与快照不同时,快照过程将使用写时复制策略。因此,快照仅存储修改后的数据。

制作快照后,将快照映像安装在文件系统上并从快照中复制数据。生成的备份包含所有数据的完整副本。

Considerations

快照时的有效数据库

快照发生时,数据库必须有效。这意味着数据库所接受的所有写入都必须完全写入磁盘:journal或数据文件。

如果备份发生时磁盘上没有写的内容,则备份将不会反映这些更改。

对于MMAPv1 存储引擎,如果在进行备份时“正在进行”写操作,则数据文件将反映不一致的状态。使用journaling,可以恢复正在进行的写入操作导致的所有数据文件状态;如果没有日志记录,则必须在运行备份操作之前将所有未决的写入操作刷新到磁盘,并且必须确保在整个备份过程中不会发生任何写入操作。如果您确实使用日记功能,则日记 必须 与数据位于同一卷上。

对于WiredTiger 存储引擎,数据文件反映了从最后checkpoint开始的一致状态。每 2 GB 数据或每分钟都会出现一个检查点。

整个磁盘映像

快照会创建整个磁盘映像的映像。除非您需要备份整个系统,否则请考虑在一个不包含任何其他数据的逻辑磁盘上隔离 MongoDB 数据文件,日志(如果适用)和配置。

或者,将所有 MongoDB 数据文件存储在专用设备上,这样您就可以进行备份而不必复制多余的数据。

网站故障预防

确保将数据从快照复制到其他系统上。这样可以确保数据不会出现站点故障。

无增量备份

本教程不包括增量备份的过程。尽管不同的快照方法提供不同的功能,但下面概述的 LVM 方法不提供捕获增量备份的任何功能。

带有日记的快照

如果您的mongod实例启用了日记功能,则可以使用任何类型的文件系统或卷/块级快照工具来创建备份。

如果您在基于 Linux 的系统上 Management 自己的基础结构,请使用LVM配置系统以提供磁盘包并提供快照功能。您还可以云/虚拟环境中使用基于 LVM 的设置。

Note

运行LVM可以提供更大的灵 Active,并可以使用快照备份 MongoDB。

RAID 10 配置中的 Amazon EBS 快照

如果您的部署依赖于实例中配置了 RAID 的 Amazon 弹性块存储(EBS),则无法使用平台的快照工具在所有磁盘上获得一致的状态。或者,您可以执行以下任一操作:

  • 将所有写入刷新到磁盘并创建写锁定,以确保备份过程中状态的一致性。

如果选择此选项,请参见备份具有单独卷上的日记文件或没有日记的实例

  • 配置LVM以将 MongoDB 数据文件运行并保存在系统内的 RAID 之上。

如果选择此选项,请执行创建快照中描述的 LVM 备份操作。

在 Linux 上使用 LVM 备份和还原

本节概述了在 Linux 系统上使用LVM进行的简单备份过程。尽管您的系统上的工具,命令和路径可能(略有不同),但以下步骤提供了备份操作的高级概述。

Note

仅将以下过程用作备份系统和基础结构的准则。生产备份系统必须考虑许多特定于应用程序的需求和特定环境所特有的因素。

创建快照

在版本 3.2 中进行了更改:从 MongoDB 3.2 开始,出于使用 WiredTiger 进行 MongoDB 实例的卷级备份的目的,不再需要数据文件和日志位于单个卷上。

要使用LVM创建快照,请以 root 身份以以下格式发出命令:

lvcreate --size 100M --snapshot --name mdb-snap01 /dev/vg0/mongodb

此命令在vg0卷组中创建mongodb卷的mdb-snap01LVM快照(带有--snapshot选项)。

本示例创建位于/dev/vg0/mdb-snap01的名为mdb-snap01的快照。系统卷组和设备的位置和路径可能会略有不同,具体取决于 os 的LVM配置。

由于参数--size 100M,快照的上限为 100 MB。此大小并不反映磁盘上的数据总量,而是反映/dev/vg0/mongodb的当前状态与快照的创建(即/dev/vg0/mdb-snap01)之间的差异量。

Warning

确保创建的快照具有足够的空间以应对数据增长,尤其是将数据复制到系统外或复制到临时映像所花费的时间。

如果快照空间不足,则快照映像将无法使用。丢弃此逻辑卷并创建另一个。

该命令返回时,快照将存在。您可以随时直接从快照还原,也可以通过创建新的逻辑卷并将其从快照还原到备用映像进行还原。

尽管快照非常适合快速创建高质量的备份,但它们并不是存储备份数据的理想格式。快照通常依赖于并驻留在与原始磁盘映像相同的存储基础结构上。因此,存档这些快照并将其存储在其他位置至关重要。

存档快照

创建快照后,请安装快照并将数据复制到单独的存储中。当您将备份映像脱机时,系统可能会尝试压缩备份映像。或者,例如通过以下过程获取快照映像的块级副本:

umount /dev/vg0/mdb-snap01
dd if=/dev/vg0/mdb-snap01 | gzip > mdb-snap01.gz

上面的命令序列执行以下操作:

  • 确保未安装/dev/vg0/mdb-snap01设备。切勿对已安装的文件系统或文件系统快照进行块级复制。

  • 使用dd命令对整个快照映像执行块级复制,并将结果压缩到当前工作目录中的 zipfile 中。

Warning

此命令将在当前工作目录中创建一个较大的gz文件。确保在具有足够可用空间的文件系统中运行此命令。

还原快照

要恢复使用LVM创建的快照,请发出以下命令序列:

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

Warning

该卷的最大大小为 1 GB。原始文件系统的总大小必须为 1 GB 或更小,否则恢复将失败。

1G更改为所需的音量大小。

  • mdb-snap01.gz解压缩并取消存档到mdb-new磁盘映像中。

  • mdb-new磁盘映像安装到/srv/mongodb目录。修改安装点以对应于您的 MongoDB 数据文件位置,或根据需要的其他位置。

Note

恢复的快照将具有一个过时的mongod.lock文件。如果您不从快照中删除此文件,MongoDB 可能会认为该过时的锁定文件表示关闭异常。如果您在启用storage.journal.enabled的情况下运行,并且使用db.fsyncLock(),则无需删除mongod.lock文件。如果使用db.fsyncLock(),则需要删除锁。

直接从快照还原

要还原备份而不写入压缩的gz文件,请使用以下命令序列:

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

Note

  • 3.6 版的新功能:*

默认情况下,所有 MongoDB 集合都具有 UUID。当 MongoDB 还原集合时,还原的集合将保留其原始 UUID。还原不存在 UUID 的集合时,MongoDB 会为还原的集合生成一个 UUID。

有关集合 UUID 的更多信息,请参见Collections

远程备份存储

您可以使用combined process和 SSH 实施系统外备份。

此序列与上述过程相同,除了它使用 SSH 在远程系统上存档和压缩备份外。

请考虑以下过程:

umount /dev/vg0/mdb-snap01
dd if=/dev/vg0/mdb-snap01 | ssh username@example.com gzip > /opt/backup/mdb-snap01.gz
lvcreate --size 1G --name mdb-new vg0
ssh username@example.com gzip -d -c /opt/backup/mdb-snap01.gz | dd of=/dev/vg0/mdb-new
mount /dev/vg0/mdb-new /srv/mongodb

备份具有单独卷上的日记文件或没有日记的实例

在版本 3.2 中进行了更改:从 MongoDB 3.2 开始,出于使用 WiredTiger 进行 MongoDB 实例的卷级备份的目的,不再需要数据文件和日志位于单个卷上。

如果mongod实例运行时没有日志记录,或者日志文件位于单独的卷上,则必须将所有写操作刷新到磁盘并锁定数据库,以防止在备份过程中发生写操作。如果您具有replica set配置,则为备份使用secondary而不接收读取(即hidden member)。

刷新写入磁盘并锁定数据库,以防止进一步写入。

要刷新对磁盘的写入并“锁定”数据库,请在mongo shell 中发出db.fsyncLock()方法:

db.fsyncLock();

执行创建快照中描述的备份操作。

快照完成后,请解锁数据库。

要在快照完成后解锁数据库,请在mongo shell 中使用以下命令:

db.fsyncUnlock();