使用文件系统快照备份和还原自管理部署
本文档描述了使用系统级工具(如LVM 或存储设备)创建 MongoDB 单机服务器和副本集备份的流程,以及相应的恢复策略。有关分片集群的信息,请参阅 使用文件系统快照备份自管理的分片集群。
这些文件系统快照,或“块级”备份方法,使用系统级工具创建存储 MongoDB 数据文件的设备的副本。这些方法执行速度快,可靠性高,但需要在 MongoDB 之外进行额外的系统配置。
快照概述
快照通过在实时数据和特殊的快照卷之间创建指针来实现。这些指针在理论上是“硬链接”等价的。随着工作数据与快照的偏离,快照过程使用写时复制策略。因此,快照仅存储已修改的数据。
创建快照后,您将快照镜像挂载到文件系统,并从快照复制数据。生成的备份包含所有数据的完整副本。
注意事项
WiredTiger 存储引擎
当MongoDB实例的数据文件和日志文件位于不同的卷上时,MongoDB支持使用WiredTiger存储引擎进行卷级备份。然而,为了创建一个连贯的备份,数据库必须在备份过程中被锁定,并且必须暂停对数据库的所有写入操作。
加密存储引擎(仅限MongoDB企业版)
对于使用加密存储引擎的AES256-GCM
加密模式,AES256-GCM
要求每个进程使用与密钥关联的唯一计数器块值。
对于配置了AES256-GCM
密码的加密存储引擎
- 从热备份恢复
- 从4.2版本开始,如果您从通过“热备份”获取的文件(即
mongod
正在运行)中恢复,MongoDB可以在启动时检测到“脏”密钥,并自动将数据库密钥滚动以避免IV(初始化向量)重复使用。
- 从冷备份恢复
然而,如果您从通过“冷备份”获取的文件(即
mongod
未运行)中恢复,MongoDB无法在启动时检测到“脏”密钥,IV的重复使用会破坏机密性和完整性保证。从4.2版本开始,为了避免在从冷文件系统快照恢复后重复使用密钥,MongoDB添加了一个新的命令行选项
--eseDatabaseKeyRollover
。当使用--eseDatabaseKeyRollover
选项启动时,mongod
实例将滚动使用AES256-GCM
密码配置的数据库密钥并退出。
快照时的有效数据库
当快照发生时,数据库必须是有效的。这意味着数据库接受的所有写入都需要被完全写入磁盘:要么写入到日志,要么写入到数据文件。
如果在备份发生时,存在未写入磁盘的写操作,则备份不会反映这些更改。
对于WiredTiger存储引擎,数据文件反映了从最后一个检查点以来的一致状态。检查点每2GB数据或每分钟发生一次。
完整磁盘镜像
快照创建整个磁盘镜像。除非您需要备份整个系统,否则请考虑将MongoDB数据文件、日志(如果适用)和配置放在一个不包含其他数据的逻辑磁盘上。
或者,将所有MongoDB数据文件存储在专用设备上,以便您可以在不复制冗余数据的情况下进行备份。
站点故障预防
确保将快照中的数据复制到其他系统上。这确保数据免受站点故障的影响。
无增量备份
本教程不包含增量备份的步骤。虽然不同的快照方法提供了不同的功能,但以下概述的 LVM 方法不提供捕获增量备份的任何容量。
带日志记录的快照
如果你的 mongod
实例启用了日志记录,则可以使用任何类型的文件系统或卷/块级别的快照工具来创建备份。
如果你在基于 Linux 的系统上管理自己的基础设施,配置你的系统使用 LVM 来提供你的磁盘包并提供快照功能。你还可以在云/虚拟化环境中使用基于 LVM 的设置。
注意
运行 LVM 提供额外的灵活性,并使使用快照来备份 MongoDB 成为可能。
使用RAID 10配置的Amazon EBS快照
如果您的部署依赖于配置在实例内的RAID Amazon弹性块存储(EBS),则无法使用平台快照工具跨所有磁盘获得一致的状态。作为替代方案,您可以选择以下操作之一
刷新所有写入磁盘,并在备份过程中创建写入锁定以确保一致状态。
如果您选择此选项,请参阅在单独的卷或无日志记录的情况下备份实例.
配置LVM,在系统中的RAID之上运行并保持MongoDB数据文件。
如果您选择此选项,请执行创建快照。中描述的LVM备份操作。
在Linux上使用LVM进行备份和恢复
本节概述了在Linux系统上使用LVM的简单备份过程。虽然工具、命令和路径可能在您的系统上略有不同,但以下步骤提供了备份操作的概述。
注意
请仅将以下程序作为备份系统和基础设施的指南。生产备份系统必须考虑许多特定于应用程序的要求和特定环境的因素。
有关分片集群的信息,请参阅使用文件系统快照备份自管理分片集群。
创建快照
为了使用WiredTiger对MongoDB实例进行卷级别备份,数据文件和日志不再需要驻留在单个卷上。
要使用LVM创建快照,请以root用户身份执行以下格式的命令
lvcreate --size 100M --snapshot --name mdb-snap01 /dev/vg0/mongodb
该命令创建了一个名为mdb-snap01
的mongodb
卷的vg0
卷组的LVM快照(使用--snapshot
选项)。
此示例创建了一个名为mdb-snap01
的快照,位于/dev/vg0/mdb-snap01
。系统的卷组和设备的位置和路径可能因操作系统的LVM配置而略有不同。
由于设置了参数--size 100M
,快照的大小上限为100兆字节。这个大小并不反映磁盘上的数据总量,而是反映当前状态下的/dev/vg0/mongodb
与快照创建(即/dev/vg0/mdb-snap01
)之间的差异量。
注意
确保您创建的快照有足够的空间来容纳数据增长,尤其是复制数据到系统或临时镜像所需的时间。
如果您的快照空间不足,快照镜像将无法使用。丢弃此逻辑卷并创建另一个。
命令返回时,快照将存在。您可以在任何时候直接从快照恢复,或者通过创建新的逻辑卷并从该快照恢复到备用镜像。
虽然快照可以快速创建高质量的备份,但它们不适合作为存储备份数据的格式。快照通常依赖于与原始磁盘镜像相同的存储基础设施。因此,您必须将这些快照存档并存储在别处。
存档快照
在创建快照后,挂载快照并将数据复制到单独的存储中。系统可能会在将备份镜像离线移动时尝试压缩它们。或者,可以使用以下步骤对快照镜像进行块级复制。
umount /dev/vg0/mdb-snap01 dd if=/dev/vg0/mdb-snap01 | gzip > mdb-snap01.gz
上述命令序列执行以下操作:
确保
/dev/vg0/mdb-snap01
设备未挂载。永远不要对已挂载的文件系统或文件系统快照进行块级复制。使用
dd
命令对整个快照镜像进行块级复制,并将结果压缩成当前工作目录中的gzip文件。注意
此命令将在当前工作目录中创建一个大的
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
。注意
此卷的最大大小为1千兆字节。原始文件系统必须具有1千兆字节或更小的总大小,否则恢复将失败。
将
1G
更改为您希望的卷大小。将
mdb-snap01.gz
解压缩到mdb-new
磁盘镜像中。将
mdb-new
磁盘镜像挂载到/srv/mongodb
目录。修改挂载点以对应MongoDB数据文件的位置,或其他所需的位置。
注意
恢复的快照将有一个过期的mongod.lock
文件。如果您不从此快照中删除此文件,MongoDB可能会假定过期的锁文件表示不干净的关闭。如果您使用db.fsyncLock()
,则需要删除mongod.lock
文件。
从快照直接恢复
要在不写入压缩的 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
注意
所有 MongoDB 集合都有默认的UUIDs。当 MongoDB 恢复集合时,恢复的集合保留其原始 UUIDs。在恢复没有 UUID 的集合时,MongoDB 为恢复的集合生成一个 UUID。
有关集合 UUIDs 的更多信息,请参阅集合。
远程备份存储
您可以使用 联合过程 和 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
在单独的卷上或在无日志记录模式下备份包含日志文件的实例
为了使用WiredTiger进行MongoDB实例的卷级别备份,数据文件和日志不再需要存储在单个卷上。然而,在备份过程中,必须锁定数据库并暂停对数据库的所有写入,以确保备份的一致性。
如果您的mongod
实例在没有日志记录模式下运行或在单独的卷上有日志文件,您必须在备份过程中将所有写入刷新到磁盘并锁定数据库,以防止写入。如果您有一个副本集配置,那么对于备份,请使用不接收读取(即隐藏成员)的次要节点。
刷新写入到磁盘并锁定数据库以防止进一步写入。
要刷新写入到磁盘并“锁定”数据库,请在mongosh
中执行db.fsyncLock()
方法:
db.fsyncLock();
执行创建快照中描述的备份操作。
创建快照后,解锁数据库。
创建快照后解锁数据库,请在mongosh
:
db.fsyncUnlock();