如何备份大型MongoDB数据库

Mal*_*kim 16 replication mongodb backup

在 MongoDB 中备份大型数据集的推荐方法是什么?假设我们有大约 10TB 的数据大小 - 您将如何备份它?

我们正在考虑一个隐藏的、可能延迟的副本集节点。延迟将保护我们免受整个数据库的意外丢失。这是一个可行的解决方案,您还建议调查哪些其他选项?

谢谢!

Mar*_*erg 22

由于需要备份 10TB,这变得有点复杂。

副本不能替代适当的备份

虽然延迟副本集成员可以提供一种相对简单的方法来帮助您处理意外操作,但正确的备份没有替代品,就像 RAID 不能替代基于文件系统的备份一样。

建议

这在很大程度上取决于您的设置如何。

SAN 快照

对于 10TB,我假设您连接了某种 SAN。在这些环境中备份 MongoDB 的最简单方法是确保您在文件系统和 MongoDB 上都激活了日志记录,并简单地拍摄其中一个辅助节点的 SAN 卷的快照,可能是隐藏的一个以确保您的操作不不要被打扰。这通常只需要几秒钟,但请_确保_您的复制操作日志窗口足够。否则,您可能需要重新同步辅助节点。

不要使用 mongodump

我不得不不同意 RolandoMySQLDBA 关于 mongodump 的用法。首先,它对服务器施加了锁。尽管它们的解除速度相对较快,但锁定的数量可能会累加并干扰您的操作,除非在隐藏节点上运行或没有读取优先级命中辅助节点时。另外,它并不是很快。我希望它至少运行几个小时,很可能比您的备份窗口花费更长的时间。旁注:始终使用--oplog选项运行 mongodump. 还要记住,mongodump 不备份索引,而是创建索引的操作。这些索引必须在恢复期间重新创建,这可能会大大增加您需要的时间。根据我的经验,如果您必须恢复数据库,您希望尽快恢复。mongodump 不适合备份 10TB 的另一点。

LVM 快照注意事项

您可以在正在运行的 mongod 实例上执行 LVM 快照,前提是您在 mongod 中启用了日志功能(根据我的经验,在 FS 级别启用它也没有坏处)。但是,LVM 快照会带来一些影响。首先,您显然需要有足够的磁盘空间来在备份操作期间进行更改。让我澄清一下。

假设您的每小时变化率为 500GB。并且您希望在将备份上传到某个存储之前对其进行闪烁。即使在使用并行 bzip2 时,10TB 的压缩也需要几个小时才能完成,因为很可能您的海量存储吞吐量将成为您的限制因素。假设将数据压缩到 2TB 需要 2 小时。所以到现在为止,我们总共需要一些 2TB + 2*500GB 的可用磁盘空间,LVM 快照需要 1TB。这将至少需要过度配置您的文件系统30%。如果您想拥有适当的安全余量,这可以轻松增加到 60-70%(原始文件系统的利用率为 0.8 时为 20%,快照大小加上 bzipped 备份本身所需的空间相同) )。在大多数生产环境中,这是不可接受的,因为过度配置将是静态的(您不希望备份脚本与 LVM 动态冲突,是吗?)。

彩信备份

虽然 MMS 备份有一些很棒的功能(连续备份、轻松的时间点恢复),但它也有一些严重的缺点:大型部署的价格标签很容易达到数千。假设在这 10TB 上的每小时变化率为 500GB,对于云备份来说,这将是一个中等的六位数总和。每月。

我的建议是为您的服务器进行企业订阅,以便有资格拥有本地 MMS 实例,包括备份。

概括

以下是我会按照偏好的降序选择的选项。

  1. SAN 快照:易于实施,相对便宜
  2. 企业订阅:最佳功能。安装它,配置它,忘记它,它在你需要的时候就在那里
  3. LVM 快照:易于实施,但必要的超额配置成本可能会随着时间的推移而累积。


Rol*_*DBA 5

有两种选择

物理备份

如果您不介意停机时间,最简单的方法是

service mongod stop
Run Code Online (Sandbox Code Playgroud)

cp将Mongo数据文件夹做LVM快照或者暴力破解到另一个磁盘

service mongod start
Run Code Online (Sandbox Code Playgroud)

当然,如果 10TB 数据在独立机器上,您不希望停机。

延迟副本集

如果您有一个包含三个节点的副本集,请使用其中一个节点进行备份

{
        "_id" : "myreplica",
        "version" : 1,
        "members" : [
                {
                        "_id" : 1,
                        "host" : "10.20.30.40:27017",
                        "priority" : 2
                },
                {
                        "_id" : 2,
                        "host" : "10.20.30.41:27017"
                },
                {
                        "_id" : 3,
                        "host" : "10.20.30.42:27017",
                        "priority" : 0,
                        "slaveDelay" : 3600
                }
        ]
}
Run Code Online (Sandbox Code Playgroud)

将该节点与"_id' : 3您的所有物理备份一起使用。因此,没有停机时间。要获取午夜快照,您可以在凌晨 1:00 启动备份,因为隐藏节点落后 1 小时。

当然,缺点是需要另外两台各有 10TB 容量的服务器,这会危及系统管理员的理智。

蒙古包

您可以对独立机器使用 mongodump,但您必须预料到性能会下降,因为 mongodump 是一个客户端程序,它使用与任何其他连接一样的连接。

如果你想要时间点备份,你应该使用

mongodump --oplog 
Run Code Online (Sandbox Code Playgroud)

逻辑 BSON 备份将比物理备份更小(尤其是 gzipped 或 bzipped)。

使用mongodump --oplog最能对隐藏节点来完成。这样,Master 就不会受到性能影响。

免责声明

我对 MongoDB(偶然/偶然 MongoDBA)比较陌生。希望我的回答有帮助。

  • MongoDB 还有一项付费服务​​,可以备份数据并允许进行时间点恢复:https://mms.mongodb.com/signup/backup?pk_campaign=AdWords-Backup-Paid-5-14&pk_kwd=mongodb+backup&adpos =1t3&创意=45963339283&设备=c&matchtype=b&网络=g&gclid=CIOx0Mnx1MACFU4F7AodNEkAAg (2认同)