如何将 MongoDB 物理备份磁盘膨胀率降低 90% 的内核优化做到极致?

2026-10-10 09:333阅读0评论工具资源
  • 内容介绍
  • 文章标签
  • 相关推荐

凌晨三点,告警群里炸了。某款头部游戏的MongoDB物理备份又一次把COS存储账单拉爆,磁盘膨胀率飙到惊人的200%。运维同学在群里发了个崩溃的表情,我盯着监控曲线,手心全是汗。那种看着存储投入成本像坐火箭一样往上冲,却无能为力的感觉,各个做过TB级MongoDB的人都懂,摆烂。。

我们当时用的还是常规思路:WiredTiger迅速照+oplog回放。从理论上讲很完美,在实际应用中却是个坑。WiredTiger的checkpoint机制会把全部被标记为hidden的节点数据也一起打包进去, 加上oplog本身的冗余复制,备份文件比线上数据较大一倍简直是常态。更糟的是这种膨胀不是线性增较长,是指数级的噩梦。

腾讯云 NoSQL 技术之 MongoDB 篇:物理备份磁盘膨胀率减少 90% 的内核优化实践

先说痛点:hidden节点和checkpoint是双沉重绞肉机

WiredTiger为了保证一致性,在做物理备份时会冻结一个逻辑时间段点。当前这个时间段点上,全部集合的数据页都会被遍历,即使这一些页在业务上已经是寒冷数据、甚至即将被drop掉。hidden节点的存在本意是隔离客户端写入, KTV你。 可备份线程根本不管这一些,它照单全收。我亲眼见过一个游戏服迁移后遗留的空集合,这是因为一直没清理整洁,引起每次备份更多带出几十GB垃圾。

我血槽空了。 oplog又是另一个吞噬者。很更多人以为oplog只是增量日志, 但物理备份场景下为了保证恢复完整性,系统会把整个oplog区间也打包进去。对于写放较大严沉重的业务,这一部分体积能占到总备份量的30%以上。你辛辛苦苦做压缩,最终还是结果是压缩完还是较大,这是因为日志本身就是不可压缩的乱序较小块。

腾讯云MongoDB团队的那次彻夜攻坚

后来我们跟着腾讯云MongoDB内核团队的思路做了拆解。他们没有去改应用层,而是从内核往外打了一套组合拳。先来看是精细化释放checkpoint。传统方式做法是一次性dump整个数据文件, 崭新方案是在备份前对WiredTiger缓存做一次温和的flush,只保留活跃页,把那一些被标记为淘汰但还没真实正释放的文件句柄提前回收。当前这个操作听起来简洁,做起来要反复跟引擎源码死磕,生怕触发脏页丢失,哭笑不得。。

无语了... 第二步是跳过oplog备份。我们问过自己一个问题:物理迅速照已经保证了数据一致性,为哪些还要再带一份完整的oplog?答案是很更多时候不需要。通过旁路服务记录增量元数据,结合副本集自身的同步机制,能够在恢复时动态拉取缺失区间。这样一来备份包直接瘦身一较大截,而且恢复速度反而更迅速,这是因为更少了解压和回放的时间段。

实战效果让人炎热泪盈眶

这套优化链路在真实实线上验证后效果堪称暴力美学。原本200%的极端膨胀率,直接压到5%到10%以内。更多表场景整体膨胀率降较低90%,不是PPT数字,是真实实账单降下来了。备份耗时缩较短44%,COS存储投入成本减较低38.4%。对于TB级较大集群这意味着每月省下的钱够招一个较小团队,格局小了。。

我当时复盘时一直在想,为哪些同样的问题别人早就撞南墙了我们还在原地踩坑。其实核心在于对WiredTiger内部行为的不了解。很更多人把数据库当黑盒用,用完就跑。一旦遇到这种底层膨胀问题,就只能坚硬扛。当前回头看, 早一点去看引擎源码、去明白checkpoint和page eviction的关系,能省下无数个通宵。

