本文档介绍使用系统级工具(如 LVM 或存储设备)来创建 MongoDB 独立服务器和副本集备份的过程,以及相应的恢复策略。有关分片集群的更多信息,请参阅使用文件系统快照备份分片集群。
这些文件系统快照或“区块级”备份方法使用系统级工具来创建保存 MongoDB 数据文件的设备的副本。这些方法速度快且可靠,但需要 MongoDB 之外的其他系统配置。
快照概述
快照的工作原理是在实时数据和特殊快照卷之间创建指针。这些指针在理论上等同于“硬链接”。当工作数据偏离快照时,快照进程会使用写时复制策略。因此,快照仅存储修改后的数据。
创建快照后,将快照挂载到文件系统上,然后从快照中复制数据。生成的备份包含所有数据的完整副本。
Considerations
WiredTiger 存储引擎
当 MongoDB 实例的数据文件和日志文件位于不同的卷时,MongoDB 支持使用 WiredTiger 存储引擎进行卷级备份。但是在备份过程中,必须锁定数据库并暂停对数据库的所有写入操作,与确保备份的一致性。
加密存储引擎(仅限 MongoDB Enterprise)
对于使用 AES256-GCM 加密模式的加密存储引擎,AES256-GCM 要求每个进程使用带有密钥的唯一计数器块值。
对于使用 AES256-GCM 密码配置的加密存储引擎:
- 从热备份恢复
- 如果在
mongod运行时从通过“热”备份获取的文件恢复, MongoDB会在初创企业时检测到“脏”键,并自动滚动数据库键以避免重复使用 IV(初始化向量)。
- 从冷备份恢复
但是,如果在
mongod未运行时从通过“冷”备份获取的文件恢复, MongoDB在初创企业时不会检测到“脏”密钥,并且重复使用 IV 会导致机密性和完整性ACID 一致性保证失效。为了避免从冷文件系统快照恢复后重复使用密钥, MongoDB添加了一个新的命令行选项
--eseDatabaseKeyRollover。使用--eseDatabaseKeyRollover选项启动时,mongod实例会滚动使用AES256-GCM密码配置的数据库密钥并退出。
快照时的有效数据库
创建快照时数据库必须有效。这表示数据库接受的所有写入均需完全写入磁盘:写入日志或数据文件。
如果在创建备份时有写入操作不在磁盘上,该备份则不会反映这些更改。
对于 WiredTiger 存储引擎,数据文件反映截至上一检查点的一致状态。每 2 GB 数据或每分钟出现一次检查点。
Stale Data
备份提供数据库当前状态的快照。从备份中恢复时,恢复的数据库不包括备份后所做的任何更改,这可能会导致数据丢失。
整个磁盘映像
快照可创建整个磁盘映像的映像。除非需备份整个系统,否则请考虑将 MongoDB 数据文件、日志(如果适用)和配置隔离在一个不含其他数据的逻辑磁盘上。
或者将所有 MongoDB 数据文件存储在专用设备上,以便可以进行备份而无需复制无关数据。
站点故障预防措施
确保将快照中的数据复制到其他系统上。这可确保数据免受站点故障的影响。
无增量备份
本教程不包括增量备份过程。尽管不同的快照方法提供不同的功能,但下面概述的逻辑卷管理器方法不具备捕获增量备份的能力。
Linux上的Atlas 备份快照
如果在基于 Linux 的系统上管理自己的基础设施,请使用逻辑卷管理器配置您的系统以提供磁盘包和快照功能。您还可以在云/虚拟化环境中使用基于逻辑卷管理器的设置。
注意
运行逻辑卷管理器可提高灵活性,并允许使用快照来备份 MongoDB。
通过采用 RAID 10 配置的 Amazon EBS 来创建快照
如果您的部署依赖于 Amazon 的 Elastic Block Storage (EBS),并在实例中配置了 RAID,则无法使用该平台的快照工具在所有磁盘上获得一致的状态。作为替代方案,您可执行下列操作之一:
将所有写入刷新到磁盘,并创建一个写入锁,以确保备份过程中的状态一致性。
If you choose this option see Back up Instances with Journal Files on Separate Volume or without Journaling.
配置 LVM,以便在您系统内的 RAID 上运行并保存您的 MongoDB 数据文件。
If you choose this option, perform the LVM backup operation described in Create a Snapshot.
在 Linux 上使用逻辑卷管理器进行备份和恢复
本节概述了在 Linux 系统上使用逻辑卷管理器的简单备份过程。虽然系统上的工具、命令和路径可能(略有)不同,但以下步骤提供了备份操作的高级概述。
注意
使用以下过程作为备份系统和基础设施的指南。生产备份系统必须考虑许多特定于应用程序的要求和特定环境的特有因素。
有关分片集群的更多信息,请参阅使用文件系统快照备份分片集群。
创建快照
为了使用 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 可能会认为过时的锁定文件指示异常关闭。如果使用 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 集合默认都有 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 实例在单独的卷上具有日志文件,则必须将所有写入刷新到磁盘并锁数据库以防止在备份进程中进行写入。如果您有副本集配置,则对于备份,请使用不接收读取的从节点(secondary node from replica set)(即隐藏节点)。
将写入刷新到磁盘并锁定数据库,从而防止后续写入。
To flush writes to disk and to "lock" the database, issue the db.fsyncLock() method in mongosh:
db.fsyncLock();
Perform the backup operation described in Create a Snapshot.
创建快照后,解锁数据库。
To unlock the database after you create the snapshot, use the following command in mongosh:
db.fsyncUnlock();