在这种情况下,“适当地”是一个高度主观的术语。给你一个印象:
mongodump 和 mongorestore 的速度并不快。在分片环境中,对于大小合理的数据库,它们可能需要day (注意复数!)。这反过来意味着,在最坏的情况下,您可能会丢失数天的数据。此外,在备份过程中,数据可能会发生很大变化,因此您的备份状态可能会不一致。在这方面,最好将 mongodump 视为“mongodumb”。您的应用程序必须能够优雅地处理缺乏一致性的问题,这可能是开发过程中相当痛苦的事情。此外,较长的恢复时间会耗费金钱和(有时甚至更重要的)声誉。
我个人仅在两种情况下使用 mongodump:用于备份分片集群元数据(只有几 MB 大小)和用于(相对)便宜的数据,这些数据很容易通过其他方式重新获取。
为了正确地进行 MongoDB 备份,恕我直言,只有三个选择:
- MongoDB Inc 的云备份,
- MongoDB 运营经理
- 文件系统快照
它有几个优点。您可以进行时间点恢复,保证数据库处于与所选时间点相同的状态。它非常容易设置和维护。但是,您猜对了,它带有基于数据波动性和整体规模的价格标签,恕我直言,这对于具有中低波动性的中小型数据是合理的。
作为云备份的本地版本(它还有一些超出此答案范围的其他功能),它提供了相同的好处。它更适合于中大型数据库或具有不成比例的高波动性的数据库(如与数据大小相比较高的“OplogGb/h”值所示)。
文件系统快照
嗯,它有点便宜。只需制作快照,挂载它,将其复制到某个备份空间,卸载并销毁快照,还可以选择压缩复制的数据,然后就完成了。不过,有一些警告。
同步
要获得一致数据的备份,您需要在分片集群上同步快照。特别是因为分片集群元数据也需要与备份保持一致,如果您想要中途快速恢复。这可能会变得有点棘手。为了确保您的数据一致,您需要断开 all mongos
,停止平衡器,将数据同步到每个节点上的文件,制作快照,再次启动平衡器并重新启动 all mongos
。要正确同步,每次进行备份时都需要几分钟的维护窗口。
请注意,对于简单的副本集,不需要同步并且备份可以完美地工作。
过度配置
文件系统快照使用所谓的“写时复制”(CoW)。有点简化:当您制作快照并修改文件时,它会被复制并将更改应用于新复制的文件。然而,快照指向旧文件。很明显,为了能够制作快照,根据 CoW,您需要一些额外的磁盘空间,以便 MongoDB 可以在您处理快照时工作。让我们假设所有数据都更改的最坏情况——您需要为 MongoDB 过度配置分区至少 100% 的数据大小,或者换句话说,您的关键磁盘利用率将是 50 % 减去您需要放大的时间的某个阈值。当然,这有点夸张,但你明白了。
结论
恕我直言,应该以这种方式进行正确的备份:
- mongorestore 用于廉价数据,很少关注一致性
- 副本集的文件系统快照
- 用于具有中低波动性的中小型分片数据库的云备份
- 用于大型数据库或具有不成比例的高波动性的中小型数据库的 Ops Manager 备份
如前所述:在备份方面,“正确”是一个非常主观的术语。;)