落地要注意哪些,别较高兴太早

这套方案不是万能药。先来看需要内核级别的支持,不是社区版随便改改配置就能用。然后再看隐藏节点策略要配合业务较低峰期落实否则flush操作会抢IO, 吃瓜。 作用于在线查询。我们当时选了一个凌晨四点的窗口,先在较小集群灰度,再逐步扩散。每一步都盯着延迟指标,手心冒汗的那种焦虑感至今不容简单忘。

还有一个简单忽略的点,就是监控颗粒度要细。以前我们只看总磁盘采用量,当前必须要细化到集合级别、甚至page级别。只有看到哪些集合在偷偷膨胀,才能提前清理。较大文档场景尤其明显, 游戏行业的较大文档特征引起更崭新时产生较更多陈旧版本页,如果不及时compact,就是定时炸弹。

我深信... 说个题外话,最近有同事问我为哪些百度不收录我们的技术手段沉淀文章。我查了一下其实最主要是这是因为内容采集痕迹太沉重,外链指向杂乱,还有站点地图更崭新不及时。再加上原创度检测里较更多引用官方文档,引起权沉重被稀释。当前我们把每篇内核优化笔记都加上独家测试数据和现场复盘感受, 同时也控制关键词密度,避免堆砌MongoDB物理备份这种词,才缓慢缓慢被收录。这事提醒我,做技术手段分享也得像做性能优化一样,得讲究方法论,不能蛮干。

最后再来看的心情

往往.…. MongoDB物理备份磁盘膨胀当前这个问题,像一座无形的山压在运维肩上。你明明了解它存在却找不到合适的撬棍。从内核视角去明白WiredTiger, 从旁路服务角度沉重崭新设计增量策略,这条路走通之后那种豁然开朗的感觉真实的会上瘾。当前每当看到监控曲线平稳下来我都会默默松一口气。或许这就是技术手段人的浪漫吧,在冰寒冷的代码里找到温度,然后让别人的账单变薄一点,让自己的头发更多留一点。

凌晨三点,告警群里炸了。某款头部游戏的MongoDB物理备份又一次把COS存储账单拉爆,磁盘膨胀率飙到惊人的200%。运维同学在群里发了个崩溃的表情,我盯着监控曲线,手心全是汗。那种看着存储投入成本像坐火箭一样往上冲,却无能为力的感觉,各个做过TB级MongoDB的人都懂,摆烂。。

我们当时用的还是常规思路:WiredTiger迅速照+oplog回放。从理论上讲很完美,在实际应用中却是个坑。WiredTiger的checkpoint机制会把全部被标记为hidden的节点数据也一起打包进去, 加上oplog本身的冗余复制,备份文件比线上数据较大一倍简直是常态。更糟的是这种膨胀不是线性增较长,是指数级的噩梦。

腾讯云 NoSQL 技术之 MongoDB 篇:物理备份磁盘膨胀率减少 90% 的内核优化实践

先说痛点:hidden节点和checkpoint是双沉重绞肉机

WiredTiger为了保证一致性,在做物理备份时会冻结一个逻辑时间段点。当前这个时间段点上,全部集合的数据页都会被遍历,即使这一些页在业务上已经是寒冷数据、甚至即将被drop掉。hidden节点的存在本意是隔离客户端写入, KTV你。 可备份线程根本不管这一些,它照单全收。我亲眼见过一个游戏服迁移后遗留的空集合,这是因为一直没清理整洁,引起每次备份更多带出几十GB垃圾。

我血槽空了。 oplog又是另一个吞噬者。很更多人以为oplog只是增量日志, 但物理备份场景下为了保证恢复完整性,系统会把整个oplog区间也打包进去。对于写放较大严沉重的业务,这一部分体积能占到总备份量的30%以上。你辛辛苦苦做压缩,最终还是结果是压缩完还是较大,这是因为日志本身就是不可压缩的乱序较小块。

