使用文件系统Atlas 备份快照备份和恢复自托管部署
本文档介绍使用系统级工具(例如 逻辑卷管理器(LVM)或存储设备)创建MongoDB独立运行服务器和副本集备份的过程,以及相应的恢复策略。 有关分分片的集群的信息,请参阅使用文件系统Atlas 备份快照备份自管理分片集群。
这些文件系统快照或“区块级”备份方法使用系统级工具来创建保存 MongoDB 数据文件的设备的副本。这些方法速度快且可靠,但需要 MongoDB 之外的其他系统配置。
快照概述
快照的工作原理是在实时数据和特殊快照卷之间创建指针。这些指针在理论上等同于“硬链接”。当工作数据偏离快照时,快照进程会使用写时复制策略。因此,快照仅存储修改后的数据。
创建快照后,将快照挂载到文件系统上,然后从快照中复制数据。生成的备份包含所有数据的完整副本。
Considerations
WiredTiger 存储引擎
当 MongoDB 实例的数据文件和日志文件位于不同的卷时,MongoDB 支持使用 WiredTiger 存储引擎进行卷级备份。但是在备份过程中,必须锁定数据库并暂停对数据库的所有写入操作,与确保备份的一致性。
加密存储引擎(仅限 MongoDB Enterprise)
对于使用 AES256-GCM
加密模式的加密存储引擎,AES256-GCM
要求每个进程使用带有密钥的唯一计数器块值。
对于使用 AES256-GCM
密码配置的加密存储引擎:
- 从热备份恢复
- 从 4.2 开始,如果从通过“热”备份(即
mongod
正在运行)获取的文件进行恢复,MongoDB 可以在启动时检测到“脏”密钥,并自动滚动更新数据库密钥以避免重用 IV(初始化向量)。
- 从冷备份恢复
不过,如果从通过“冷”备份(即
mongod
未运行)获取的文件进行恢复,MongoDB 无法在启动时检测到“脏”密钥,重用 IV 将导致机密性和完整性保证失效。从 4.2 版开始,为了避免从冷文件系统快照恢复后重用密钥,MongoDB 添加了一个新的命令行选项
--eseDatabaseKeyRollover
。使用--eseDatabaseKeyRollover
选项启动时,mongod
实例会滚动使用AES256-GCM
密码配置的数据库密钥并退出。
快照时的有效数据库
创建快照时数据库必须有效。这表示数据库接受的所有写入均需完全写入磁盘:写入日志或数据文件。
如果在创建备份时有写入操作不在磁盘上,该备份则不会反映这些更改。
对于WiredTiger 存储引擎,数据文件反映截至最后一个检查点的一致状态。 每 2 GB 数据或每分钟出现一个检查点。
整个磁盘映像
快照可创建整个磁盘映像的映像。除非需备份整个系统,否则请考虑将 MongoDB 数据文件、日志(如果适用)和配置隔离在一个不含其他数据的逻辑磁盘上。
或者将所有 MongoDB 数据文件存储在专用设备上,以便可以进行备份而无需复制无关数据。
站点故障预防措施
确保将快照中的数据复制到其他系统上。这可确保数据免受站点故障的影响。
无增量备份
本教程不包括增量备份过程。尽管不同的快照方法提供不同的功能,但下面概述的逻辑卷管理器方法不具备捕获增量备份的能力。
带日志功能的快照
如果 mongod
实例启用了日志功能,则您可以使用任何类型的文件系统或卷/块级快照工具来创建备份。
如果在基于 Linux 的系统上管理自己的基础设施,请使用逻辑卷管理器配置您的系统以提供磁盘包和快照功能。您还可以在云/虚拟化环境中使用基于逻辑卷管理器的设置。
注意
运行逻辑卷管理器可提高灵活性,并允许使用快照来备份 MongoDB。
通过采用 RAID 10 配置的 Amazon EBS 来创建快照
如果您的部署依赖于 Amazon 的 Elastic Block Storage (EBS),并在实例中配置了 RAID,则无法使用该平台的快照工具在所有磁盘上获得一致的状态。作为替代方案,您可执行下列操作之一:
将所有写入刷新到磁盘,并创建一个写入锁,以确保备份过程中的状态一致性。
如果您选择此选项,请参阅备份日志文件在单独的卷上或不包含日志记录的实例。
配置 LVM,以便在您系统内的 RAID 上运行并保存您的 MongoDB 数据文件。
如果您选择此选项,请执行创建快照中所述的逻辑卷管理器备份操作。
在 Linux 上使用逻辑卷管理器进行备份和恢复
本节概述了在 Linux 系统上使用逻辑卷管理器的简单备份过程。虽然系统上的工具、命令和路径可能(略有)不同,但以下步骤提供了备份操作的高级概述。
注意
使用以下过程作为备份系统和基础设施的指南。生产备份系统必须考虑许多特定于应用程序的要求和特定环境的特有因素。
有关分分片的集群的信息,请参阅使用文件系统Atlas 备份快照备份自管理分片集群。
创建快照
为了使用 WiredTiger 对 MongoDB 实例进行卷级备份,数据文件和日志不再需要位于同一卷上。
要使用逻辑卷管理器创建快照,请以 root 用户身份发出以下格式的命令:
lvcreate --size 100M --snapshot --name mdb-snap01 /dev/vg0/mongodb
该命令利用 --snapshot
选项创建 vg0
卷组中 mongodb
卷的逻辑卷管理器快照,名为 mdb-snap01
。
此示例创建位于名为 mdb-snap01
的快照,位于 /dev/vg0/mdb-snap01
。根据操作系统的逻辑卷管理器配置,系统卷组和设备的位置和路径可能略有不同。
由于参数 --size 100M
的原因,快照的上限为 100 MB。此大小并不反映磁盘上的数据总量,而是反映 /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
文件。请确保在具有足够可用空间的文件系统中运行该命令。
恢复快照
要恢复使用逻辑卷管理器创建的快照,请发出以下命令序列:
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 GB。原始文件系统的总大小必须不超过 1GB,否则恢复将失败。
将
1G
更改为所需的卷大小。将
mdb-snap01.gz
解压缩并取消存档到mdb-new
磁盘映像中。将
mdb-new
磁盘映像挂载到/srv/mongodb
目录。修改挂载点以对应于 MongoDB 数据文件位置,或根据需要的其他位置。
注意
恢复的快照将具有过时的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
注意
所有 MongoDB 集合默认都有 UUID。MongoDB 恢复集合时,恢复的集合保留其原始 UUID。恢复不存在 UUID 的集合时,MongoDB 会为恢复的集合生成一个 UUID。
有关集合 UUID 的更多信息,请参阅集合。
远程备份存储
可以使用该组合过程和 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();