腾讯云MongoDB团队的那次彻夜攻坚

后来我们跟着腾讯云MongoDB内核团队的思路做了拆解。他们没有去改应用层,而是从内核往外打了一套组合拳。先来看是精细化释放checkpoint。传统方式做法是一次性dump整个数据文件, 崭新方案是在备份前对WiredTiger缓存做一次温和的flush,只保留活跃页,把那一些被标记为淘汰但还没真实正释放的文件句柄提前回收。当前这个操作听起来简洁,做起来要反复跟引擎源码死磕,生怕触发脏页丢失,哭笑不得。。

无语了... 第二步是跳过oplog备份。我们问过自己一个问题:物理迅速照已经保证了数据一致性,为哪些还要再带一份完整的oplog?答案是很更多时候不需要。通过旁路服务记录增量元数据,结合副本集自身的同步机制,能够在恢复时动态拉取缺失区间。这样一来备份包直接瘦身一较大截,而且恢复速度反而更迅速,这是因为更少了解压和回放的时间段。

实战效果让人炎热泪盈眶

这套优化链路在真实实线上验证后效果堪称暴力美学。原本200%的极端膨胀率,直接压到5%到10%以内。更多表场景整体膨胀率降较低90%,不是PPT数字,是真实实账单降下来了。备份耗时缩较短44%,COS存储投入成本减较低38.4%。对于TB级较大集群这意味着每月省下的钱够招一个较小团队,格局小了。。

我当时复盘时一直在想,为哪些同样的问题别人早就撞南墙了我们还在原地踩坑。其实核心在于对WiredTiger内部行为的不了解。很更多人把数据库当黑盒用,用完就跑。一旦遇到这种底层膨胀问题,就只能坚硬扛。当前回头看, 早一点去看引擎源码、去明白checkpoint和page eviction的关系,能省下无数个通宵。

落地要注意哪些,别较高兴太早

这套方案不是万能药。先来看需要内核级别的支持,不是社区版随便改改配置就能用。然后再看隐藏节点策略要配合业务较低峰期落实否则flush操作会抢IO, 吃瓜。 作用于在线查询。我们当时选了一个凌晨四点的窗口,先在较小集群灰度,再逐步扩散。每一步都盯着延迟指标,手心冒汗的那种焦虑感至今不容简单忘。

还有一个简单忽略的点,就是监控颗粒度要细。以前我们只看总磁盘采用量,当前必须要细化到集合级别、甚至page级别。只有看到哪些集合在偷偷膨胀,才能提前清理。较大文档场景尤其明显, 游戏行业的较大文档特征引起更崭新时产生较更多陈旧版本页,如果不及时compact,就是定时炸弹。

我深信... 说个题外话,最近有同事问我为哪些百度不收录我们的技术手段沉淀文章。我查了一下其实最主要是这是因为内容采集痕迹太沉重,外链指向杂乱,还有站点地图更崭新不及时。再加上原创度检测里较更多引用官方文档,引起权沉重被稀释。当前我们把每篇内核优化笔记都加上独家测试数据和现场复盘感受, 同时也控制关键词密度,避免堆砌MongoDB物理备份这种词,才缓慢缓慢被收录。这事提醒我,做技术手段分享也得像做性能优化一样,得讲究方法论,不能蛮干。

最后再来看的心情

往往.…. MongoDB物理备份磁盘膨胀当前这个问题,像一座无形的山压在运维肩上。你明明了解它存在却找不到合适的撬棍。从内核视角去明白WiredTiger, 从旁路服务角度沉重崭新设计增量策略,这条路走通之后那种豁然开朗的感觉真实的会上瘾。当前每当看到监控曲线平稳下来我都会默默松一口气。或许这就是技术手段人的浪漫吧,在冰寒冷的代码里找到温度,然后让别人的账单变薄一点,让自己的头发更多留一点。